From 2398c7c0ec2c42c119f84e6f638f23686d5c5c24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 15:08:41 +0000 Subject: [PATCH 001/219] fix(deps): update spotify web-scripts monorepo packages to v15 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-e2c6a43.md | 8 ++++++ microsite/package.json | 2 +- microsite/yarn.lock | 10 +++---- package.json | 4 +-- packages/cli/package.json | 6 ++-- yarn.lock | 52 +++++++++++++++++----------------- 6 files changed, 45 insertions(+), 37 deletions(-) create mode 100644 .changeset/renovate-e2c6a43.md diff --git a/.changeset/renovate-e2c6a43.md b/.changeset/renovate-e2c6a43.md new file mode 100644 index 0000000000..b908fa03a8 --- /dev/null +++ b/.changeset/renovate-e2c6a43.md @@ -0,0 +1,8 @@ +--- +'@backstage/cli': patch +--- + +Updated dependency `@spotify/prettier-config` to `^15.0.0`. +Updated dependency `@spotify/eslint-config-base` to `^15.0.0`. +Updated dependency `@spotify/eslint-config-react` to `^15.0.0`. +Updated dependency `@spotify/eslint-config-typescript` to `^15.0.0`. diff --git a/microsite/package.json b/microsite/package.json index dadc06518d..d5efa8196b 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.1.1", - "@spotify/prettier-config": "^14.0.0", + "@spotify/prettier-config": "^15.0.0", "@tsconfig/docusaurus": "^2.0.0", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.18.0", diff --git a/microsite/yarn.lock b/microsite/yarn.lock index d687fa81e2..bce8e33ff1 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2532,12 +2532,12 @@ __metadata: languageName: node linkType: hard -"@spotify/prettier-config@npm:^14.0.0": - version: 14.1.3 - resolution: "@spotify/prettier-config@npm:14.1.3" +"@spotify/prettier-config@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/prettier-config@npm:15.0.0" peerDependencies: prettier: 2.x - checksum: 0c64ec0de9be5ae24a9b2a8f5c3af6c02306a47f54fffbd014852b00245fc939f3131eeeac8e906dfbb6aa86a5c0213b7f35623badad072979068f8cd69c316f + checksum: aa5ec5739427f9acdb9d62ae6c04f04a344898567239f7ee45c75c6205ebdffbc61747ea8de6e83baf0bc3785359967de4b7097a8723c4b4063ff57dc5cb6c44 languageName: node linkType: hard @@ -3855,7 +3855,7 @@ __metadata: "@docusaurus/module-type-aliases": ^3.1.1 "@docusaurus/plugin-client-redirects": ^3.1.1 "@docusaurus/preset-classic": ^3.1.1 - "@spotify/prettier-config": ^14.0.0 + "@spotify/prettier-config": ^15.0.0 "@swc/core": ^1.3.46 "@tsconfig/docusaurus": ^2.0.0 "@types/luxon": ^3.0.0 diff --git a/package.json b/package.json index 937ea4e19d..3367772f1a 100644 --- a/package.json +++ b/package.json @@ -103,8 +103,8 @@ "@changesets/cli": "^2.14.0", "@octokit/rest": "^19.0.3", "@playwright/test": "^1.32.3", - "@spotify/eslint-plugin": "^14.1.3", - "@spotify/prettier-config": "^14.0.0", + "@spotify/eslint-plugin": "^15.0.0", + "@spotify/prettier-config": "^15.0.0", "@techdocs/cli": "workspace:*", "@types/node": "^18.17.8", "@types/webpack": "^5.28.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 98f7b3bafb..27900350c0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,9 +50,9 @@ "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.0", "@rollup/plugin-yaml": "^4.0.0", - "@spotify/eslint-config-base": "^14.0.0", - "@spotify/eslint-config-react": "^14.0.0", - "@spotify/eslint-config-typescript": "^14.0.0", + "@spotify/eslint-config-base": "^15.0.0", + "@spotify/eslint-config-react": "^15.0.0", + "@spotify/eslint-config-typescript": "^15.0.0", "@sucrase/webpack-loader": "^2.0.0", "@svgr/core": "6.5.x", "@svgr/plugin-jsx": "6.5.x", diff --git a/yarn.lock b/yarn.lock index b308ba3147..bafe4f5946 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3585,9 +3585,9 @@ __metadata: "@rollup/plugin-json": ^6.0.0 "@rollup/plugin-node-resolve": ^15.0.0 "@rollup/plugin-yaml": ^4.0.0 - "@spotify/eslint-config-base": ^14.0.0 - "@spotify/eslint-config-react": ^14.0.0 - "@spotify/eslint-config-typescript": ^14.0.0 + "@spotify/eslint-config-base": ^15.0.0 + "@spotify/eslint-config-react": ^15.0.0 + "@spotify/eslint-config-typescript": ^15.0.0 "@sucrase/webpack-loader": ^2.0.0 "@svgr/core": 6.5.x "@svgr/plugin-jsx": 6.5.x @@ -16518,54 +16518,54 @@ __metadata: languageName: node linkType: hard -"@spotify/eslint-config-base@npm:^14.0.0": - version: 14.0.1 - resolution: "@spotify/eslint-config-base@npm:14.0.1" +"@spotify/eslint-config-base@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-config-base@npm:15.0.0" peerDependencies: eslint: ">=7.x" - checksum: 8893e7c903c07ede7f3a03b5b6af03b65d2f334615d30fecb527ce4d888970168b73dbaef43275f9ece9e7b0193e13e6807e506507b32bdde9b64000cc52c8b1 + checksum: 265a4d807b5236030466a3a8373f41e51a9b4939b450d47ed2cb4704485004a5d64b2f9e024e865b4f5eea61ab6bbe439442e4ca2ac06e52a3b5c7e94c2d6b27 languageName: node linkType: hard -"@spotify/eslint-config-react@npm:^14.0.0": - version: 14.0.1 - resolution: "@spotify/eslint-config-react@npm:14.0.1" +"@spotify/eslint-config-react@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-config-react@npm:15.0.0" peerDependencies: eslint: ">=8.x" eslint-plugin-jsx-a11y: 6.x eslint-plugin-react: ">=7.7.0 <8" eslint-plugin-react-hooks: ^4.0.0 - checksum: d8545c3c3967bb8b923bd55dad2c50b5e2eb6d716cd9dcbbfa32417c3a6e786537ee3263ebedae99bd45abe3378acb0879c9644a729820ea61dd5d9e45e55465 + checksum: 42e16f63d51b2230d2e4eba6524d2d9278d480827c5d2ab32f96253bafd4d8ceb87c37d8429601e36642ff30c86b92011ad4efd26c83db4037478ad118497cce languageName: node linkType: hard -"@spotify/eslint-config-typescript@npm:^14.0.0": - version: 14.0.1 - resolution: "@spotify/eslint-config-typescript@npm:14.0.1" +"@spotify/eslint-config-typescript@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-config-typescript@npm:15.0.0" peerDependencies: "@typescript-eslint/eslint-plugin": ">=5" "@typescript-eslint/parser": ">=5" eslint: ">=8.x" - checksum: faf3ab89880e626d388e9ae212dd3486d6f91ca4d079020066c22d44c3df215dc61439c4e65ef3fc4eb5c3ea9893d5b504a2d251694d7a333d8803991349535b + checksum: d30d07e1e2e0e18cc583a72ca74b5fdb80ee26e6529de26e1e85d1416ca5396c942efaccc2613287365c7ac3659378b0ba0cdda3df25c7e5cdbd7317f1cbe885 languageName: node linkType: hard -"@spotify/eslint-plugin@npm:^14.1.3": - version: 14.1.3 - resolution: "@spotify/eslint-plugin@npm:14.1.3" +"@spotify/eslint-plugin@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/eslint-plugin@npm:15.0.0" peerDependencies: "@typescript-eslint/parser": ^5.13.0 - eslint: ^8.10.0 - checksum: 788f5d9aab6f7b6c0ad7e414ebd5f4504f058f26a769dc4bcd0088dd8e6d9e5334965c8f6fffcf5b7ed52dbe25de0dc7bba403bcffa79b6d94c7ba3094757b5f + eslint: ">=8.x" + checksum: 899166abb108f1f53867729a35fb711d89dc70d5fc0a725a80386adb85805149008f7226262619044680264c64c0a8a0e9703059f64d0b390650bcae86727ed6 languageName: node linkType: hard -"@spotify/prettier-config@npm:^14.0.0": - version: 14.0.1 - resolution: "@spotify/prettier-config@npm:14.0.1" +"@spotify/prettier-config@npm:^15.0.0": + version: 15.0.0 + resolution: "@spotify/prettier-config@npm:15.0.0" peerDependencies: prettier: 2.x - checksum: 07fb33ff3bb4678ab3bfe2f6f5da2cfb366de427c544e94178f5f8c75b3708282f7ea1a4344404e4ad1bbc5b38fccfde10795528cdfe7f61a8afed62076f8fe9 + checksum: aa5ec5739427f9acdb9d62ae6c04f04a344898567239f7ee45c75c6205ebdffbc61747ea8de6e83baf0bc3785359967de4b7097a8723c4b4063ff57dc5cb6c44 languageName: node linkType: hard @@ -40973,8 +40973,8 @@ __metadata: "@manypkg/get-packages": ^1.1.3 "@octokit/rest": ^19.0.3 "@playwright/test": ^1.32.3 - "@spotify/eslint-plugin": ^14.1.3 - "@spotify/prettier-config": ^14.0.0 + "@spotify/eslint-plugin": ^15.0.0 + "@spotify/prettier-config": ^15.0.0 "@techdocs/cli": "workspace:*" "@types/node": ^18.17.8 "@types/webpack": ^5.28.0 From dc29ab24111afc06aa443d703ac807e2fccef25e Mon Sep 17 00:00:00 2001 From: Severin Wischmann Date: Mon, 26 Feb 2024 16:47:44 +0100 Subject: [PATCH 002/219] Fix for atlassian OAuth flow Signed-off-by: Severin Wischmann --- .../src/authenticator.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts b/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts index 3e5ed50246..6f3309a4ab 100644 --- a/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { Strategy as AtlassianStrategy } from 'passport-atlassian-oauth2'; import { createOAuthAuthenticator, PassportOAuthAuthenticatorHelper, PassportOAuthDoneCallback, PassportProfile, } from '@backstage/plugin-auth-node'; +import { Strategy as AtlassianStrategy } from 'passport-atlassian-oauth2'; /** @public */ export const atlassianAuthenticator = createOAuthAuthenticator({ @@ -30,7 +30,7 @@ export const atlassianAuthenticator = createOAuthAuthenticator({ const clientId = config.getString('clientId'); const clientSecret = config.getString('clientSecret'); const baseUrl = - config.getOptionalString('audience') || 'https://atlassian.com'; + config.getOptionalString('audience') || 'https://api.atlassian.com'; return PassportOAuthAuthenticatorHelper.from( new AtlassianStrategy( @@ -39,7 +39,7 @@ export const atlassianAuthenticator = createOAuthAuthenticator({ clientSecret: clientSecret, callbackURL: callbackUrl, baseURL: baseUrl, - authorizationURL: `${baseUrl}/oauth/authorize`, + authorizationURL: `${baseUrl}/authorize`, tokenURL: `${baseUrl}/oauth/token`, profileURL: `${baseUrl}/api/v4/user`, }, From c51118640dcba4d52ab17e65b3fb74836ccd282b Mon Sep 17 00:00:00 2001 From: Severin Wischmann Date: Mon, 26 Feb 2024 19:11:41 +0100 Subject: [PATCH 003/219] Added changeset Signed-off-by: Severin Wischmann --- .changeset/stale-bags-hug.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stale-bags-hug.md diff --git a/.changeset/stale-bags-hug.md b/.changeset/stale-bags-hug.md new file mode 100644 index 0000000000..6929180596 --- /dev/null +++ b/.changeset/stale-bags-hug.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-atlassian-provider': patch +--- + +Addressed OAuth flow issue in Atlassian auth module From b3f53fa1c78ccfb0dafb922a549f173d2c168c63 Mon Sep 17 00:00:00 2001 From: Severin Wischmann Date: Mon, 26 Feb 2024 21:13:05 +0100 Subject: [PATCH 004/219] Updated module tests Signed-off-by: Severin Wischmann --- .../src/module.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/auth-backend-module-atlassian-provider/src/module.test.ts b/plugins/auth-backend-module-atlassian-provider/src/module.test.ts index 8d02b0b7a5..0b50dc1371 100644 --- a/plugins/auth-backend-module-atlassian-provider/src/module.test.ts +++ b/plugins/auth-backend-module-atlassian-provider/src/module.test.ts @@ -15,9 +15,9 @@ */ import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; -import { authModuleAtlassianProvider } from './module'; -import request from 'supertest'; import { decodeOAuthState } from '@backstage/plugin-auth-node'; +import request from 'supertest'; +import { authModuleAtlassianProvider } from './module'; describe('authModuleAtlassianProvider', () => { it('should start', async () => { @@ -60,8 +60,8 @@ describe('authModuleAtlassianProvider', () => { expect(nonceCookie).toBeDefined(); const startUrl = new URL(res.get('location')); - expect(startUrl.origin).toBe('https://atlassian.com'); - expect(startUrl.pathname).toBe('/oauth/authorize'); + expect(startUrl.origin).toBe('https://api.atlassian.com'); + expect(startUrl.pathname).toBe('/authorize'); expect(Object.fromEntries(startUrl.searchParams)).toEqual({ response_type: 'code', client_id: 'my-client-id', From e237b86431e7f1d5f4126b3ecb53f0836e1e1a8f Mon Sep 17 00:00:00 2001 From: Lin Sun Date: Wed, 28 Feb 2024 11:42:12 -0500 Subject: [PATCH 005/219] add solo as partner Signed-off-by: Lin Sun --- microsite/src/pages/community/index.tsx | 5 +++++ microsite/static/img/partner-logo-solo.png | Bin 0 -> 46993 bytes 2 files changed, 5 insertions(+) create mode 100644 microsite/static/img/partner-logo-solo.png diff --git a/microsite/src/pages/community/index.tsx b/microsite/src/pages/community/index.tsx index 42c42ae0c3..4090d6ad9f 100644 --- a/microsite/src/pages/community/index.tsx +++ b/microsite/src/pages/community/index.tsx @@ -81,6 +81,11 @@ const Community = () => { url: 'https://roadie.io/', logo: 'img/partner-logo-roadie.png', }, + { + name: 'solo.io', + url: 'https://solo.io/', + logo: 'img/partner-logo-solo.png', + }, { name: 'ThoughtWorks', url: 'https://www.thoughtworks.com', diff --git a/microsite/static/img/partner-logo-solo.png b/microsite/static/img/partner-logo-solo.png new file mode 100644 index 0000000000000000000000000000000000000000..7d26b976f414c95c101cd871a180828804e5ad84 GIT binary patch literal 46993 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

hMdPW(RuJ3NhN+ z*Y?r-K5Sx$dI@IsDS}sksVp5^JYRKxf2?sr$s# z^QakQ*$^bWLlGwp=?qYm)WZa&3`1#Ox(0Lfxp2XEXzpYzIKjjAzn#?72fsSv1Q3xC zQhH3pcFpUQP?G(zv**p@FxNClAm-55o^J zG1hyioB$TkMN!J65(Mu9{H5v(*_Yi))y6WY9nBJPB7(3{df2JGhzL79tn27||64u#`#f&2U3d@uK;XM^c@dNGrr59%AjXNSy@ zvM5cN6Z&#@0eu9U2r#qlhP0RJw^_51k8PM#v5a^9-a6qr6Ce>)3P_aJt4s{V<@P;w z+?HxpG0giW|FR{Q;Gqa~P@Qmt32@_L= zsAGV);MH*iJL%pFDk#Z>D#5I%zG&RuUzmM;%^12U^+EZB`Z#^{g9n$>zP9__pgdmF NXkRx_FITgE^glA78+HHy literal 0 HcmV?d00001 From 10268db7254b5769e669de0ce883d765c9d39ab8 Mon Sep 17 00:00:00 2001 From: Severin Wischmann Date: Fri, 1 Mar 2024 10:44:42 +0100 Subject: [PATCH 006/219] Removed unused config value The config value `audience` was used to set the baseUrl which has a static value. The audience parameter is static in the used library. Therefore, the reading of the config value was removed. Signed-off-by: Severin Wischmann --- .../src/authenticator.ts | 3 +-- .../src/module.test.ts | 2 +- plugins/auth-backend/src/providers/atlassian/provider.ts | 8 ++++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts b/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts index 6f3309a4ab..340c61052c 100644 --- a/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-atlassian-provider/src/authenticator.ts @@ -29,8 +29,7 @@ export const atlassianAuthenticator = createOAuthAuthenticator({ initialize({ callbackUrl, config }) { const clientId = config.getString('clientId'); const clientSecret = config.getString('clientSecret'); - const baseUrl = - config.getOptionalString('audience') || 'https://api.atlassian.com'; + const baseUrl = 'https://auth.atlassian.com'; return PassportOAuthAuthenticatorHelper.from( new AtlassianStrategy( diff --git a/plugins/auth-backend-module-atlassian-provider/src/module.test.ts b/plugins/auth-backend-module-atlassian-provider/src/module.test.ts index 0b50dc1371..024a45d43d 100644 --- a/plugins/auth-backend-module-atlassian-provider/src/module.test.ts +++ b/plugins/auth-backend-module-atlassian-provider/src/module.test.ts @@ -60,7 +60,7 @@ describe('authModuleAtlassianProvider', () => { expect(nonceCookie).toBeDefined(); const startUrl = new URL(res.get('location')); - expect(startUrl.origin).toBe('https://api.atlassian.com'); + expect(startUrl.origin).toBe('https://auth.atlassian.com'); expect(startUrl.pathname).toBe('/authorize'); expect(Object.fromEntries(startUrl.searchParams)).toEqual({ response_type: 'code', diff --git a/plugins/auth-backend/src/providers/atlassian/provider.ts b/plugins/auth-backend/src/providers/atlassian/provider.ts index 0cd95e19d7..22db26fd85 100644 --- a/plugins/auth-backend/src/providers/atlassian/provider.ts +++ b/plugins/auth-backend/src/providers/atlassian/provider.ts @@ -14,9 +14,7 @@ * limitations under the License. */ -import { AuthHandler } from '../types'; -import { OAuthResult } from '../../lib/oauth'; -import { createAuthProviderIntegration } from '../createAuthProviderIntegration'; +import { atlassianAuthenticator } from '@backstage/plugin-auth-backend-module-atlassian-provider'; import { SignInResolver, createOAuthProviderFactory, @@ -25,7 +23,9 @@ import { adaptLegacyOAuthHandler, adaptLegacyOAuthSignInResolver, } from '../../lib/legacy'; -import { atlassianAuthenticator } from '@backstage/plugin-auth-backend-module-atlassian-provider'; +import { OAuthResult } from '../../lib/oauth'; +import { createAuthProviderIntegration } from '../createAuthProviderIntegration'; +import { AuthHandler } from '../types'; /** * Auth provider integration for Atlassian auth From 70f0ad2dc3b86a1953b3746e0b23ffa7e0c623c9 Mon Sep 17 00:00:00 2001 From: Marek Libra Date: Mon, 4 Mar 2024 11:47:47 +0100 Subject: [PATCH 007/219] chore: update the Notifications BEP for broadcasted messages Signed-off-by: Marek Libra --- beps/0001-notifications-system/README.md | 32 +++++++++++++++++++----- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/beps/0001-notifications-system/README.md b/beps/0001-notifications-system/README.md index e071b36a06..66e23542dc 100644 --- a/beps/0001-notifications-system/README.md +++ b/beps/0001-notifications-system/README.md @@ -95,6 +95,7 @@ The role of the notifications plugin is to manage the lifecycle of notifications The notification backend stores notification using the [database service](https://backstage.io/docs/backend-system/core-services/index#database). In particular it needs to store the following information for each notification: - ID +- Recipients - Read date - Saved status - Creation date @@ -105,7 +106,6 @@ The notification backend stores notification using the [database service](https: - Origin - Link (optional) - Additional links (optional) - - Recipients - Severity (optional, default normal) - Topic (optional) - Scope (optional) @@ -153,7 +153,9 @@ The `notification-backend` does not provide any new permissions, since creating The `notification-backend` shall provide necessary parameters for paging and filtering notifications from the frontend. -The notification frontend plugin provides a UI for viewing notifications, which in the initial implementation can be as simple as needed. The only requirement is that a user is able to view recent notifications and distinguish between read and unread notifications. A notification as marked as read once it has been interacted with. The frontend plugin also subscribes to the notifications signal channel and alerts the user when a new notification is received. +The notification frontend plugin provides a UI for viewing notifications, which in the initial implementation can be as simple as needed. The only requirement is that a user is able to view recent notifications and distinguish between read and unread notifications. The frontend plugin also subscribes to the notifications signal channel and alerts the user when a new notification is received. + +Both the individual and broadcasted messages are rendered together in a single list. There will be a filter choosing of of those types or `all`. ### Architecture Overview @@ -165,11 +167,12 @@ The components that are presented with dashed lines are not directly part of thi Let's walk through the process of sending of a notification to a user: -1. A backend plugin that wants to send a notification to a user uses the `NotificationService`, which in turn makes a POST request to the notification backend. The request contains a filter to select the target users, as well as the notification payload. +1. A backend plugin that wants to send a notification to a user uses the `NotificationService`, which in turn makes a POST request to the notification backend. The request contains either a filter to select the target users or type `broadcast`, as well as the notification payload. 1b. As the notification backend handles the request it could optionally invoke a series of notification processors. These processors can be used to transform the notification payload, send the notification through other channels, and decide whether the regular notification flow should continue or not. This step is not in scope for this proposal. 2. The notification backend stores the received notification in its database. At this point the notification is available from the notification backend's read API. + 3. The notification backend published an event to the event bus on the `'signal'` topic. This event payload contains the signaling channel, in this case `'notifications'`, as well as the target user ID and the notification ID, but not the notification payload. 4. Each instance of the signal backend plugin subscribes to the `'signal'` topic and receives the event. 5. Each signal backend instance has a set of push channels set up to online users. The incoming event is filtered based on the target user ID and the signaling is pushed through all connections with a matching user ID. @@ -214,6 +217,7 @@ export type NotificationPayload = { export type Notification = { id: string; userRef: string; + broadcasted: boolean; created: Date; saved?: Date; read?: Date; @@ -232,12 +236,29 @@ interface NotificationService { } ``` -Each notification is always routed to individual users unless it's a broadcast. The `notification-backend` will figure out which users will receive a notification based on the `recipients` parameter, resolving it to the concrete list of users at the time of sending the notification. - Each notification contains a human readable `title`, `origin` and optionally `link` for additional details. The `created`, `id`, `read` and `saved` properties are handled by the backend based and cannot be passed during the notification creation. Calling `sendNotification` should never throw an error so that it doesn't block the current processing. Notifications should be considered as second-level citizens that are not critical if not delivered. +Each notification is always routed to individual users unless its type is `broadcast`. + +##### Individual user notifications + +The `notification-backend` will figure out which users will receive a notification based on the `recipients` parameter, resolving it to the concrete list of users at the time of sending the notification. + +##### Broadcasted notifications + +Broadcasted messages are stored in a separate database table for performance reasons and simplicity of queries. +There is only one record per message. + +To maintain flags, there will be another table with 1:N relation. This table will contain `user`, `read`, `saved` and `updated` columns, linked via message ID foreign-key. +This table of flags is not prefilled on a broadcast message creation but a record is added when there is an updating POST by a particular user. + +When notifications are queried, two (main) database queries are issued - for both the individual and broadcasted messages. +Their results are merged into a single response but setting the `broadcasted` flag based on source. + +If an individual message is queried (via GET `/notifications/:id`), both the individual and broadcasted tables are searched. The first result found is used for the response. + #### `SignalService` ```ts @@ -269,7 +290,6 @@ Example signal payload for a new notification: #### Future considerations and BEP TODO -- Broadcast messages are to be saved to a separate table for performance reasons - OpenAPI tooling is taken into use for the notification router and client - Allow using dynamic values in notification payload, for example entity references `{{ user:default/john.doe }}` should be rendered by the frontend with `EntityRefLink` component. Defining the dynamic data values should be done before implementation. - Add configurable automatic clean-up of old notifications to save storage space From 98b10863e0f64fab21b4fd4d8df90fda453f42db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 13:32:04 +0000 Subject: [PATCH 008/219] chore(deps): update dependency @types/rollup-plugin-peer-deps-external to v2.2.5 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index eb05400306..e464115b9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19804,12 +19804,11 @@ __metadata: linkType: hard "@types/rollup-plugin-peer-deps-external@npm:^2.2.0": - version: 2.2.4 - resolution: "@types/rollup-plugin-peer-deps-external@npm:2.2.4" + version: 2.2.5 + resolution: "@types/rollup-plugin-peer-deps-external@npm:2.2.5" dependencies: - "@types/node": "*" rollup: ^0.63.4 - checksum: 215849a0ae0f5bd4aec0ae2c1f05defaca1a88013b1c89ebfd207a4732799b970b0aaf7d3fe1797548f08c972e1bd028352d3193d00cb570d58cd86fd4da9447 + checksum: 3f0d130fc15c80eac737391e180e77597da1200ff1f6d28a44f785a0de7f29144df805ab5b020ba38b243af6959e9da0757efa4141c4e737cd04eebe50f59c07 languageName: node linkType: hard From 52006d04f03d0895e82f11416138a5bfe38bb16a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 00:07:50 +0000 Subject: [PATCH 009/219] Update dependency @roadiehq/backstage-plugin-travis-ci to v2.1.21 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 46 +++++++++++++++------------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/yarn.lock b/yarn.lock index e90b9f2abc..e7683f8543 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3867,7 +3867,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.13.10, @backstage/core-components@npm:^0.13.8": +"@backstage/core-components@npm:^0.13.10": version: 0.13.10 resolution: "@backstage/core-components@npm:0.13.10" dependencies: @@ -4042,7 +4042,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.8.0, @backstage/core-plugin-api@npm:^1.8.2, @backstage/core-plugin-api@npm:^1.9.0": +"@backstage/core-plugin-api@npm:^1.8.2, @backstage/core-plugin-api@npm:^1.9.0": version: 1.9.0 resolution: "@backstage/core-plugin-api@npm:1.9.0" dependencies: @@ -5965,7 +5965,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.10.0, @backstage/plugin-catalog-react@npm:^1.9.1, @backstage/plugin-catalog-react@npm:^1.9.3": +"@backstage/plugin-catalog-react@npm:^1.10.0, @backstage/plugin-catalog-react@npm:^1.9.3": version: 1.10.0 resolution: "@backstage/plugin-catalog-react@npm:1.10.0" dependencies: @@ -10210,22 +10210,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@npm:^0.4.4": - version: 0.4.4 - resolution: "@backstage/theme@npm:0.4.4" - dependencies: - "@emotion/react": ^11.10.5 - "@emotion/styled": ^11.10.5 - "@mui/material": ^5.12.2 - peerDependencies: - "@material-ui/core": ^4.12.2 - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - checksum: 562ce0f0fd07202b44971b55bba9c39cd13c91a65873034d2e68fb5833c0d9882c2fd967d6c779a8563618ce035ec159823c865b0163911b7004f1bfce3ce4a1 - languageName: node - linkType: hard - "@backstage/theme@npm:^0.5.0, @backstage/theme@npm:^0.5.1": version: 0.5.1 resolution: "@backstage/theme@npm:0.5.1" @@ -12959,7 +12943,7 @@ __metadata: languageName: node linkType: hard -"@material-ui/core@npm:^4.11.3, @material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.12.4, @material-ui/core@npm:^4.9.13": +"@material-ui/core@npm:^4.12.2, @material-ui/core@npm:^4.12.4, @material-ui/core@npm:^4.9.13": version: 4.12.4 resolution: "@material-ui/core@npm:4.12.4" dependencies: @@ -15941,15 +15925,15 @@ __metadata: linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.17 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.17" + version: 2.1.21 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.21" dependencies: - "@backstage/catalog-model": ^1.4.3 - "@backstage/core-components": ^0.13.8 - "@backstage/core-plugin-api": ^1.8.0 - "@backstage/plugin-catalog-react": ^1.9.1 - "@backstage/theme": ^0.4.4 - "@material-ui/core": ^4.11.3 + "@backstage/catalog-model": ^1.4.4 + "@backstage/core-components": ^0.14.0 + "@backstage/core-plugin-api": ^1.9.0 + "@backstage/plugin-catalog-react": ^1.10.0 + "@backstage/theme": ^0.5.1 + "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 cross-fetch: ^3.1.3 @@ -15958,11 +15942,11 @@ __metadata: moment: ^2.29.1 react-use: ^17.2.4 peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^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: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: fcf0b788a2f004a6eff181ff9f9babd07aceb630333b1a3e8ce7fb37b6e9a303444ecc9521a920f6aced2c9a081fa3024ee9079d1bb9f453e2d322af04f57113 + checksum: 542a4e2239c18c29923e27fddcde7e39a036907ab7e04255b05d3e55a44530b76ab2af8866697fbbf42a1445d63dcf1b4cd9a8062c71f211b74679a19785623d languageName: node linkType: hard From 2219f8c3d612140f833d27a0aebacf9c088c5a57 Mon Sep 17 00:00:00 2001 From: Patrik Ivarsson Date: Thu, 7 Mar 2024 17:25:01 +0100 Subject: [PATCH 010/219] feat: add argument for relationsType to MembersListCard Signed-off-by: Patrik Ivarsson --- .changeset/slimy-icons-swim.md | 6 ++ .../MembersList/MembersListCard.test.tsx | 82 ++++++++++++++++++- .../Group/MembersList/MembersListCard.tsx | 13 ++- .../Cards/OwnershipCard/ComponentsGrid.tsx | 2 +- .../Cards/OwnershipCard/OwnershipCard.tsx | 2 +- .../components/Cards/OwnershipCard/index.ts | 1 - .../Cards/OwnershipCard/useGetEntities.ts | 6 +- plugins/org/src/components/Cards/index.ts | 1 + .../Cards/{OwnershipCard => }/types.ts | 0 9 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 .changeset/slimy-icons-swim.md rename plugins/org/src/components/Cards/{OwnershipCard => }/types.ts (100%) diff --git a/.changeset/slimy-icons-swim.md b/.changeset/slimy-icons-swim.md new file mode 100644 index 0000000000..52e2769e51 --- /dev/null +++ b/.changeset/slimy-icons-swim.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-org': patch +--- + +Add `relationsType` argument to `MembersListCard`. +This can be used to display an aggregated user list for groups by default. diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx index cd5801ac71..06ec3b0ebd 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx @@ -311,15 +311,20 @@ describe('MemberTab Test', () => { }, }, ); + + // Should show only direct users on initial load + const displayedMemberNamesBefore = screen.queryAllByTestId('user-link'); + expect(displayedMemberNamesBefore).toHaveLength(2); + // Click the toggle switch await userEvent.click(screen.getByRole('checkbox')); - const displayedMemberNames = screen.queryAllByTestId('user-link'); + const displayedMemberNamesAfter = screen.queryAllByTestId('user-link'); const duplicatedUserText = screen.getByText('Duplicated User'); const groupAUserOneText = screen.getByText('Group A User One'); const groupBUserOneText = screen.getByText('Group B User One'); const groupDUserOneText = screen.getByText('Group D User One'); const groupEUserOneText = screen.getByText('Group E User One'); - expect(displayedMemberNames).toHaveLength(5); + expect(displayedMemberNamesAfter).toHaveLength(5); expect(duplicatedUserText).toBeInTheDocument(); expect(groupAUserOneText).toBeInTheDocument(); expect(groupBUserOneText).toBeInTheDocument(); @@ -339,4 +344,77 @@ describe('MemberTab Test', () => { ); }); }); + + it('Can default to show aggregated members with the aggregate members toggle', async () => { + await renderInTestApp( + + + + + + + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + '/catalog': rootRouteRef, + }, + }, + ); + + // Should show aggregated users on initial load + const displayedMemberNamesBefore = screen.queryAllByTestId('user-link'); + expect(displayedMemberNamesBefore).toHaveLength(5); + + // Click the toggle switch + await userEvent.click(screen.getByRole('checkbox')); + + // Should now show only direct users + const displayedMemberNamesAfter = screen.queryAllByTestId('user-link'); + expect(displayedMemberNamesAfter).toHaveLength(2); + }); + + it('Can show aggregated members without the aggregate members toggle', async () => { + await renderInTestApp( + + + + + + + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + '/catalog': rootRouteRef, + }, + }, + ); + + // aggregated relations checkbox should not be rendered + expect(screen.queryByRole('checkbox')).toBeNull(); + + // Should show all descendant users on load + const displayedMemberNames = screen.queryAllByTestId('user-link'); + expect(displayedMemberNames).toHaveLength(5); + }); }); diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx index 8967e7cdd7..005e426149 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx @@ -48,6 +48,7 @@ import { removeDuplicateEntitiesFrom, } from '../../../../helpers/helpers'; import { EntityRefLink } from '@backstage/plugin-catalog-react'; +import { EntityRelationAggregation } from '../../types'; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -138,11 +139,13 @@ export const MembersListCard = (props: { memberDisplayTitle?: string; pageSize?: number; showAggregateMembersToggle?: boolean; + relationsType?: EntityRelationAggregation; }) => { const { memberDisplayTitle = 'Members', pageSize = 50, showAggregateMembersToggle, + relationsType = 'direct', } = props; const classes = useListStyles(); @@ -162,11 +165,13 @@ export const MembersListCard = (props: { setPage(pageIndex); }; - const [showAggregateMembers, setShowAggregateMembers] = useState(false); + const [showAggregateMembers, setShowAggregateMembers] = useState( + relationsType === 'aggregated', + ); const { loading: loadingDescendantMembers, value: descendantMembers } = useAsync(async () => { - if (!showAggregateMembersToggle) { + if (!showAggregateMembers) { return [] as UserEntity[]; } @@ -174,7 +179,7 @@ export const MembersListCard = (props: { groupEntity, catalogApi, ); - }, [catalogApi, groupEntity, showAggregateMembersToggle]); + }, [catalogApi, groupEntity, showAggregateMembers]); const { loading, error, @@ -229,7 +234,7 @@ export const MembersListCard = (props: { memberList = ( {members.slice(pageSize * (page - 1), pageSize * page).map(member => ( - + ))} ); diff --git a/plugins/org/src/components/Cards/OwnershipCard/ComponentsGrid.tsx b/plugins/org/src/components/Cards/OwnershipCard/ComponentsGrid.tsx index 1eb2a95ff6..928f242e0d 100644 --- a/plugins/org/src/components/Cards/OwnershipCard/ComponentsGrid.tsx +++ b/plugins/org/src/components/Cards/OwnershipCard/ComponentsGrid.tsx @@ -33,7 +33,7 @@ import React from 'react'; import pluralize from 'pluralize'; import { catalogIndexRouteRef } from '../../../routes'; import { useGetEntities } from './useGetEntities'; -import { EntityRelationAggregation } from './types'; +import { EntityRelationAggregation } from '../types'; const useStyles = makeStyles(theme => createStyles({ diff --git a/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.tsx b/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.tsx index 278e2f4b70..0747f710ef 100644 --- a/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.tsx +++ b/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.tsx @@ -27,7 +27,7 @@ import { } from '@material-ui/core'; import React, { useEffect, useState } from 'react'; import { ComponentsGrid } from './ComponentsGrid'; -import { EntityRelationAggregation } from './types'; +import { EntityRelationAggregation } from '../types'; const useStyles = makeStyles(theme => ({ card: { diff --git a/plugins/org/src/components/Cards/OwnershipCard/index.ts b/plugins/org/src/components/Cards/OwnershipCard/index.ts index a4798cc4bf..dc0cef0226 100644 --- a/plugins/org/src/components/Cards/OwnershipCard/index.ts +++ b/plugins/org/src/components/Cards/OwnershipCard/index.ts @@ -14,4 +14,3 @@ * limitations under the License. */ export * from './OwnershipCard'; -export * from './types'; diff --git a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts index b6fa9cbfd1..c5bf4a7279 100644 --- a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts +++ b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts @@ -31,7 +31,7 @@ import limiterFactory from 'p-limit'; import { useApi } from '@backstage/core-plugin-api'; import useAsync from 'react-use/lib/useAsync'; import qs from 'qs'; -import { EntityRelationAggregation as EntityRelationsAggregation } from './types'; +import { EntityRelationAggregation } from '../types'; import { uniq } from 'lodash'; const limiter = limiterFactory(10); @@ -125,7 +125,7 @@ const getChildOwnershipEntityRefs = async ( const getOwners = async ( entity: Entity, - relations: EntityRelationsAggregation, + relations: EntityRelationAggregation, catalogApi: CatalogApi, ): Promise => { const isGroup = entity.kind === 'Group'; @@ -166,7 +166,7 @@ const getOwnedEntitiesByOwners = ( export function useGetEntities( entity: Entity, - relations: EntityRelationsAggregation, + relations: EntityRelationAggregation, entityFilterKind?: string[], entityLimit = 6, ): { diff --git a/plugins/org/src/components/Cards/index.ts b/plugins/org/src/components/Cards/index.ts index aec3d8da5e..4c57f5a422 100644 --- a/plugins/org/src/components/Cards/index.ts +++ b/plugins/org/src/components/Cards/index.ts @@ -16,3 +16,4 @@ export * from './Group'; export * from './User'; export * from './OwnershipCard'; +export type { EntityRelationAggregation } from './types'; diff --git a/plugins/org/src/components/Cards/OwnershipCard/types.ts b/plugins/org/src/components/Cards/types.ts similarity index 100% rename from plugins/org/src/components/Cards/OwnershipCard/types.ts rename to plugins/org/src/components/Cards/types.ts From 479ca4259daa857bffd1ffce8a7bb7e37f77f7d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 19:48:18 +0000 Subject: [PATCH 011/219] chore(deps): update chromaui/action digest to 306092d 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 e12aba2e0e..6edb5d3651 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@fd0e276c344bab4dc69a023fdf89ffb9b79b3b31 # v11 + - uses: chromaui/action@306092d42c0743800aadf544ee263cbc56598b1b # v11 with: token: ${{ secrets.GITHUB_TOKEN }} # projectToken intentionally shared to allow collaborators to run Chromatic on forks From 941c1b2a98cd9bf4e716d2ee2ba49c6240e557ce Mon Sep 17 00:00:00 2001 From: Patrik Ivarsson Date: Tue, 12 Mar 2024 09:36:02 +0100 Subject: [PATCH 012/219] add api-report.md Signed-off-by: Patrik Ivarsson --- plugins/org/api-report.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/org/api-report.md b/plugins/org/api-report.md index 922b25b610..1960ce839b 100644 --- a/plugins/org/api-report.md +++ b/plugins/org/api-report.md @@ -23,6 +23,7 @@ export const EntityMembersListCard: (props: { memberDisplayTitle?: string | undefined; pageSize?: number | undefined; showAggregateMembersToggle?: boolean | undefined; + relationsType?: EntityRelationAggregation | undefined; }) => JSX_2.Element; // @public (undocumented) @@ -54,6 +55,7 @@ export const MembersListCard: (props: { memberDisplayTitle?: string; pageSize?: number; showAggregateMembersToggle?: boolean; + relationsType?: EntityRelationAggregation; }) => React_2.JSX.Element; // @public From 634b3c096cbdcc543c750f7b401e9523871f5f8d Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 08:19:08 +0100 Subject: [PATCH 013/219] BEP 0006: Scaffolder Action Rollback Signed-off-by: bnechyporenko --- .../README.md | 4 +- .../0006-scaffolder-action-rollback/README.md | 84 +++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 beps/0006-scaffolder-action-rollback/README.md diff --git a/beps/0004-scaffolder-task-idempotency/README.md b/beps/0004-scaffolder-task-idempotency/README.md index 03569de3d6..8cdf8504fe 100644 --- a/beps/0004-scaffolder-task-idempotency/README.md +++ b/beps/0004-scaffolder-task-idempotency/README.md @@ -4,8 +4,8 @@ status: provisional authors: - 'bnechyporenko@bol.com' - 'benjaminl@spotify.com' -owners: - - @backstage/scaffolder-maintainers +owners: + - '@backstage/scaffolder-maintainers' project-areas: - scaffolder creation-date: 2024-01-31 diff --git a/beps/0006-scaffolder-action-rollback/README.md b/beps/0006-scaffolder-action-rollback/README.md new file mode 100644 index 0000000000..fd6c7911b9 --- /dev/null +++ b/beps/0006-scaffolder-action-rollback/README.md @@ -0,0 +1,84 @@ +--- +title: Scaffolder Action Rollback +status: provisional +authors: + - 'bnechyporenko@bol.com' + - 'benjaminl@spotify.com' +owners: + - '@backstage/scaffolder-maintainers' +project-areas: + - scaffolder +creation-date: 2024-03-13 +--- + +# BEP: + +[**Discussion Issue**](https://github.com/backstage/backstage/issues/NNNNN) + +- [Summary](#summary) +- [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) +- [Proposal](#proposal) +- [Design Details](#design-details) +- [Release Plan](#release-plan) +- [Dependencies](#dependencies) +- [Alternatives](#alternatives) + +## Summary + +Introducing the rollback to scaffolder actions provides the mean to come back to the initial state. + +## Motivation + +The aim is to help to mitigate the issue of manual clean up the partially created resources. + +### Goals + +- We will extend action's API to be able to run rollback for failed tasks +- Rollback will be optional + +### Non-Goals + +We will not cover all built-in actions with a rollback functionality + +## Proposal + +Rollback is going to be performed: + +- when user manually decide to perform this action. +- task has to be recovered and TaskRecoverStrategy set to 'rollback' + +## Design Details + +We are going to introduce an extra function in action API which will look like: + +```typescript +const createPublishGitHubAction = createTemplateAction({ + id: 'publish:github', + async handler() {}, + async rollback() {}, +}); +``` + +## Release Plan + + + +## Dependencies + + + +## Alternatives + + From e5f26f9f2d4c51d73cdfd853b561b9cd365919b1 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 09:01:56 +0100 Subject: [PATCH 014/219] Fixing the lost of the initial state after a task recovery. Signed-off-by: bnechyporenko --- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 11 +++++++++++ .../src/scaffolder/tasks/StorageTaskBroker.ts | 1 + plugins/scaffolder-node/src/tasks/types.ts | 1 + 3 files changed, 13 insertions(+) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 2a39440775..5b99b5d0bc 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -268,6 +268,16 @@ export class DatabaseTaskStore implements TaskStore { return undefined; } + const getState = () => { + try { + return task.state ? JSON.parse(task.state) : undefined; + } catch (error) { + throw new Error( + `Failed to parse state of the task '${task.id}', ${error}`, + ); + } + }; + const secrets = this.parseTaskSecrets(task); return { id: task.id, @@ -277,6 +287,7 @@ export class DatabaseTaskStore implements TaskStore { createdAt: task.created_at, createdBy: task.created_by ?? undefined, secrets, + state: getState(), }; }); } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index a2018fe127..29a22716ba 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -314,6 +314,7 @@ export class StorageTaskBroker implements TaskBroker { spec: pendingTask.spec, secrets: pendingTask.secrets, createdBy: pendingTask.createdBy, + state: pendingTask.state, }, this.storage, abortController.signal, diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index a072bb5f5e..aef2c5f360 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -59,6 +59,7 @@ export type SerializedTask = { lastHeartbeatAt?: string; createdBy?: string; secrets?: TaskSecrets; + state?: JsonObject; }; /** From 1f09ac792e955a20bd9f967f8ed36f2ef23ebcc0 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 09:39:45 +0100 Subject: [PATCH 015/219] Fixing the lost of the initial state after a task recovery. Signed-off-by: bnechyporenko --- .../tasks/DatabaseTaskStore.test.ts | 38 +++++++++++++++++++ .../src/scaffolder/tasks/DatabaseTaskStore.ts | 6 ++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts index fe9cf3c661..bd0b84227c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts @@ -161,6 +161,44 @@ describe('DatabaseTaskStore', () => { expect(claimedTask.status).toBe('processing'); }); + it('should restore the state of the task after the task recovery', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await store.claimTask(); + + const state = { + state: { + checkpoints: { + 'v1.task.checkpoint.deploy.to.stg': { + status: 'success', + value: true, + }, + 'v1.task.checkpoint.deploy.to.pro': { + status: 'success', + value: true, + }, + }, + }, + }; + + await store.saveTaskState({ + taskId, + state, + }); + + await store.recoverTasks({ timeout: { milliseconds: 0 } }); + await store.claimTask(); + + const claimedTask = await store.getTask(taskId); + expect(claimedTask.state).toEqual({ state }); + }); + it('should shutdown the running task', async () => { const { store } = await createStore(); const { taskId } = await store.createTask({ diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 5b99b5d0bc..68f76cd3e4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -212,6 +212,7 @@ export class DatabaseTaskStore implements TaskStore { try { const spec = JSON.parse(result.spec); const secrets = result.secrets ? JSON.parse(result.secrets) : undefined; + const state = result.state ? JSON.parse(result.state) : undefined; return { id: result.id, spec, @@ -220,6 +221,7 @@ export class DatabaseTaskStore implements TaskStore { createdAt: parseSqlDateToIsoString(result.created_at), createdBy: result.created_by ?? undefined, secrets, + state, }; } catch (error) { throw new Error(`Failed to parse spec of task '${taskId}', ${error}`); @@ -536,14 +538,14 @@ export class DatabaseTaskStore implements TaskStore { status: 'open', last_heartbeat_at: this.db.fn.now(), }, - ['id', 'spec'], + ['id', 'spec', 'state'], ); taskIdsToRecover.push(...result.map(i => i.id)); for (const { id, spec } of result) { const taskSpec = JSON.parse(spec as string) as TaskSpec; - await this.db('task_events').insert({ + await tx('task_events').insert({ task_id: id, event_type: 'recovered', body: JSON.stringify({ From 984abfa575eb28e19d25eccdea48a8831fbe1127 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 11:39:30 +0100 Subject: [PATCH 016/219] Fixing the lost of the initial state after a task recovery. Signed-off-by: bnechyporenko --- .changeset/flat-kiwis-rush.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/flat-kiwis-rush.md diff --git a/.changeset/flat-kiwis-rush.md b/.changeset/flat-kiwis-rush.md new file mode 100644 index 0000000000..585b731eed --- /dev/null +++ b/.changeset/flat-kiwis-rush.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Fixing the lost of the initial state after a task recovery. From 30258837b25ec3ff7ff66c997551a1ac3e2699d0 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 14:59:18 +0100 Subject: [PATCH 017/219] Fixing the lost of the initial state after a task recovery. Signed-off-by: bnechyporenko --- .../src/scaffolder/tasks/DatabaseTaskStore.test.ts | 2 +- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts index bd0b84227c..ab80dcff04 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts @@ -196,7 +196,7 @@ describe('DatabaseTaskStore', () => { await store.claimTask(); const claimedTask = await store.getTask(taskId); - expect(claimedTask.state).toEqual({ state }); + expect(claimedTask.state).toEqual({ state: state.state }); }); it('should shutdown the running task', async () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 68f76cd3e4..752108cf6e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -212,7 +212,7 @@ export class DatabaseTaskStore implements TaskStore { try { const spec = JSON.parse(result.spec); const secrets = result.secrets ? JSON.parse(result.secrets) : undefined; - const state = result.state ? JSON.parse(result.state) : undefined; + const state = result.state ? JSON.parse(result.state).state : undefined; return { id: result.id, spec, @@ -272,7 +272,7 @@ export class DatabaseTaskStore implements TaskStore { const getState = () => { try { - return task.state ? JSON.parse(task.state) : undefined; + return task.state ? JSON.parse(task.state).state : undefined; } catch (error) { throw new Error( `Failed to parse state of the task '${task.id}', ${error}`, From 07487d8300dbd075f1fd90adc25c76c5ea9bd084 Mon Sep 17 00:00:00 2001 From: Lin Sun Date: Wed, 13 Mar 2024 12:13:47 -0400 Subject: [PATCH 018/219] Update microsite/src/pages/community/index.tsx Signed-off-by: Lin Sun --- microsite/src/pages/community/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/src/pages/community/index.tsx b/microsite/src/pages/community/index.tsx index 4090d6ad9f..cba7417b9c 100644 --- a/microsite/src/pages/community/index.tsx +++ b/microsite/src/pages/community/index.tsx @@ -83,7 +83,7 @@ const Community = () => { }, { name: 'solo.io', - url: 'https://solo.io/', + url: 'https://www.solo.io/spotlight/', logo: 'img/partner-logo-solo.png', }, { From d1101fd58244233b874c50e7ed3bc205915b57b7 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 21:26:03 +0100 Subject: [PATCH 019/219] updated api report Signed-off-by: bnechyporenko --- plugins/scaffolder-node/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index f1362f5a8a..c757301249 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -286,6 +286,7 @@ export type SerializedTask = { lastHeartbeatAt?: string; createdBy?: string; secrets?: TaskSecrets; + state?: JsonObject; }; // @public From 3a6e0dfc78b25ec919547574ac7c05f1d68312b8 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 13 Mar 2024 21:27:06 +0100 Subject: [PATCH 020/219] wip Signed-off-by: bnechyporenko --- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 752108cf6e..ac391ea2b6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -538,7 +538,7 @@ export class DatabaseTaskStore implements TaskStore { status: 'open', last_heartbeat_at: this.db.fn.now(), }, - ['id', 'spec', 'state'], + ['id', 'spec'], ); taskIdsToRecover.push(...result.map(i => i.id)); From 2481d8a552077de8f336a9b0cac72b2b4424b520 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 13:52:39 +0530 Subject: [PATCH 021/219] Added Material UI 4 import rule to plugins/rollbar Signed-off-by: Aditya Kumar --- .changeset/early-monkeys-drive.md | 5 +++++ plugins/rollbar/.eslintrc.js | 6 +++++- .../RollbarTopItemsTable/RollbarTopItemsTable.tsx | 5 +++-- 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 .changeset/early-monkeys-drive.md diff --git a/.changeset/early-monkeys-drive.md b/.changeset/early-monkeys-drive.md new file mode 100644 index 0000000000..2d8245f178 --- /dev/null +++ b/.changeset/early-monkeys-drive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-rollbar': patch +--- + +Added an optional ESLint rule - no-top-level-material-ui-4-imports -in rollbar plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/rollbar. diff --git a/plugins/rollbar/.eslintrc.js b/plugins/rollbar/.eslintrc.js index e2a53a6ad2..9d5b45a010 100644 --- a/plugins/rollbar/.eslintrc.js +++ b/plugins/rollbar/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, + }); \ No newline at end of file diff --git a/plugins/rollbar/src/components/RollbarTopItemsTable/RollbarTopItemsTable.tsx b/plugins/rollbar/src/components/RollbarTopItemsTable/RollbarTopItemsTable.tsx index 89fa7596b0..c6eb8888ab 100644 --- a/plugins/rollbar/src/components/RollbarTopItemsTable/RollbarTopItemsTable.tsx +++ b/plugins/rollbar/src/components/RollbarTopItemsTable/RollbarTopItemsTable.tsx @@ -14,8 +14,9 @@ * limitations under the License. */ -import { Box, Typography } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import Alert from '@material-ui/lab/Alert'; import React from 'react'; import { RollbarFrameworkId, From fbb705c7da7ee820b900e8db026e39610252ff48 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 16:19:46 +0530 Subject: [PATCH 022/219] Added Material UI 4 import rule to plugins/playlist Signed-off-by: Aditya Kumar --- .changeset/purple-bananas-add.md | 5 +++ plugins/playlist/.eslintrc.js | 6 +++- .../CreatePlaylistButton.test.tsx | 2 +- .../CreatePlaylistButton.tsx | 5 ++- .../EntityPlaylistDialog.test.tsx | 2 +- .../EntityPlaylistDialog.tsx | 30 ++++++++--------- .../PersonalListPicker/PersonalListPicker.tsx | 18 +++++------ .../components/PlaylistCard/PlaylistCard.tsx | 20 ++++++------ .../PlaylistEditDialog/PlaylistEditDialog.tsx | 32 +++++++++---------- .../components/PlaylistList/PlaylistList.tsx | 2 +- .../PlaylistOwnerPicker.tsx | 16 ++++------ .../PlaylistPage/AddEntitiesDrawer.tsx | 30 ++++++++--------- .../PlaylistEntitiesTable.test.tsx | 2 +- .../PlaylistPage/PlaylistHeader.test.tsx | 2 +- .../PlaylistPage/PlaylistHeader.tsx | 16 ++++------ .../components/PlaylistPage/PlaylistPage.tsx | 18 +++++------ .../PlaylistSearchBar/PlaylistSearchBar.tsx | 14 ++++---- .../PlaylistSortPicker/PlaylistSortPicker.tsx | 12 +++---- 18 files changed, 111 insertions(+), 121 deletions(-) create mode 100644 .changeset/purple-bananas-add.md diff --git a/.changeset/purple-bananas-add.md b/.changeset/purple-bananas-add.md new file mode 100644 index 0000000000..71eee2d154 --- /dev/null +++ b/.changeset/purple-bananas-add.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-playlist': patch +--- + +Added an optional ESLint rule - no-top-level-material-ui-4-imports - in Playlist plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for `plugins/playlist`. diff --git a/plugins/playlist/.eslintrc.js b/plugins/playlist/.eslintrc.js index e2a53a6ad2..9d5b45a010 100644 --- a/plugins/playlist/.eslintrc.js +++ b/plugins/playlist/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, + }); \ No newline at end of file diff --git a/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.test.tsx b/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.test.tsx index ab839c9a85..589f85b369 100644 --- a/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.test.tsx +++ b/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.test.tsx @@ -21,7 +21,7 @@ import { permissionApiRef, } from '@backstage/plugin-permission-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { fireEvent, waitFor, act } from '@testing-library/react'; import React from 'react'; import { SWRConfig } from 'swr'; diff --git a/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx b/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx index 26c7b3fd45..bbbb97392b 100644 --- a/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx +++ b/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx @@ -25,7 +25,10 @@ import { permissions, PlaylistMetadata, } from '@backstage/plugin-playlist-common'; -import { Button, IconButton, Theme, useMediaQuery } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import IconButton from '@material-ui/core/IconButton'; +import useMediaQuery from '@material-ui/core/useMediaQuery'; +import { Theme } from '@material-ui/core/styles'; import AddCircleOutline from '@material-ui/icons/AddCircleOutline'; import React, { useCallback, useState } from 'react'; import { useNavigate } from 'react-router-dom'; diff --git a/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.test.tsx b/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.test.tsx index 3595f42d00..cf51f4d44e 100644 --- a/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.test.tsx +++ b/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.test.tsx @@ -23,7 +23,7 @@ import { PermissionApi, permissionApiRef, } from '@backstage/plugin-permission-react'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { fireEvent, getByRole, waitFor, act } from '@testing-library/react'; import React from 'react'; import { SWRConfig } from 'swr'; diff --git a/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.tsx b/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.tsx index 38ea156320..b3cb472714 100644 --- a/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.tsx +++ b/plugins/playlist/src/components/EntityPlaylistDialog/EntityPlaylistDialog.tsx @@ -27,22 +27,20 @@ import { Playlist, PlaylistMetadata, } from '@backstage/plugin-playlist-common'; -import { - Button, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - IconButton, - InputAdornment, - LinearProgress, - List, - ListItem, - ListItemIcon, - ListItemText, - makeStyles, - TextField, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import IconButton from '@material-ui/core/IconButton'; +import InputAdornment from '@material-ui/core/InputAdornment'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import TextField from '@material-ui/core/TextField'; +import { makeStyles } from '@material-ui/core/styles'; import ClearButton from '@material-ui/icons/Clear'; import PlaylistAddIcon from '@material-ui/icons/PlaylistAdd'; import SearchIcon from '@material-ui/icons/Search'; diff --git a/plugins/playlist/src/components/PersonalListPicker/PersonalListPicker.tsx b/plugins/playlist/src/components/PersonalListPicker/PersonalListPicker.tsx index 0691d26732..bfd633e084 100644 --- a/plugins/playlist/src/components/PersonalListPicker/PersonalListPicker.tsx +++ b/plugins/playlist/src/components/PersonalListPicker/PersonalListPicker.tsx @@ -21,16 +21,14 @@ import { useApi, } from '@backstage/core-plugin-api'; import { Playlist } from '@backstage/plugin-playlist-common'; -import { - Card, - List, - ListItemIcon, - ListItemSecondaryAction, - ListItemText, - makeStyles, - MenuItem, - Typography, -} from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import List from '@material-ui/core/List'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import PlaylistPlayIcon from '@material-ui/icons/PlaylistPlay'; import SettingsIcon from '@material-ui/icons/Settings'; import { compact } from 'lodash'; diff --git a/plugins/playlist/src/components/PlaylistCard/PlaylistCard.tsx b/plugins/playlist/src/components/PlaylistCard/PlaylistCard.tsx index 8b52bcc1de..755798b13a 100644 --- a/plugins/playlist/src/components/PlaylistCard/PlaylistCard.tsx +++ b/plugins/playlist/src/components/PlaylistCard/PlaylistCard.tsx @@ -22,17 +22,15 @@ import { import { useRouteRef } from '@backstage/core-plugin-api'; import { EntityRefLinks } from '@backstage/plugin-catalog-react'; import { Playlist } from '@backstage/plugin-playlist-common'; -import { - Box, - Card, - CardActions, - CardContent, - CardMedia, - Chip, - makeStyles, - Tooltip, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Card from '@material-ui/core/Card'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; +import CardMedia from '@material-ui/core/CardMedia'; +import Chip from '@material-ui/core/Chip'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import LockIcon from '@material-ui/icons/Lock'; import React from 'react'; import { playlistRouteRef } from '../../routes'; diff --git a/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx b/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx index 97bd4728b9..a7e7b6d976 100644 --- a/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx +++ b/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx @@ -19,23 +19,21 @@ import { identityApiRef, useApi } from '@backstage/core-plugin-api'; import { humanizeEntityRef } from '@backstage/plugin-catalog-react'; import { PlaylistMetadata } from '@backstage/plugin-playlist-common'; import { playlistApiRef } from '../../api'; -import { - Button, - CircularProgress, - Dialog, - DialogActions, - DialogContent, - FormControl, - FormControlLabel, - InputLabel, - makeStyles, - MenuItem, - LinearProgress, - Radio, - RadioGroup, - Select, - TextField, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import FormControl from '@material-ui/core/FormControl'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import Select from '@material-ui/core/Select'; +import TextField from '@material-ui/core/TextField'; +import { makeStyles } from '@material-ui/core/styles'; import React, { useState } from 'react'; import { useForm, Controller } from 'react-hook-form'; import useAsync from 'react-use/lib/useAsync'; diff --git a/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx b/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx index 6ec06f3e05..b81ae0125c 100644 --- a/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx +++ b/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx @@ -21,7 +21,7 @@ import { Progress, WarningPanel, } from '@backstage/core-components'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { useTitle, usePlaylistList } from '../../hooks'; import { PlaylistCard } from '../PlaylistCard'; diff --git a/plugins/playlist/src/components/PlaylistOwnerPicker/PlaylistOwnerPicker.tsx b/plugins/playlist/src/components/PlaylistOwnerPicker/PlaylistOwnerPicker.tsx index d7fd97ff19..f031d53aa8 100644 --- a/plugins/playlist/src/components/PlaylistOwnerPicker/PlaylistOwnerPicker.tsx +++ b/plugins/playlist/src/components/PlaylistOwnerPicker/PlaylistOwnerPicker.tsx @@ -17,18 +17,16 @@ import { parseEntityRef } from '@backstage/catalog-model'; import { humanizeEntityRef } from '@backstage/plugin-catalog-react'; import { Playlist } from '@backstage/plugin-playlist-common'; -import { - Box, - Checkbox, - Chip, - FormControlLabel, - TextField, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Checkbox from '@material-ui/core/Checkbox'; +import Chip from '@material-ui/core/Chip'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import TextField from '@material-ui/core/TextField'; +import Typography from '@material-ui/core/Typography'; import CheckBoxIcon from '@material-ui/icons/CheckBox'; import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { Autocomplete } from '@material-ui/lab'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import React, { useEffect, useMemo, useState } from 'react'; import { usePlaylistList } from '../../hooks'; diff --git a/plugins/playlist/src/components/PlaylistPage/AddEntitiesDrawer.tsx b/plugins/playlist/src/components/PlaylistPage/AddEntitiesDrawer.tsx index 529327776e..5f404ef8f7 100644 --- a/plugins/playlist/src/components/PlaylistPage/AddEntitiesDrawer.tsx +++ b/plugins/playlist/src/components/PlaylistPage/AddEntitiesDrawer.tsx @@ -32,23 +32,19 @@ import { SearchResultPager, useSearch, } from '@backstage/plugin-search-react'; -import { - Box, - Button, - Chip, - createStyles, - Divider, - Drawer, - Grid, - List, - ListItem, - ListItemSecondaryAction, - ListItemText, - makeStyles, - Paper, - Theme, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import Chip from '@material-ui/core/Chip'; +import Divider from '@material-ui/core/Divider'; +import Drawer from '@material-ui/core/Drawer'; +import Grid from '@material-ui/core/Grid'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemText from '@material-ui/core/ListItemText'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import React, { useCallback, useEffect, useMemo } from 'react'; const useStyles = makeStyles((theme: Theme) => diff --git a/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.test.tsx b/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.test.tsx index ba6f94e945..0ee1bf7ebc 100644 --- a/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.test.tsx +++ b/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.test.tsx @@ -22,7 +22,7 @@ import { permissionApiRef, } from '@backstage/plugin-permission-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { fireEvent, waitFor, act } from '@testing-library/react'; import React from 'react'; import { SWRConfig } from 'swr'; diff --git a/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.test.tsx b/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.test.tsx index 480ac038f2..7a9283b163 100644 --- a/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.test.tsx +++ b/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.test.tsx @@ -26,7 +26,7 @@ import { } from '@backstage/plugin-permission-react'; import { permissions, Playlist } from '@backstage/plugin-playlist-common'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { fireEvent, waitFor, act } from '@testing-library/react'; import React from 'react'; import { SWRConfig } from 'swr'; diff --git a/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx b/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx index 23a41b734b..868559695f 100644 --- a/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx +++ b/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx @@ -32,15 +32,13 @@ import { Playlist, PlaylistMetadata, } from '@backstage/plugin-playlist-common'; -import { - Button, - Chip, - CircularProgress, - Dialog, - DialogActions, - DialogContent, - makeStyles, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Chip from '@material-ui/core/Chip'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import { makeStyles } from '@material-ui/core/styles'; import EditIcon from '@material-ui/icons/Edit'; import DeleteIcon from '@material-ui/icons/Delete'; import React, { useCallback, useState } from 'react'; diff --git a/plugins/playlist/src/components/PlaylistPage/PlaylistPage.tsx b/plugins/playlist/src/components/PlaylistPage/PlaylistPage.tsx index b17fbd2fb7..ebd5c407f1 100644 --- a/plugins/playlist/src/components/PlaylistPage/PlaylistPage.tsx +++ b/plugins/playlist/src/components/PlaylistPage/PlaylistPage.tsx @@ -19,16 +19,14 @@ import { errorApiRef, useApi } from '@backstage/core-plugin-api'; import { ResponseError } from '@backstage/errors'; import { usePermission } from '@backstage/plugin-permission-react'; import { permissions } from '@backstage/plugin-playlist-common'; -import { - Button, - Card, - CardContent, - CardHeader, - Divider, - LinearProgress, - makeStyles, - Typography, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; +import Divider from '@material-ui/core/Divider'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import React, { useEffect } from 'react'; import { useParams } from 'react-router-dom'; import useAsyncFn from 'react-use/lib/useAsyncFn'; diff --git a/plugins/playlist/src/components/PlaylistSearchBar/PlaylistSearchBar.tsx b/plugins/playlist/src/components/PlaylistSearchBar/PlaylistSearchBar.tsx index 44e0b28c13..566240cf1d 100644 --- a/plugins/playlist/src/components/PlaylistSearchBar/PlaylistSearchBar.tsx +++ b/plugins/playlist/src/components/PlaylistSearchBar/PlaylistSearchBar.tsx @@ -15,14 +15,12 @@ */ import { Playlist } from '@backstage/plugin-playlist-common'; -import { - FormControl, - IconButton, - Input, - InputAdornment, - makeStyles, - Toolbar, -} from '@material-ui/core'; +import FormControl from '@material-ui/core/FormControl'; +import IconButton from '@material-ui/core/IconButton'; +import Input from '@material-ui/core/Input'; +import InputAdornment from '@material-ui/core/InputAdornment'; +import Toolbar from '@material-ui/core/Toolbar'; +import { makeStyles } from '@material-ui/core/styles'; import Clear from '@material-ui/icons/Clear'; import Search from '@material-ui/icons/Search'; import React, { useState } from 'react'; diff --git a/plugins/playlist/src/components/PlaylistSortPicker/PlaylistSortPicker.tsx b/plugins/playlist/src/components/PlaylistSortPicker/PlaylistSortPicker.tsx index 219792e2dc..4f6e7baf6d 100644 --- a/plugins/playlist/src/components/PlaylistSortPicker/PlaylistSortPicker.tsx +++ b/plugins/playlist/src/components/PlaylistSortPicker/PlaylistSortPicker.tsx @@ -15,13 +15,11 @@ */ import { Playlist } from '@backstage/plugin-playlist-common'; -import { - ListSubheader, - makeStyles, - MenuItem, - Select, - Typography, -} from '@material-ui/core'; +import ListSubheader from '@material-ui/core/ListSubheader'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import SwapVertIcon from '@material-ui/icons/SwapVert'; import React from 'react'; import useEffectOnce from 'react-use/lib/useEffectOnce'; From fcb6a8a131d4347205f7daca7f50fd931e49b8f8 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 16:55:12 +0530 Subject: [PATCH 023/219] Added Material UI 4 import rule to plugins/playlist Signed-off-by: Aditya Kumar --- .changeset/purple-bananas-add.md | 2 +- plugins/playlist/.eslintrc.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.changeset/purple-bananas-add.md b/.changeset/purple-bananas-add.md index 71eee2d154..33eafdd2ab 100644 --- a/.changeset/purple-bananas-add.md +++ b/.changeset/purple-bananas-add.md @@ -2,4 +2,4 @@ '@backstage/plugin-playlist': patch --- -Added an optional ESLint rule - no-top-level-material-ui-4-imports - in Playlist plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for `plugins/playlist`. +Adjusted MUI imports for better tree shaking. diff --git a/plugins/playlist/.eslintrc.js b/plugins/playlist/.eslintrc.js index 9d5b45a010..d801c159a0 100644 --- a/plugins/playlist/.eslintrc.js +++ b/plugins/playlist/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { - rules: { - '@backstage/no-top-level-material-ui-4-imports': 'error', - }, - }); \ No newline at end of file + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); \ No newline at end of file From 71e5ee60425408cd7bed0c605df94f8907411a2a Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 16:58:54 +0530 Subject: [PATCH 024/219] Added Material UI 4 import rule to plugins/rollbar Signed-off-by: Aditya Kumar --- .changeset/early-monkeys-drive.md | 2 +- plugins/rollbar/.eslintrc.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.changeset/early-monkeys-drive.md b/.changeset/early-monkeys-drive.md index 2d8245f178..ffb7157d27 100644 --- a/.changeset/early-monkeys-drive.md +++ b/.changeset/early-monkeys-drive.md @@ -2,4 +2,4 @@ '@backstage/plugin-rollbar': patch --- -Added an optional ESLint rule - no-top-level-material-ui-4-imports -in rollbar plugin which has an auto fix function to migrate the imports and used it to migrate the Material UI imports for plugins/rollbar. +Adjusted MUI imports for better tree shaking. diff --git a/plugins/rollbar/.eslintrc.js b/plugins/rollbar/.eslintrc.js index 9d5b45a010..d801c159a0 100644 --- a/plugins/rollbar/.eslintrc.js +++ b/plugins/rollbar/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { - rules: { - '@backstage/no-top-level-material-ui-4-imports': 'error', - }, - }); \ No newline at end of file + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); \ No newline at end of file From 6c1547a4fb37e191280f1524ad78261d85d8b5ad Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Wed, 13 Mar 2024 13:10:55 +0200 Subject: [PATCH 025/219] feat: add type definition to signal recipients follows more the notifications way of setting recipients and is more future proof Signed-off-by: Heikki Hellgren --- .changeset/dirty-hotels-sniff.md | 10 ++++++++++ plugins/notifications-backend/src/service/router.ts | 6 +++--- .../signals-backend/src/service/SignalManager.test.ts | 6 +++--- plugins/signals-backend/src/service/SignalManager.ts | 11 +++++++---- .../signals-backend/src/service/standaloneServer.ts | 2 +- plugins/signals-node/README.md | 6 +++--- plugins/signals-node/api-report.md | 9 ++++++++- .../signals-node/src/DefaultSignalsService.test.ts | 5 +++-- plugins/signals-node/src/types.ts | 4 +++- 9 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 .changeset/dirty-hotels-sniff.md diff --git a/.changeset/dirty-hotels-sniff.md b/.changeset/dirty-hotels-sniff.md new file mode 100644 index 0000000000..6d7e97da78 --- /dev/null +++ b/.changeset/dirty-hotels-sniff.md @@ -0,0 +1,10 @@ +--- +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-signals-backend': minor +'@backstage/plugin-signals-node': minor +--- + +**BREAKING** Type definition added to signal recipients + +Update to use `{type: 'broadcast'}` instead `null` and `{type: 'user', entityRefs: ''}` +instead string entity references diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 4a24763e40..84960176ab 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -286,7 +286,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: [user], + recipients: { type: 'user', entityRefs: [user] }, message: { action: 'notification_read', notification_ids: ids }, channel: 'notifications', }); @@ -296,7 +296,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: [user], + recipients: { type: 'user', entityRefs: [user] }, message: { action: 'notification_unread', notification_ids: ids }, channel: 'notifications', }); @@ -400,7 +400,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: user, + recipients: { type: 'user', entityRefs: [user] }, message: { action: 'new_notification', notification_id: ret.id, diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts index e6d0cab21b..f76d18079a 100644 --- a/plugins/signals-backend/src/service/SignalManager.test.ts +++ b/plugins/signals-backend/src/service/SignalManager.test.ts @@ -89,7 +89,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - recipients: null, + recipients: { type: 'broadcast' }, channel: 'test', message: { msg: 'test' }, }, @@ -109,7 +109,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - recipients: null, + recipients: { type: 'broadcast' }, channel: 'test', message: { msg: 'test' }, }, @@ -152,7 +152,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - recipients: 'user:default/john.doe', + recipients: { type: 'user', entityRefs: 'user:default/john.doe' }, channel: 'test', message: { msg: 'test' }, }, diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index 775af143f4..46995ee27c 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -134,8 +134,10 @@ export class SignalManager { const { channel, recipients, message } = eventPayload; const jsonMessage = JSON.stringify({ channel, message }); let users: string[] = []; - if (recipients !== null) { - users = Array.isArray(recipients) ? recipients : [recipients]; + if (recipients.type === 'user') { + users = Array.isArray(recipients.entityRefs) + ? recipients.entityRefs + : [recipients.entityRefs]; } // Actual websocket message sending @@ -143,9 +145,10 @@ export class SignalManager { if (!conn.subscriptions.has(channel)) { return; } - // Sending to all users can be done with null + + // Sending to all users can be done with broadcast if ( - recipients !== null && + recipients.type !== 'broadcast' && !conn.ownershipEntityRefs.some((ref: string) => users.includes(ref)) ) { return; diff --git a/plugins/signals-backend/src/service/standaloneServer.ts b/plugins/signals-backend/src/service/standaloneServer.ts index c92ab3797e..efb7ecedee 100644 --- a/plugins/signals-backend/src/service/standaloneServer.ts +++ b/plugins/signals-backend/src/service/standaloneServer.ts @@ -97,7 +97,7 @@ export async function startStandaloneServer( setInterval(() => { signals.publish({ - recipients: null, + recipients: { type: 'broadcast' }, channel: 'test', message: { hello: 'world' }, }); diff --git a/plugins/signals-node/README.md b/plugins/signals-node/README.md index c8b056577a..8d536e3955 100644 --- a/plugins/signals-node/README.md +++ b/plugins/signals-node/README.md @@ -91,13 +91,13 @@ To allow connections from the frontend, you should also install the `@backstage/ Once you have both of the backend plugins installed, you can utilize the signal service by calling the `publish` method. This will publish the message to all subscribers in the frontend. To send message to -all subscribers, you can use `null` as `recipients` parameter. +all subscribers, you can use `broadcast` type: ```ts // Periodic sending example setInterval(async () => { await signals.publish({ - recipients: null, + recipients: { type: 'broadcast' }, channel: 'my_plugin', message: { message: 'hello world', @@ -118,7 +118,7 @@ to work: eventBroker.publish({ topic: 'signals', eventPayload: { - recipients: ['user:default/user1'], + recipients: { type: 'user', entityRefs: ['user:default/user1'] }, message: { message: 'hello world', }, diff --git a/plugins/signals-node/api-report.md b/plugins/signals-node/api-report.md index 16f6277ff2..4d94fb07d9 100644 --- a/plugins/signals-node/api-report.md +++ b/plugins/signals-node/api-report.md @@ -21,7 +21,14 @@ export class DefaultSignalsService implements SignalsService { // @public (undocumented) export type SignalPayload = { - recipients: string[] | string | null; + recipients: + | { + type: 'user'; + entityRefs: string | string[]; + } + | { + type: 'broadcast'; + }; channel: string; message: TMessage; }; diff --git a/plugins/signals-node/src/DefaultSignalsService.test.ts b/plugins/signals-node/src/DefaultSignalsService.test.ts index 194b3c0077..982ca20d53 100644 --- a/plugins/signals-node/src/DefaultSignalsService.test.ts +++ b/plugins/signals-node/src/DefaultSignalsService.test.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { DefaultSignalsService } from './DefaultSignalsService'; +import { SignalPayload } from './types'; describe('DefaultSignalsService', () => { const mockEvents = { @@ -24,9 +25,9 @@ describe('DefaultSignalsService', () => { const service = DefaultSignalsService.create({ events: mockEvents }); it('should publish signal', () => { - const signal = { + const signal: SignalPayload = { channel: 'test-channel', - recipients: null, + recipients: { type: 'broadcast' }, message: { msg: 'hello world' }, }; service.publish(signal); diff --git a/plugins/signals-node/src/types.ts b/plugins/signals-node/src/types.ts index 9ea5ffa031..0225e23916 100644 --- a/plugins/signals-node/src/types.ts +++ b/plugins/signals-node/src/types.ts @@ -25,7 +25,9 @@ export type SignalsServiceOptions = { /** @public */ export type SignalPayload = { - recipients: string[] | string | null; + recipients: + | { type: 'user'; entityRefs: string | string[] } + | { type: 'broadcast' }; channel: string; message: TMessage; }; From 67b7b57ff14f01ec439b6615167cd08e0c3a4aa1 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 17:20:27 +0530 Subject: [PATCH 026/219] Added Material UI 4 import rule to plugins/playlist Signed-off-by: Aditya Kumar --- plugins/playlist/.eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/playlist/.eslintrc.js b/plugins/playlist/.eslintrc.js index d801c159a0..e487f765b2 100644 --- a/plugins/playlist/.eslintrc.js +++ b/plugins/playlist/.eslintrc.js @@ -2,4 +2,4 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { rules: { '@backstage/no-top-level-material-ui-4-imports': 'error', }, -}); \ No newline at end of file +}); From 7e84e2db88ada916549cb63950d8fd39a924ae7a Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 17:22:34 +0530 Subject: [PATCH 027/219] Added Material UI 4 import rule to plugins/rollbar Signed-off-by: Aditya Kumar --- plugins/rollbar/.eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/rollbar/.eslintrc.js b/plugins/rollbar/.eslintrc.js index d801c159a0..e487f765b2 100644 --- a/plugins/rollbar/.eslintrc.js +++ b/plugins/rollbar/.eslintrc.js @@ -2,4 +2,4 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { rules: { '@backstage/no-top-level-material-ui-4-imports': 'error', }, -}); \ No newline at end of file +}); From d3e45b429c4e5c6b9e2f6e773e0c12fbe6b7cc1a Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 14 Mar 2024 13:54:16 +0200 Subject: [PATCH 028/219] chore: rebase broadcast notifications Signed-off-by: Heikki Hellgren --- .changeset/dirty-hotels-sniff.md | 2 +- plugins/notifications-backend/src/service/router.ts | 8 ++++---- plugins/signals-backend/src/service/SignalManager.test.ts | 2 +- plugins/signals-backend/src/service/SignalManager.ts | 6 +++--- plugins/signals-node/README.md | 2 +- plugins/signals-node/api-report.md | 2 +- plugins/signals-node/src/types.ts | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.changeset/dirty-hotels-sniff.md b/.changeset/dirty-hotels-sniff.md index 6d7e97da78..111232999a 100644 --- a/.changeset/dirty-hotels-sniff.md +++ b/.changeset/dirty-hotels-sniff.md @@ -6,5 +6,5 @@ **BREAKING** Type definition added to signal recipients -Update to use `{type: 'broadcast'}` instead `null` and `{type: 'user', entityRefs: ''}` +Update to use `{type: 'broadcast'}` instead `null` and `{type: 'user', entityRef: ''}` instead string entity references diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 84960176ab..ffc3c3f1c0 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -286,7 +286,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: { type: 'user', entityRefs: [user] }, + recipients: { type: 'user', entityRef: [user] }, message: { action: 'notification_read', notification_ids: ids }, channel: 'notifications', }); @@ -296,7 +296,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: { type: 'user', entityRefs: [user] }, + recipients: { type: 'user', entityRef: [user] }, message: { action: 'notification_unread', notification_ids: ids }, channel: 'notifications', }); @@ -348,7 +348,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: null, + recipients: { type: 'broadcast' }, message: { action: 'new_notification', notification_id: ret.id, @@ -400,7 +400,7 @@ export async function createRouter( if (signals) { await signals.publish({ - recipients: { type: 'user', entityRefs: [user] }, + recipients: { type: 'user', entityRef: [user] }, message: { action: 'new_notification', notification_id: ret.id, diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts index f76d18079a..3ee99bb34b 100644 --- a/plugins/signals-backend/src/service/SignalManager.test.ts +++ b/plugins/signals-backend/src/service/SignalManager.test.ts @@ -152,7 +152,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - recipients: { type: 'user', entityRefs: 'user:default/john.doe' }, + recipients: { type: 'user', entityRef: 'user:default/john.doe' }, channel: 'test', message: { msg: 'test' }, }, diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index 46995ee27c..3211c51c9c 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -135,9 +135,9 @@ export class SignalManager { const jsonMessage = JSON.stringify({ channel, message }); let users: string[] = []; if (recipients.type === 'user') { - users = Array.isArray(recipients.entityRefs) - ? recipients.entityRefs - : [recipients.entityRefs]; + users = Array.isArray(recipients.entityRef) + ? recipients.entityRef + : [recipients.entityRef]; } // Actual websocket message sending diff --git a/plugins/signals-node/README.md b/plugins/signals-node/README.md index 8d536e3955..9315e65680 100644 --- a/plugins/signals-node/README.md +++ b/plugins/signals-node/README.md @@ -118,7 +118,7 @@ to work: eventBroker.publish({ topic: 'signals', eventPayload: { - recipients: { type: 'user', entityRefs: ['user:default/user1'] }, + recipients: { type: 'user', entityRef: 'user:default/user1' }, message: { message: 'hello world', }, diff --git a/plugins/signals-node/api-report.md b/plugins/signals-node/api-report.md index 4d94fb07d9..cf4ab84aff 100644 --- a/plugins/signals-node/api-report.md +++ b/plugins/signals-node/api-report.md @@ -24,7 +24,7 @@ export type SignalPayload = { recipients: | { type: 'user'; - entityRefs: string | string[]; + entityRef: string | string[]; } | { type: 'broadcast'; diff --git a/plugins/signals-node/src/types.ts b/plugins/signals-node/src/types.ts index 0225e23916..4decef6272 100644 --- a/plugins/signals-node/src/types.ts +++ b/plugins/signals-node/src/types.ts @@ -26,7 +26,7 @@ export type SignalsServiceOptions = { /** @public */ export type SignalPayload = { recipients: - | { type: 'user'; entityRefs: string | string[] } + | { type: 'user'; entityRef: string | string[] } | { type: 'broadcast' }; channel: string; message: TMessage; From 89cdfad015629ae262c7426147c266dac2aabebb Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 14 Mar 2024 17:29:02 +0530 Subject: [PATCH 029/219] Added Material UI 4 import rule to plugins/fossa Signed-off-by: Aditya Kumar --- .changeset/young-months-learn.md | 5 +++++ plugins/fossa/.eslintrc.js | 6 +++++- plugins/fossa/dev/index.tsx | 2 +- plugins/fossa/src/components/FossaCard/FossaCard.tsx | 3 ++- plugins/fossa/src/components/FossaPage/FossaPage.tsx | 4 ++-- 5 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 .changeset/young-months-learn.md diff --git a/.changeset/young-months-learn.md b/.changeset/young-months-learn.md new file mode 100644 index 0000000000..53ed048ff8 --- /dev/null +++ b/.changeset/young-months-learn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-fossa': patch +--- + +Adjusted MUI imports for better tree shaking diff --git a/plugins/fossa/.eslintrc.js b/plugins/fossa/.eslintrc.js index e2a53a6ad2..6f6668b53d 100644 --- a/plugins/fossa/.eslintrc.js +++ b/plugins/fossa/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/fossa/dev/index.tsx b/plugins/fossa/dev/index.tsx index 78c0ad380b..6560561bd1 100644 --- a/plugins/fossa/dev/index.tsx +++ b/plugins/fossa/dev/index.tsx @@ -21,7 +21,7 @@ import { catalogApiRef, EntityProvider, } from '@backstage/plugin-catalog-react'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React from 'react'; import { EntityFossaCard, fossaPlugin } from '../src'; import { FindingSummary, FossaApi, fossaApiRef } from '../src/api'; diff --git a/plugins/fossa/src/components/FossaCard/FossaCard.tsx b/plugins/fossa/src/components/FossaCard/FossaCard.tsx index fb6c2abdb0..d5be8362fa 100644 --- a/plugins/fossa/src/components/FossaCard/FossaCard.tsx +++ b/plugins/fossa/src/components/FossaCard/FossaCard.tsx @@ -18,7 +18,8 @@ import { useEntity, MissingAnnotationEmptyState, } from '@backstage/plugin-catalog-react'; -import { Grid, Tooltip } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import { DateTime } from 'luxon'; diff --git a/plugins/fossa/src/components/FossaPage/FossaPage.tsx b/plugins/fossa/src/components/FossaPage/FossaPage.tsx index 4b82fab220..f3b8114320 100644 --- a/plugins/fossa/src/components/FossaPage/FossaPage.tsx +++ b/plugins/fossa/src/components/FossaPage/FossaPage.tsx @@ -26,9 +26,9 @@ import { humanizeEntityRef, getEntityRelations, } from '@backstage/plugin-catalog-react'; -import { Tooltip } from '@material-ui/core'; +import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; -import { Skeleton } from '@material-ui/lab'; +import Skeleton from '@material-ui/lab/Skeleton'; import { DateTime } from 'luxon'; import * as React from 'react'; import { useMemo, useState } from 'react'; From bf90f646416d6428dc68394955055d99bf9a203b Mon Sep 17 00:00:00 2001 From: Marek Libra Date: Fri, 8 Mar 2024 10:41:54 +0100 Subject: [PATCH 030/219] fix: use orderField instead of sort,sortOrder for notifications To unify with the Catalog API. Signed-off-by: Marek Libra --- plugins/notifications-backend/package.json | 1 + .../DatabaseNotificationsStore.test.ts | 18 ++++------- .../database/DatabaseNotificationsStore.ts | 16 +++++----- .../src/database/NotificationsStore.ts | 9 ++++-- .../src/service/router.ts | 30 ++----------------- .../src/api/NotificationsClient.ts | 8 ++--- 6 files changed, 30 insertions(+), 52 deletions(-) diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 68c7b9b22b..d8e7c75d17 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -37,6 +37,7 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-notifications-common": "workspace:^", "@backstage/plugin-notifications-node": "workspace:^", diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts index e8cb9daca5..6204629821 100644 --- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts +++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts @@ -405,8 +405,7 @@ describe.each(databases.eachSupportedId())( it('should sort created asc', async () => { const notificationsCreatedAsc = await storage.getNotifications({ user, - sort: 'created', - sortOrder: 'asc', + orderField: [{ field: 'created', order: 'asc' }], }); expect(notificationsCreatedAsc.map(idOnly)).toEqual([id1, id3, id2]); }); @@ -414,8 +413,7 @@ describe.each(databases.eachSupportedId())( it('should sort created desc', async () => { const notificationsCreatedDesc = await storage.getNotifications({ user, - sort: 'created', - sortOrder: 'desc', + orderField: [{ field: 'created', order: 'desc' }], }); expect(notificationsCreatedDesc.map(idOnly)).toEqual([id2, id3, id1]); }); @@ -423,8 +421,7 @@ describe.each(databases.eachSupportedId())( it('should sort topic asc', async () => { const notificationsTopicAsc = await storage.getNotifications({ user, - sort: 'topic', - sortOrder: 'asc', + orderField: [{ field: 'topic', order: 'asc' }], }); expect(notificationsTopicAsc.map(idOnly)).toEqual([id1, id3, id2]); }); @@ -432,8 +429,7 @@ describe.each(databases.eachSupportedId())( it('should sort topic desc', async () => { const notificationsTopicDesc = await storage.getNotifications({ user, - sort: 'topic', - sortOrder: 'desc', + orderField: [{ field: 'topic', order: 'desc' }], }); expect(notificationsTopicDesc.map(idOnly)).toEqual([id2, id3, id1]); }); @@ -441,8 +437,7 @@ describe.each(databases.eachSupportedId())( it('should sort origin asc', async () => { const notificationsOrigin = await storage.getNotifications({ user, - sort: 'origin', - sortOrder: 'asc', + orderField: [{ field: 'origin', order: 'asc' }], limit: 2, offset: 0, }); @@ -452,8 +447,7 @@ describe.each(databases.eachSupportedId())( it('should sort origin desc', async () => { const notificationsOriginNext = await storage.getNotifications({ user, - sort: 'origin', - sortOrder: 'desc', + orderField: [{ field: 'origin', order: 'desc' }], limit: 2, offset: 2, }); diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts index 722489add4..f4f1f174be 100644 --- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts +++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts @@ -160,7 +160,7 @@ export class DatabaseNotificationsStore implements NotificationsStore { private getNotificationsBaseQuery = ( options: NotificationGetOptions | NotificationModifyOptions, ) => { - const { user } = options; + const { user, orderField } = options; const subQuery = this.db('notification') .select(NOTIFICATION_COLUMNS) @@ -171,10 +171,12 @@ export class DatabaseNotificationsStore implements NotificationsStore { q.where('user', user).orWhereNull('user'); }); - if (options.sort !== undefined && options.sort !== null) { - query.orderBy(options.sort, options.sortOrder ?? 'desc'); - } else if (options.sort !== null) { - query.orderBy('created', options.sortOrder ?? 'desc'); + if (orderField && orderField.length > 0) { + orderField.forEach(orderBy => { + query.orderBy(orderBy.field, orderBy.order); + }); + } else if (!orderField) { + query.orderBy('created', 'desc'); } if (options.createdAfter) { @@ -235,7 +237,7 @@ export class DatabaseNotificationsStore implements NotificationsStore { const countOptions: NotificationGetOptions = { ...options }; countOptions.limit = undefined; countOptions.offset = undefined; - countOptions.sort = null; + countOptions.orderField = []; const notificationQuery = this.getNotificationsBaseQuery(countOptions); const response = await notificationQuery.count('id as CNT'); return Number(response[0].CNT); @@ -266,7 +268,7 @@ export class DatabaseNotificationsStore implements NotificationsStore { async getStatus(options: NotificationGetOptions) { const notificationQuery = this.getNotificationsBaseQuery({ ...options, - sort: null, + orderField: [], }); const readSubQuery = notificationQuery .clone() diff --git a/plugins/notifications-backend/src/database/NotificationsStore.ts b/plugins/notifications-backend/src/database/NotificationsStore.ts index 77f7df61df..901ea1695d 100644 --- a/plugins/notifications-backend/src/database/NotificationsStore.ts +++ b/plugins/notifications-backend/src/database/NotificationsStore.ts @@ -20,6 +20,12 @@ import { NotificationStatus, } from '@backstage/plugin-notifications-common'; +/** @internal */ +export type EntityOrder = { + field: string; + order: 'asc' | 'desc'; +}; + // TODO: reuse the common part of the type with front-end /** @internal */ export type NotificationGetOptions = { @@ -28,8 +34,7 @@ export type NotificationGetOptions = { offset?: number; limit?: number; search?: string; - sort?: 'created' | 'topic' | 'origin' | null; - sortOrder?: 'asc' | 'desc'; + orderField?: EntityOrder[]; read?: boolean; saved?: boolean; createdAfter?: Date; diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 4a24763e40..959cd7e280 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -45,6 +45,7 @@ import { Notification, NotificationReadSignal, } from '@backstage/plugin-notifications-common'; +import { parseEntityOrderFieldParams } from '@backstage/plugin-catalog-backend'; /** @internal */ export interface RouterOptions { @@ -59,28 +60,6 @@ export interface RouterOptions { processors?: NotificationProcessor[]; } -const getSort = (input: string): NotificationGetOptions['sort'] | undefined => { - const valid: NotificationGetOptions['sort'][] = [ - 'created', - 'topic', - 'origin', - ]; - - if ((valid as string[]).includes(input)) { - return input as NotificationGetOptions['sort']; - } - return undefined; -}; - -const getSortOrder = (input: string): NotificationGetOptions['sortOrder'] => { - const valid: NotificationGetOptions['sortOrder'][] = ['asc', 'desc']; - - if ((valid as string[]).includes(input)) { - return input as NotificationGetOptions['sortOrder']; - } - return 'desc'; -}; - /** @internal */ export async function createRouter( options: RouterOptions, @@ -209,11 +188,8 @@ export async function createRouter( if (req.query.limit) { opts.limit = Number.parseInt(req.query.limit.toString(), 10); } - if (req.query.sort) { - opts.sort = getSort(req.query.sort.toString()); - } - if (req.query.sort_order) { - opts.sortOrder = getSortOrder(req.query.sort_order.toString()); + if (req.query.orderField) { + opts.orderField = parseEntityOrderFieldParams(req.query); } if (req.query.search) { opts.search = req.query.search.toString(); diff --git a/plugins/notifications/src/api/NotificationsClient.ts b/plugins/notifications/src/api/NotificationsClient.ts index 1e2e289bbe..047c594530 100644 --- a/plugins/notifications/src/api/NotificationsClient.ts +++ b/plugins/notifications/src/api/NotificationsClient.ts @@ -50,10 +50,10 @@ export class NotificationsClient implements NotificationsApi { queryString.append('offset', options.offset.toString(10)); } if (options?.sort !== undefined) { - queryString.append('sort', options.sort); - } - if (options?.sortOrder !== undefined) { - queryString.append('sort_order', options.sortOrder); + queryString.append( + 'orderField', + `${options.sort},${options?.sortOrder ?? 'desc'}`, + ); } if (options?.search) { queryString.append('search', options.search); From cd96173afbededbb6dc0511a5c28510d97dd6b77 Mon Sep 17 00:00:00 2001 From: Marek Libra Date: Fri, 8 Mar 2024 11:08:23 +0100 Subject: [PATCH 031/219] fix: use camelCase for createdAfter in the Notifications URL Instead of the former created_after. Signed-off-by: Marek Libra --- .changeset/poor-coats-boil.md | 6 ++++++ plugins/notifications-backend/src/service/router.ts | 4 ++-- plugins/notifications/src/api/NotificationsClient.test.ts | 2 +- plugins/notifications/src/api/NotificationsClient.ts | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/poor-coats-boil.md diff --git a/.changeset/poor-coats-boil.md b/.changeset/poor-coats-boil.md new file mode 100644 index 0000000000..b81843806b --- /dev/null +++ b/.changeset/poor-coats-boil.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-notifications-backend': minor +'@backstage/plugin-notifications': minor +--- + +notifications-backend URL query parameters changed from sort/sortOrder to orderField and created_after to createdAfter to unify with other plugins diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 959cd7e280..e72775f06f 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -206,8 +206,8 @@ export async function createRouter( opts.saved = false; // or keep undefined } - if (req.query.created_after) { - const sinceEpoch = Date.parse(String(req.query.created_after)); + if (req.query.createdAfter) { + const sinceEpoch = Date.parse(String(req.query.createdAfter)); if (isNaN(sinceEpoch)) { throw new InputError('Unexpected date format'); } diff --git a/plugins/notifications/src/api/NotificationsClient.test.ts b/plugins/notifications/src/api/NotificationsClient.test.ts index daf9e71232..e9acd04fc9 100644 --- a/plugins/notifications/src/api/NotificationsClient.test.ts +++ b/plugins/notifications/src/api/NotificationsClient.test.ts @@ -60,7 +60,7 @@ describe('NotificationsClient', () => { server.use( rest.get(`${mockBaseUrl}/`, (req, res, ctx) => { expect(req.url.search).toBe( - '?limit=10&offset=0&search=find+me&read=true&created_after=1970-01-01T00%3A00%3A00.005Z', + '?limit=10&offset=0&search=find+me&read=true&createdAfter=1970-01-01T00%3A00%3A00.005Z', ); return res(ctx.json(expectedResp)); }), diff --git a/plugins/notifications/src/api/NotificationsClient.ts b/plugins/notifications/src/api/NotificationsClient.ts index 047c594530..c4fffded9e 100644 --- a/plugins/notifications/src/api/NotificationsClient.ts +++ b/plugins/notifications/src/api/NotificationsClient.ts @@ -65,7 +65,7 @@ export class NotificationsClient implements NotificationsApi { queryString.append('saved', options.saved ? 'true' : 'false'); } if (options?.createdAfter !== undefined) { - queryString.append('created_after', options.createdAfter.toISOString()); + queryString.append('createdAfter', options.createdAfter.toISOString()); } if (options?.minimumSeverity !== undefined) { queryString.append('minimal_severity', options.minimumSeverity); From 5983bcd705719f89aa587cd8044c3f1c81b49337 Mon Sep 17 00:00:00 2001 From: Marek Libra Date: Thu, 14 Mar 2024 13:21:16 +0100 Subject: [PATCH 032/219] chore: implement parseEntityOrderFieldParams Based on the implemntation in plugins/catalog-backend. Signed-off-by: Marek Libra --- .changeset/poor-coats-boil.md | 2 +- plugins/notifications-backend/package.json | 1 - .../parseEntityOrderFieldParams.test.ts | 57 +++++++++++++++++ .../service/parseEntityOrderFieldParams.ts | 62 +++++++++++++++++++ .../src/service/router.ts | 2 +- 5 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 plugins/notifications-backend/src/service/parseEntityOrderFieldParams.test.ts create mode 100644 plugins/notifications-backend/src/service/parseEntityOrderFieldParams.ts diff --git a/.changeset/poor-coats-boil.md b/.changeset/poor-coats-boil.md index b81843806b..a9720614a5 100644 --- a/.changeset/poor-coats-boil.md +++ b/.changeset/poor-coats-boil.md @@ -3,4 +3,4 @@ '@backstage/plugin-notifications': minor --- -notifications-backend URL query parameters changed from sort/sortOrder to orderField and created_after to createdAfter to unify with other plugins +Notifications-backend URL query parameters changed from `sort/sortOrder` to `orderField` and `created_after` to `createdAfter` to unify with other plugins. diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index d8e7c75d17..68c7b9b22b 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -37,7 +37,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-notifications-common": "workspace:^", "@backstage/plugin-notifications-node": "workspace:^", diff --git a/plugins/notifications-backend/src/service/parseEntityOrderFieldParams.test.ts b/plugins/notifications-backend/src/service/parseEntityOrderFieldParams.test.ts new file mode 100644 index 0000000000..1d494df0ca --- /dev/null +++ b/plugins/notifications-backend/src/service/parseEntityOrderFieldParams.test.ts @@ -0,0 +1,57 @@ +/* + * 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 { parseEntityOrderFieldParams } from './parseEntityOrderFieldParams'; + +describe('parseEntityOrderFieldParams', () => { + it('supports no order fields', () => { + const result = parseEntityOrderFieldParams({}); + expect(result).toEqual(undefined); + }); + + it('supports single orderField', () => { + const result = parseEntityOrderFieldParams({ + orderField: ['metadata.name,desc'], + })!; + expect(result).toEqual([{ field: 'metadata.name', order: 'desc' }]); + }); + + it('supports single orderField without order', () => { + const result = parseEntityOrderFieldParams({ + orderField: ['metadata.name'], + })!; + expect(result).toEqual([{ field: 'metadata.name' }]); + }); + + it('supports multiple order fields', () => { + const result = parseEntityOrderFieldParams({ + orderField: ['metadata.name,desc', 'metadata.uid,asc'], + }); + + expect(result).toEqual([ + { field: 'metadata.name', order: 'desc' }, + { field: 'metadata.uid', order: 'asc' }, + ]); + }); + + it('throws if orderField order is not valid', () => { + expect(() => + parseEntityOrderFieldParams({ + orderField: ['metadata.name,desc', 'metadata.uid,invalid'], + }), + ).toThrow(/Invalid order field order/); + }); +}); diff --git a/plugins/notifications-backend/src/service/parseEntityOrderFieldParams.ts b/plugins/notifications-backend/src/service/parseEntityOrderFieldParams.ts new file mode 100644 index 0000000000..913e04993c --- /dev/null +++ b/plugins/notifications-backend/src/service/parseEntityOrderFieldParams.ts @@ -0,0 +1,62 @@ +/* + * 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 file is based on the plugins/catalog-backend + +import { InputError } from '@backstage/errors'; +import { EntityOrder } from '../database'; + +/** + * Takes a single unknown parameter and makes sure that it's a single string or + * an array of strings, and returns as an array. + */ +export function parseStringsParam( + param: unknown, + ctx: string, +): string[] | undefined { + if (param === undefined) { + return undefined; + } + + const array = [param].flat(); + if (array.some(p => typeof p !== 'string')) { + throw new InputError(`Invalid ${ctx}, not a string`); + } + + return array as string[]; +} + +export function parseEntityOrderFieldParams( + params: Record, +): EntityOrder[] | undefined { + const orderFieldStrings = parseStringsParam(params.orderField, 'orderField'); + if (!orderFieldStrings) { + return undefined; + } + + return orderFieldStrings.map(orderFieldString => { + const [field, order] = orderFieldString.split(','); + + if (order !== undefined && !isOrder(order)) { + throw new InputError('Invalid order field order, must be asc or desc'); + } + return { field, order }; + }); +} + +export function isOrder(order: string): order is 'asc' | 'desc' { + return ['asc', 'desc'].includes(order); +} diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index e72775f06f..f6b7e318f1 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -45,7 +45,7 @@ import { Notification, NotificationReadSignal, } from '@backstage/plugin-notifications-common'; -import { parseEntityOrderFieldParams } from '@backstage/plugin-catalog-backend'; +import { parseEntityOrderFieldParams } from './parseEntityOrderFieldParams'; /** @internal */ export interface RouterOptions { From 33ff583a34c3c820179a687cf6ba8a0122e77e1b Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 13:33:18 +0000 Subject: [PATCH 033/219] feat: add eslint rule for top level imports adds the `no-top-level-material-ui-4-imports` eslint rule to raise errors when top level imports are used. Signed-off-by: Timothy Deakin --- plugins/adr/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/adr/.eslintrc.js b/plugins/adr/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/adr/.eslintrc.js +++ b/plugins/adr/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 8ccfebe9515d7a05af387ea060c93ef253e49b47 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 13:35:00 +0000 Subject: [PATCH 034/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../EntityAdrContent/EntityAdrContent.tsx | 23 ++++++++----------- .../src/search/AdrSearchResultListItem.tsx | 12 ++++------ 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx b/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx index 5c8d244d26..450592c41c 100644 --- a/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx +++ b/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx @@ -41,19 +41,16 @@ import { useEntity, MissingAnnotationEmptyState, } from '@backstage/plugin-catalog-react'; -import { - Box, - Chip, - Collapse, - Grid, - List, - ListItem, - ListItemIcon, - ListItemText, - makeStyles, - Theme, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; +import Collapse from '@material-ui/core/Collapse'; +import Grid from '@material-ui/core/Grid'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import ExpandLess from '@material-ui/icons/ExpandLess'; import ExpandMore from '@material-ui/icons/ExpandMore'; import FolderIcon from '@material-ui/icons/Folder'; diff --git a/plugins/adr/src/search/AdrSearchResultListItem.tsx b/plugins/adr/src/search/AdrSearchResultListItem.tsx index f0c408df48..5110b302a9 100644 --- a/plugins/adr/src/search/AdrSearchResultListItem.tsx +++ b/plugins/adr/src/search/AdrSearchResultListItem.tsx @@ -15,13 +15,11 @@ */ import React, { ReactNode } from 'react'; -import { - Box, - Chip, - ListItemIcon, - ListItemText, - makeStyles, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import { parseEntityRef } from '@backstage/catalog-model'; import { Link } from '@backstage/core-components'; From 38b92a071a89789c61fd9c0b82595276bb756f6f Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 13:45:30 +0000 Subject: [PATCH 035/219] feat: add changeset Signed-off-by: Timothy Deakin --- .changeset/seven-bags-perform.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/seven-bags-perform.md diff --git a/.changeset/seven-bags-perform.md b/.changeset/seven-bags-perform.md new file mode 100644 index 0000000000..4633ad3b4f --- /dev/null +++ b/.changeset/seven-bags-perform.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the ADR plugin to migrate the Material UI imports. From b7d787cb373813dbc6b06f7c0652121586649cec Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 14:30:19 +0000 Subject: [PATCH 036/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/techdocs/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/techdocs/.eslintrc.js b/plugins/techdocs/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/techdocs/.eslintrc.js +++ b/plugins/techdocs/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 9507618b60cb3bc3cefdbf014c5ab5bd6bbdefbd Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 14:31:13 +0000 Subject: [PATCH 037/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../src/home/components/Grids/DocsCardGrid.tsx | 5 ++++- .../home/components/Grids/EntityListDocsGrid.tsx | 2 +- .../src/home/components/Tables/actions.tsx | 2 +- .../src/home/components/TechDocsCustomHome.tsx | 4 ++-- .../src/reader/components/TechDocsBuildLogs.tsx | 16 ++++++---------- .../TechDocsReaderPage/TechDocsAuthProvider.tsx | 2 +- .../TechDocsReaderPage/context.test.tsx | 2 +- .../TechDocsReaderPageContent.tsx | 3 ++- .../TechDocsReaderPageContentAddons.tsx | 2 +- .../components/TechDocsReaderPageContent/dom.tsx | 3 ++- .../TechDocsReaderPageHeader.tsx | 4 ++-- .../TechDocsReaderPageSubheader.tsx | 10 +--------- .../reader/components/TechDocsStateIndicator.tsx | 6 ++++-- .../src/reader/transformers/copyToClipboard.tsx | 11 ++++------- .../reader/transformers/styles/rules/types.ts | 2 +- .../transformers/styles/rules/variables.ts | 3 ++- .../reader/transformers/styles/transformer.ts | 2 +- .../components/TechDocsSearchResultListItem.tsx | 4 +++- 18 files changed, 39 insertions(+), 44 deletions(-) diff --git a/plugins/techdocs/src/home/components/Grids/DocsCardGrid.tsx b/plugins/techdocs/src/home/components/Grids/DocsCardGrid.tsx index 8843249291..d2947b5f64 100644 --- a/plugins/techdocs/src/home/components/Grids/DocsCardGrid.tsx +++ b/plugins/techdocs/src/home/components/Grids/DocsCardGrid.tsx @@ -23,7 +23,10 @@ import { ItemCardGrid, ItemCardHeader, } from '@backstage/core-components'; -import { Card, CardActions, CardContent, CardMedia } from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; +import CardMedia from '@material-ui/core/CardMedia'; import React from 'react'; /** diff --git a/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.tsx b/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.tsx index b86dde8226..2f62c24646 100644 --- a/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.tsx +++ b/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.tsx @@ -28,7 +28,7 @@ import { useEntityList, useEntityOwnership, } from '@backstage/plugin-catalog-react'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; /** diff --git a/plugins/techdocs/src/home/components/Tables/actions.tsx b/plugins/techdocs/src/home/components/Tables/actions.tsx index e722a9929b..c95dd8b94c 100644 --- a/plugins/techdocs/src/home/components/Tables/actions.tsx +++ b/plugins/techdocs/src/home/components/Tables/actions.tsx @@ -17,7 +17,7 @@ import React from 'react'; import ShareIcon from '@material-ui/icons/Share'; import { DocsTableRow } from './types'; -import { withStyles } from '@material-ui/styles'; +import { withStyles } from '@material-ui/core/styles'; import Star from '@material-ui/icons/Star'; import StarBorder from '@material-ui/icons/StarBorder'; diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx index 7023560e83..3cfbc3c257 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx @@ -16,8 +16,8 @@ import React, { useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; -import { makeStyles } from '@material-ui/core'; -import { CSSProperties } from '@material-ui/styles'; +import { makeStyles } from '@material-ui/core/styles'; +import CSSProperties from '@material-ui/styles/CSSProperties'; import { CATALOG_FILTER_EXISTS, catalogApiRef, diff --git a/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx b/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx index 01e638e59c..483c60d607 100644 --- a/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsBuildLogs.tsx @@ -15,16 +15,12 @@ */ import { LogViewer } from '@backstage/core-components'; -import { - Button, - createStyles, - Drawer, - Grid, - IconButton, - makeStyles, - Theme, - Typography, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Drawer from '@material-ui/core/Drawer'; +import Grid from '@material-ui/core/Grid'; +import IconButton from '@material-ui/core/IconButton'; +import Typography from '@material-ui/core/Typography'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import Close from '@material-ui/icons/Close'; import React, { useState } from 'react'; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx index d248af6d1f..baeb809a6c 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx @@ -19,7 +19,7 @@ import { ErrorPanel } from '@backstage/core-components'; import { techdocsApiRef } from '@backstage/plugin-techdocs-react'; import { useApi, useApp } from '@backstage/core-plugin-api'; import useAsyncRetry from 'react-use/lib/useAsyncRetry'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; type TechDocsRefreshCookieMessage = MessageEvent<{ action: string; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx index 670653ce6b..cc072fc5b1 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { renderHook, waitFor } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/core'; +import ThemeProvider from '@material-ui/core/ThemeProvider'; import { lightTheme } from '@backstage/theme'; import { TestApiProvider } from '@backstage/test-utils'; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx index f4c5ad8745..3692ed22d3 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx @@ -16,7 +16,8 @@ import React, { useCallback, useEffect } from 'react'; -import { makeStyles, Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; import { TechDocsShadowDom, diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.tsx index 744fd8c732..edcc90359d 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { Portal } from '@material-ui/core'; +import Portal from '@material-ui/core/Portal'; import { useTechDocsAddons, TechDocsAddonLocations as locations, diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx index bf8a1309b2..de2460a543 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx @@ -16,7 +16,8 @@ import { useCallback, useEffect, useState } from 'react'; -import { useTheme, useMediaQuery } from '@material-ui/core'; +import useMediaQuery from '@material-ui/core/useMediaQuery'; +import { useTheme } from '@material-ui/core/styles'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { useAnalytics, useApi } from '@backstage/core-plugin-api'; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx index d84c5c5347..0399dea4f7 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx @@ -17,8 +17,8 @@ import React, { PropsWithChildren, useEffect } from 'react'; import Helmet from 'react-helmet'; -import { Grid } from '@material-ui/core'; -import { Skeleton } from '@material-ui/lab'; +import Grid from '@material-ui/core/Grid'; +import Skeleton from '@material-ui/lab/Skeleton'; import { useTheme } from '@material-ui/core/styles'; import CodeIcon from '@material-ui/icons/Code'; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx index 85f04655fd..eea342cb7d 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx @@ -16,15 +16,7 @@ import React, { MouseEvent, useState, useCallback } from 'react'; -import { - Box, - makeStyles, - Toolbar, - ToolbarProps, - Menu, - Tooltip, - IconButton, -} from '@material-ui/core'; +import Box, { ToolbarProps } from '@material-ui/core/Box'; import SettingsIcon from '@material-ui/icons/Settings'; import { diff --git a/plugins/techdocs/src/reader/components/TechDocsStateIndicator.tsx b/plugins/techdocs/src/reader/components/TechDocsStateIndicator.tsx index 772c92aeff..f27b8e5430 100644 --- a/plugins/techdocs/src/reader/components/TechDocsStateIndicator.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsStateIndicator.tsx @@ -15,8 +15,10 @@ */ import React from 'react'; -import { CircularProgress, Button, makeStyles } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Button from '@material-ui/core/Button'; +import { makeStyles } from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; import { TechDocsBuildLogs } from './TechDocsBuildLogs'; import { TechDocsNotFound } from './TechDocsNotFound'; diff --git a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx index 1fd9d179a3..a8fc5079ae 100644 --- a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx +++ b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx @@ -16,13 +16,10 @@ import React, { useState, useCallback } from 'react'; import { renderReactElement } from './renderReactElement'; -import { - withStyles, - Theme, - ThemeProvider, - SvgIcon, - Tooltip, -} from '@material-ui/core'; +import ThemeProvider from '@material-ui/core/ThemeProvider'; +import SvgIcon from '@material-ui/core/SvgIcon'; +import Tooltip from '@material-ui/core/Tooltip'; +import { withStyles, Theme } from '@material-ui/core/styles'; import IconButton from '@material-ui/core/IconButton'; import type { Transformer } from './transformer'; import useCopyToClipboard from 'react-use/lib/useCopyToClipboard'; diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/types.ts b/plugins/techdocs/src/reader/transformers/styles/rules/types.ts index defdc4ad90..e2747ad85a 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/types.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Theme } from '@material-ui/core'; +import { Theme } from '@material-ui/core/styles'; /** * A Backstage sidebar object that contains properties such as its pin state. diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts b/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts index 07a667ed8e..bf8117474b 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { alpha, lighten } from '@material-ui/core'; +import alpha from '@material-ui/core/alpha'; +import lighten from '@material-ui/core/lighten'; import { RuleOptions } from './types'; export default ({ theme }: RuleOptions) => ` diff --git a/plugins/techdocs/src/reader/transformers/styles/transformer.ts b/plugins/techdocs/src/reader/transformers/styles/transformer.ts index dee77fb1ed..b1b1b437c2 100644 --- a/plugins/techdocs/src/reader/transformers/styles/transformer.ts +++ b/plugins/techdocs/src/reader/transformers/styles/transformer.ts @@ -15,7 +15,7 @@ */ import { useCallback, useMemo } from 'react'; -import { useTheme } from '@material-ui/core'; +import { useTheme } from '@material-ui/core/styles'; import { useSidebarPinState } from '@backstage/core-components'; import { Transformer } from '../transformer'; import { rules } from './rules'; diff --git a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx index eae4ee7ce9..4f7deab47c 100644 --- a/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx +++ b/plugins/techdocs/src/search/components/TechDocsSearchResultListItem.tsx @@ -15,7 +15,9 @@ */ import React, { PropsWithChildren, ReactNode } from 'react'; -import { ListItemIcon, ListItemText, makeStyles } from '@material-ui/core'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import { Link } from '@backstage/core-components'; import { ResultHighlight } from '@backstage/plugin-search-common'; From 28f27f0877eb4742a5a7472ab34ab352b432254b Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 14:48:11 +0000 Subject: [PATCH 038/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/smooth-fireants-notice.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smooth-fireants-notice.md diff --git a/.changeset/smooth-fireants-notice.md b/.changeset/smooth-fireants-notice.md new file mode 100644 index 0000000000..7a6322ab28 --- /dev/null +++ b/.changeset/smooth-fireants-notice.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` to aid with the migration to Material UI v5. From 1af1bdced149dc9fec811eac78270325731357de Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 15:58:06 +0000 Subject: [PATCH 039/219] fix: mui imports Signed-off-by: Timothy Deakin --- .../techdocs/src/home/components/TechDocsCustomHome.tsx | 2 +- .../reader/components/TechDocsReaderPage/context.test.tsx | 2 +- .../TechDocsReaderPageSubheader.tsx | 8 +++++++- .../techdocs/src/reader/transformers/copyToClipboard.tsx | 2 +- .../src/reader/transformers/styles/rules/variables.ts | 3 +-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx index 3cfbc3c257..95c50d3912 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx @@ -17,7 +17,7 @@ import React, { useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { makeStyles } from '@material-ui/core/styles'; -import CSSProperties from '@material-ui/styles/CSSProperties'; +import { CSSProperties } from '@material-ui/styles/withStyles'; import { CATALOG_FILTER_EXISTS, catalogApiRef, diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx index cc072fc5b1..d8e87c3686 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/context.test.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { renderHook, waitFor } from '@testing-library/react'; -import ThemeProvider from '@material-ui/core/ThemeProvider'; +import { ThemeProvider } from '@material-ui/core/styles'; import { lightTheme } from '@backstage/theme'; import { TestApiProvider } from '@backstage/test-utils'; diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx index eea342cb7d..64faaa1ea3 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx @@ -16,7 +16,13 @@ import React, { MouseEvent, useState, useCallback } from 'react'; -import Box, { ToolbarProps } from '@material-ui/core/Box'; +import { makeStyles } from '@material-ui/core/styles'; +import IconButton from '@material-ui/core/IconButton'; +import Toolbar from '@material-ui/core/Toolbar'; +import { ToolbarProps } from '@material-ui/core/Toolbar'; +import Tooltip from '@material-ui/core/Tooltip'; +import Menu from '@material-ui/core/Menu'; +import Box from '@material-ui/core/Box'; import SettingsIcon from '@material-ui/icons/Settings'; import { diff --git a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx index a8fc5079ae..0d178c2970 100644 --- a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx +++ b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx @@ -16,7 +16,7 @@ import React, { useState, useCallback } from 'react'; import { renderReactElement } from './renderReactElement'; -import ThemeProvider from '@material-ui/core/ThemeProvider'; +import { ThemeProvider } from '@material-ui/core/styles'; import SvgIcon from '@material-ui/core/SvgIcon'; import Tooltip from '@material-ui/core/Tooltip'; import { withStyles, Theme } from '@material-ui/core/styles'; diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts b/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts index bf8117474b..a858d17354 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import alpha from '@material-ui/core/alpha'; -import lighten from '@material-ui/core/lighten'; +import { alpha, lighten } from '@material-ui/core/styles'; import { RuleOptions } from './types'; export default ({ theme }: RuleOptions) => ` From af5f7a66c930db75ffd3a0ce2aa2bfd09dae8a06 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 14 Mar 2024 17:07:23 +0100 Subject: [PATCH 040/219] backend-app-api: fix feature detection trying to load frontend packages Signed-off-by: Patrik Oldsberg --- .changeset/two-hornets-allow.md | 5 +++++ .../src/alpha/featureDiscoveryServiceFactory.ts | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 .changeset/two-hornets-allow.md diff --git a/.changeset/two-hornets-allow.md b/.changeset/two-hornets-allow.md new file mode 100644 index 0000000000..a748578580 --- /dev/null +++ b/.changeset/two-hornets-allow.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +The experimental feature discovery service exported at the `/alpha` sub-path will no longer attempt to load packages that are not Backstage backend packages. diff --git a/packages/backend-app-api/src/alpha/featureDiscoveryServiceFactory.ts b/packages/backend-app-api/src/alpha/featureDiscoveryServiceFactory.ts index b68475a77b..5943261b0b 100644 --- a/packages/backend-app-api/src/alpha/featureDiscoveryServiceFactory.ts +++ b/packages/backend-app-api/src/alpha/featureDiscoveryServiceFactory.ts @@ -29,6 +29,13 @@ import { resolve as resolvePath, dirname } from 'path'; import fs from 'fs-extra'; import { BackstagePackageJson } from '@backstage/cli-node'; +const DETECTED_PACKAGE_ROLES = [ + 'node-library', + 'backend', + 'backend-plugin', + 'backend-plugin-module', +]; + /** @internal */ async function findClosestPackageDir( searchDir: string, @@ -106,8 +113,11 @@ class PackageDiscoveryService implements FeatureDiscoveryService { const depPkg = require(require.resolve(`${name}/package.json`, { paths: [packageDir], })) as BackstagePackageJson; - if (!depPkg?.backstage || depPkg?.backstage?.role === 'cli') { - continue; // Not a backstage package, ignore + if ( + !depPkg?.backstage?.role || + !DETECTED_PACKAGE_ROLES.includes(depPkg.backstage.role) + ) { + continue; // Not a backstage backend package, ignore } const exportedModulePaths = [ From 6d5aba5b8f2069e13b1cfcae0090a890b87d7d3a Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 16:27:30 +0000 Subject: [PATCH 041/219] chore: update api report Signed-off-by: Timothy Deakin --- plugins/techdocs/api-report.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/techdocs/api-report.md b/plugins/techdocs/api-report.md index dd26cf2f98..06b972bf5f 100644 --- a/plugins/techdocs/api-report.md +++ b/plugins/techdocs/api-report.md @@ -9,7 +9,7 @@ import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; -import { CSSProperties } from '@material-ui/styles'; +import { CSSProperties } from '@material-ui/styles/withStyles'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; import { FetchApi } from '@backstage/core-plugin-api'; @@ -29,7 +29,7 @@ import { TechDocsApi as TechDocsApi_2 } from '@backstage/plugin-techdocs-react'; import { TechDocsEntityMetadata as TechDocsEntityMetadata_2 } from '@backstage/plugin-techdocs-react'; import { TechDocsMetadata as TechDocsMetadata_2 } from '@backstage/plugin-techdocs-react'; import { TechDocsStorageApi as TechDocsStorageApi_2 } from '@backstage/plugin-techdocs-react'; -import { ToolbarProps } from '@material-ui/core'; +import { ToolbarProps } from '@material-ui/core/Toolbar'; import { UserListFilterKind } from '@backstage/plugin-catalog-react'; // @public From 8f43e007c45fb716b80db5ba36ad13d12842023a Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:00:53 +0000 Subject: [PATCH 042/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/badges/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/badges/.eslintrc.js b/plugins/badges/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/badges/.eslintrc.js +++ b/plugins/badges/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 9b05f70a6519e54962e7cc443d5f44faa8e7a7c2 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:01:36 +0000 Subject: [PATCH 043/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../src/components/EntityBadgesDialog.tsx | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/plugins/badges/src/components/EntityBadgesDialog.tsx b/plugins/badges/src/components/EntityBadgesDialog.tsx index 097bba5581..61914bb756 100644 --- a/plugins/badges/src/components/EntityBadgesDialog.tsx +++ b/plugins/badges/src/components/EntityBadgesDialog.tsx @@ -15,17 +15,15 @@ */ import { useAsyncEntity } from '@backstage/plugin-catalog-react'; -import { - Box, - Button, - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, - useMediaQuery, - useTheme, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import useMediaQuery from '@material-ui/core/useMediaQuery'; +import { useTheme } from '@material-ui/core/styles'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { badgesApiRef } from '../api'; From 944de94c11bc6eb9243f5d2a343d2ec7bc3cca04 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:03:04 +0000 Subject: [PATCH 044/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/lemon-mails-report.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/lemon-mails-report.md diff --git a/.changeset/lemon-mails-report.md b/.changeset/lemon-mails-report.md new file mode 100644 index 0000000000..5b3c805c07 --- /dev/null +++ b/.changeset/lemon-mails-report.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-badges': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` to aid with the migration to Material UI v5. From 4be0005a67816e0613b5621459633af141dd1558 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:11:29 +0000 Subject: [PATCH 045/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/bitrise/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/bitrise/.eslintrc.js b/plugins/bitrise/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/bitrise/.eslintrc.js +++ b/plugins/bitrise/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 29db6569cd984dcca37e6a5081d3e59595552dba Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:12:22 +0000 Subject: [PATCH 046/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../BitriseArtifactsComponent.tsx | 12 +++++------- .../BitriseBuildDetailsDialog.tsx | 14 ++++++-------- .../BitriseBuildsTableComponent.tsx | 4 ++-- .../BitriseDownloadArtifactComponent.tsx | 6 ++++-- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/plugins/bitrise/src/components/BitriseArtifactsComponent/BitriseArtifactsComponent.tsx b/plugins/bitrise/src/components/BitriseArtifactsComponent/BitriseArtifactsComponent.tsx index cdc425ae53..8c0b1366e3 100644 --- a/plugins/bitrise/src/components/BitriseArtifactsComponent/BitriseArtifactsComponent.tsx +++ b/plugins/bitrise/src/components/BitriseArtifactsComponent/BitriseArtifactsComponent.tsx @@ -16,15 +16,13 @@ import React from 'react'; import { BitriseBuildResult } from '../../api/bitriseApi.model'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { BitriseDownloadArtifactComponent } from '../BitriseDownloadArtifactComponent'; import { useBitriseArtifacts } from '../useBitriseArtifacts'; -import { - List, - ListItem, - ListItemSecondaryAction, - ListItemText, -} from '@material-ui/core'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemText from '@material-ui/core/ListItemText'; import { Progress } from '@backstage/core-components'; type BitriseArtifactsComponentComponentProps = { diff --git a/plugins/bitrise/src/components/BitriseBuildDetailsDialog/BitriseBuildDetailsDialog.tsx b/plugins/bitrise/src/components/BitriseBuildDetailsDialog/BitriseBuildDetailsDialog.tsx index b59aef7e68..bcaf724945 100644 --- a/plugins/bitrise/src/components/BitriseBuildDetailsDialog/BitriseBuildDetailsDialog.tsx +++ b/plugins/bitrise/src/components/BitriseBuildDetailsDialog/BitriseBuildDetailsDialog.tsx @@ -17,14 +17,12 @@ import React, { useState } from 'react'; import { BitriseBuildResult } from '../../api/bitriseApi.model'; import { BitriseArtifactsComponent } from '../BitriseArtifactsComponent'; -import { - Chip, - Dialog, - DialogContent, - DialogTitle, - IconButton, - makeStyles, -} from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; +import Dialog from '@material-ui/core/Dialog'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import IconButton from '@material-ui/core/IconButton'; +import { makeStyles } from '@material-ui/core/styles'; import CloudDownload from '@material-ui/icons/CloudDownload'; import CloseIcon from '@material-ui/icons/Close'; diff --git a/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx b/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx index 3f6ebf93f4..3acbd20108 100644 --- a/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx +++ b/plugins/bitrise/src/components/BitriseBuildsTableComponent/BitriseBuildsTableComponent.tsx @@ -15,8 +15,8 @@ */ import React, { useState } from 'react'; -import { Alert } from '@material-ui/lab'; -import { Button } from '@material-ui/core'; +import Alert from '@material-ui/lab/Alert'; +import Button from '@material-ui/core/Button'; import GitHubIcon from '@material-ui/icons/GitHub'; import { useBitriseBuilds } from '../../hooks/useBitriseBuilds'; import { diff --git a/plugins/bitrise/src/components/BitriseDownloadArtifactComponent/BitriseDownloadArtifactComponent.tsx b/plugins/bitrise/src/components/BitriseDownloadArtifactComponent/BitriseDownloadArtifactComponent.tsx index 4ecda73d04..58248addfc 100644 --- a/plugins/bitrise/src/components/BitriseDownloadArtifactComponent/BitriseDownloadArtifactComponent.tsx +++ b/plugins/bitrise/src/components/BitriseDownloadArtifactComponent/BitriseDownloadArtifactComponent.tsx @@ -16,10 +16,12 @@ import React from 'react'; import CloudDownload from '@material-ui/icons/CloudDownload'; -import { CircularProgress, IconButton, Tooltip } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import IconButton from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; import LinkIcon from '@material-ui/icons/Link'; import { useBitriseArtifactDetails } from '../useBitriseArtifactDetails'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; type BitriseDownloadArtifactComponentProps = { appSlug: string; From afdee56e8d49408aebf03b956e0e5a2bdcba8817 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:13:37 +0000 Subject: [PATCH 047/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/curly-socks-enjoy.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curly-socks-enjoy.md diff --git a/.changeset/curly-socks-enjoy.md b/.changeset/curly-socks-enjoy.md new file mode 100644 index 0000000000..99c402f88d --- /dev/null +++ b/.changeset/curly-socks-enjoy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-bitrise': patch +--- + +Added the `no-top-level-material-ui-4-import` ESLint rule to the Bitrise plugin to aid with the migration to Material UI v5. From 8721510032d0ad3d57ce400dc5920fd3d8fe94e4 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:22:45 +0000 Subject: [PATCH 048/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/catalog/.eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog/.eslintrc.js b/plugins/catalog/.eslintrc.js index 45bb6db521..157ee11e08 100644 --- a/plugins/catalog/.eslintrc.js +++ b/plugins/catalog/.eslintrc.js @@ -1,5 +1,6 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { rules: { 'testing-library/prefer-screen-queries': 'error', + '@backstage/no-top-level-material-ui-4-imports': 'error', }, }); From c293e58692b6907352aac6ee8949c1063b3dd8d4 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:24:07 +0000 Subject: [PATCH 049/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../src/components/AboutCard/AboutCard.tsx | 14 ++++++-------- .../src/components/AboutCard/AboutContent.tsx | 4 +++- .../src/components/AboutCard/AboutField.tsx | 4 +++- .../CatalogKindHeader/CatalogKindHeader.tsx | 12 ++++-------- .../CatalogSearchResultListItem.tsx | 14 ++++++-------- .../src/components/CatalogTable/columns.tsx | 2 +- .../EntityContextMenu/EntityContextMenu.tsx | 18 ++++++++---------- .../EntityContextMenu/UnregisterEntity.tsx | 4 +++- .../EntityLabelsCard/EntityLabelsCard.tsx | 3 ++- .../EntityLabelsEmptyState.tsx | 4 +++- .../components/EntityLayout/EntityLayout.tsx | 5 +++-- .../EntityLinksCard/EntityLinksEmptyState.tsx | 4 +++- .../components/EntityLinksCard/IconLink.tsx | 4 +++- .../EntityLinksCard/LinksGridList.tsx | 3 ++- .../EntityLinksCard/useDynamicColumns.tsx | 3 ++- .../EntityNotFound/EntityNotFound.tsx | 4 +++- .../components/EntityNotFound/Illo/Illo.tsx | 2 +- .../EntityOrphanWarning/DeleteEntityDialog.tsx | 5 ++++- .../EntityOrphanWarning.tsx | 2 +- .../EntityProcessingErrorsPanel.tsx | 2 +- .../EntityRelationWarning.tsx | 4 ++-- .../RelatedEntitiesCard.tsx | 2 +- .../SystemDiagramCard/SystemDiagramCard.tsx | 4 +++- 23 files changed, 68 insertions(+), 55 deletions(-) diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.tsx index 763f6fc094..09e1790f3b 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.tsx @@ -20,14 +20,12 @@ import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model'; -import { - Card, - CardContent, - CardHeader, - Divider, - IconButton, - makeStyles, -} from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; +import Divider from '@material-ui/core/Divider'; +import IconButton from '@material-ui/core/IconButton'; +import { makeStyles } from '@material-ui/core/styles'; import { HeaderIconLinkRow, IconLinkVerticalProps, diff --git a/plugins/catalog/src/components/AboutCard/AboutContent.tsx b/plugins/catalog/src/components/AboutCard/AboutContent.tsx index 245308cee2..571f2018dd 100644 --- a/plugins/catalog/src/components/AboutCard/AboutContent.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutContent.tsx @@ -25,7 +25,9 @@ import { getEntityRelations, } from '@backstage/plugin-catalog-react'; import { JsonArray } from '@backstage/types'; -import { Chip, Grid, makeStyles } from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; import { MarkdownContent } from '@backstage/core-components'; import React from 'react'; import { AboutField } from './AboutField'; diff --git a/plugins/catalog/src/components/AboutCard/AboutField.tsx b/plugins/catalog/src/components/AboutCard/AboutField.tsx index 28c22bff37..7587867af0 100644 --- a/plugins/catalog/src/components/AboutCard/AboutField.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutField.tsx @@ -15,7 +15,9 @@ */ import { useElementFilter } from '@backstage/core-plugin-api'; -import { Grid, makeStyles, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import React from 'react'; const useStyles = makeStyles(theme => ({ diff --git a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx index 1455c2a182..58fd0cfc0f 100644 --- a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx +++ b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx @@ -15,14 +15,10 @@ */ import React, { useEffect, useState, useMemo } from 'react'; -import { - createStyles, - InputBase, - makeStyles, - MenuItem, - Select, - Theme, -} from '@material-ui/core'; +import InputBase from '@material-ui/core/InputBase'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import { EntityKindFilter, useEntityList, diff --git a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx index f2ef05b128..32c86f38b7 100644 --- a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx +++ b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx @@ -15,14 +15,12 @@ */ import React, { ReactNode } from 'react'; -import { - Box, - Chip, - ListItemIcon, - ListItemText, - Typography, - makeStyles, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import { Link } from '@backstage/core-components'; import { IndexableDocument, diff --git a/plugins/catalog/src/components/CatalogTable/columns.tsx b/plugins/catalog/src/components/CatalogTable/columns.tsx index a955aaadb9..86e8ced86a 100644 --- a/plugins/catalog/src/components/CatalogTable/columns.tsx +++ b/plugins/catalog/src/components/CatalogTable/columns.tsx @@ -19,7 +19,7 @@ import { EntityRefLink, EntityRefLinks, } from '@backstage/plugin-catalog-react'; -import { Chip } from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; import { CatalogTableRow } from './types'; import { OverflowTooltip, TableColumn } from '@backstage/core-components'; import { Entity } from '@backstage/catalog-model'; diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 0fc746f455..7c94887a37 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -14,16 +14,14 @@ * limitations under the License. */ -import { - Divider, - IconButton, - ListItemIcon, - ListItemText, - MenuItem, - MenuList, - Popover, - Tooltip, -} from '@material-ui/core'; +import Divider from '@material-ui/core/Divider'; +import IconButton from '@material-ui/core/IconButton'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; +import MenuList from '@material-ui/core/MenuList'; +import Popover from '@material-ui/core/Popover'; +import Tooltip from '@material-ui/core/Tooltip'; import { Theme, makeStyles } from '@material-ui/core/styles'; import BugReportIcon from '@material-ui/icons/BugReport'; import MoreVert from '@material-ui/icons/MoreVert'; diff --git a/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx b/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx index 05044bf935..3de890097b 100644 --- a/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx @@ -15,7 +15,9 @@ */ import React from 'react'; -import { ListItemIcon, ListItemText, MenuItem } from '@material-ui/core'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; import CancelIcon from '@material-ui/icons/Cancel'; type VisibleType = 'visible' | 'hidden' | 'disable'; diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx index 500c651cc0..0b1448bb1f 100644 --- a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx +++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx @@ -23,7 +23,8 @@ import { TableColumn, } from '@backstage/core-components'; import { EntityLabelsEmptyState } from './EntityLabelsEmptyState'; -import { makeStyles, Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; /** @public */ export interface EntityLabelsCardProps { diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx index 8878cb827f..5f5db0baa5 100644 --- a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx +++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { Button, makeStyles, Typography } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import React from 'react'; import { CodeSnippet } from '@backstage/core-components'; diff --git a/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx b/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx index 8e11f92599..274972283f 100644 --- a/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx +++ b/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx @@ -46,8 +46,9 @@ import { UnregisterEntityDialog, useAsyncEntity, } from '@backstage/plugin-catalog-react'; -import { Box, TabProps } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +import Box from '@material-ui/core/Box'; +import { TabProps } from '@material-ui/core/Tab'; +import Alert from '@material-ui/lab/Alert'; import React, { useEffect, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { EntityContextMenu } from '../EntityContextMenu/EntityContextMenu'; diff --git a/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx b/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx index 59ab3f3db2..81009c5393 100644 --- a/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { Button, makeStyles, Typography } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import React from 'react'; import { CodeSnippet } from '@backstage/core-components'; diff --git a/plugins/catalog/src/components/EntityLinksCard/IconLink.tsx b/plugins/catalog/src/components/EntityLinksCard/IconLink.tsx index 9afdd1f1da..77ee12bd36 100644 --- a/plugins/catalog/src/components/EntityLinksCard/IconLink.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/IconLink.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { makeStyles, Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import LanguageIcon from '@material-ui/icons/Language'; import React from 'react'; import { Link } from '@backstage/core-components'; diff --git a/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx b/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx index 7861b177ce..9e046abf76 100644 --- a/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { ImageList, ImageListItem } from '@material-ui/core'; +import ImageList from '@material-ui/core/ImageList'; +import ImageListItem from '@material-ui/core/ImageListItem'; import React from 'react'; import { IconLink } from './IconLink'; import { ColumnBreakpoints } from './types'; diff --git a/plugins/catalog/src/components/EntityLinksCard/useDynamicColumns.tsx b/plugins/catalog/src/components/EntityLinksCard/useDynamicColumns.tsx index cb6868632c..75da59b4ec 100644 --- a/plugins/catalog/src/components/EntityLinksCard/useDynamicColumns.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/useDynamicColumns.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Theme, useMediaQuery } from '@material-ui/core'; +import useMediaQuery from '@material-ui/core/useMediaQuery'; +import { Theme } from '@material-ui/core/styles'; import { Breakpoint, ColumnBreakpoints } from './types'; const colDefaults: ColumnBreakpoints = { diff --git a/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx b/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx index d8d9fe0855..479edf3984 100644 --- a/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx +++ b/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx @@ -15,7 +15,9 @@ */ import React from 'react'; -import { Grid, Button, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import { Illo } from './Illo'; diff --git a/plugins/catalog/src/components/EntityNotFound/Illo/Illo.tsx b/plugins/catalog/src/components/EntityNotFound/Illo/Illo.tsx index 03b23ec6b0..295db57f03 100644 --- a/plugins/catalog/src/components/EntityNotFound/Illo/Illo.tsx +++ b/plugins/catalog/src/components/EntityNotFound/Illo/Illo.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import IlloSvgUrl from './illo.svg'; const useStyles = makeStyles(theme => ({ diff --git a/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx b/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx index fc1391152a..603f2040d9 100644 --- a/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx +++ b/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx @@ -16,7 +16,10 @@ import { Entity } from '@backstage/catalog-model'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { Button, Dialog, DialogActions, DialogTitle } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogTitle from '@material-ui/core/DialogTitle'; import React, { useState } from 'react'; import { alertApiRef, useApi } from '@backstage/core-plugin-api'; import { assertError } from '@backstage/errors'; diff --git a/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx b/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx index 253cfb23fe..8a17559681 100644 --- a/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx +++ b/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx @@ -16,7 +16,7 @@ import { Entity } from '@backstage/catalog-model'; import { useEntity } from '@backstage/plugin-catalog-react'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { DeleteEntityDialog } from './DeleteEntityDialog'; diff --git a/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx b/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx index ef91e7b26e..57736dba40 100644 --- a/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx +++ b/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx @@ -21,7 +21,7 @@ import { EntityRefLink, useEntity, } from '@backstage/plugin-catalog-react'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import React from 'react'; import { ResponseErrorPanel } from '@backstage/core-components'; import { diff --git a/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx b/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx index 16384ac1d2..f52fdae39d 100644 --- a/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx +++ b/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx @@ -20,10 +20,10 @@ import { catalogApiRef, useEntity, } from '@backstage/plugin-catalog-react'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import { ResponseErrorPanel } from '@backstage/core-components'; import { useApi, ApiHolder } from '@backstage/core-plugin-api'; diff --git a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx index 7a533dcf5b..eb37973c27 100644 --- a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx +++ b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx @@ -15,7 +15,7 @@ */ import { Entity } from '@backstage/catalog-model'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { EntityTable, useEntity, diff --git a/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx b/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx index f3cc265653..f141e3b06b 100644 --- a/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx +++ b/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx @@ -29,7 +29,9 @@ import { getEntityRelations, useEntity, } from '@backstage/plugin-catalog-react'; -import { Box, makeStyles, Typography, useTheme } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; import ZoomOutMap from '@material-ui/icons/ZoomOutMap'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; From 1c0b179da12111a1dbd51dc2b9b5599ff7cfd396 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:26:15 +0000 Subject: [PATCH 050/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/perfect-buses-burn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/perfect-buses-burn.md diff --git a/.changeset/perfect-buses-burn.md b/.changeset/perfect-buses-burn.md new file mode 100644 index 0000000000..9671b13c97 --- /dev/null +++ b/.changeset/perfect-buses-burn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From abad785ed149067d1d231c0ee75cd28fc69feefb Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:34:32 +0000 Subject: [PATCH 051/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/catalog-graph/.eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog-graph/.eslintrc.js b/plugins/catalog-graph/.eslintrc.js index 45bb6db521..157ee11e08 100644 --- a/plugins/catalog-graph/.eslintrc.js +++ b/plugins/catalog-graph/.eslintrc.js @@ -1,5 +1,6 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { rules: { 'testing-library/prefer-screen-queries': 'error', + '@backstage/no-top-level-material-ui-4-imports': 'error', }, }); From ebfb418e6c3f6ee3fa8c64e77af8dcfdd870d695 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:35:09 +0000 Subject: [PATCH 052/219] feat: update material ui imports Signed-off-by: Timothy Deakin --- plugins/catalog-graph/dev/index.tsx | 2 +- .../CatalogGraphCard/CatalogGraphCard.tsx | 2 +- .../CatalogGraphPage/CatalogGraphPage.tsx | 7 +++++-- .../components/CatalogGraphPage/CurveFilter.tsx | 2 +- .../CatalogGraphPage/DirectionFilter.tsx | 2 +- .../CatalogGraphPage/MaxDepthFilter.tsx | 16 +++++++--------- .../CatalogGraphPage/SelectedKindsFilter.tsx | 16 +++++++--------- .../CatalogGraphPage/SelectedRelationsFilter.tsx | 16 +++++++--------- .../components/CatalogGraphPage/SwitchFilter.tsx | 5 ++++- .../EntityRelationsGraph.tsx | 3 ++- 10 files changed, 36 insertions(+), 35 deletions(-) diff --git a/plugins/catalog-graph/dev/index.tsx b/plugins/catalog-graph/dev/index.tsx index 1ef9f676de..8d9766e894 100644 --- a/plugins/catalog-graph/dev/index.tsx +++ b/plugins/catalog-graph/dev/index.tsx @@ -43,7 +43,7 @@ import { EntityProvider, } from '@backstage/plugin-catalog-react'; import { JsonObject } from '@backstage/types'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import _ from 'lodash'; import React from 'react'; import { diff --git a/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx b/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx index 99942b9a5c..1956a4bdae 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx @@ -26,7 +26,7 @@ import { useEntity, entityRouteRef, } from '@backstage/plugin-catalog-react'; -import { makeStyles, Theme } from '@material-ui/core'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import qs from 'qs'; import React, { MouseEvent, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/CatalogGraphPage.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/CatalogGraphPage.tsx index 73d79978e9..c7f9360589 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/CatalogGraphPage.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/CatalogGraphPage.tsx @@ -27,10 +27,13 @@ import { entityRouteRef, humanizeEntityRef, } from '@backstage/plugin-catalog-react'; -import { Grid, makeStyles, Paper, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import FilterListIcon from '@material-ui/icons/FilterList'; import ZoomOutMap from '@material-ui/icons/ZoomOutMap'; -import { ToggleButton } from '@material-ui/lab'; +import ToggleButton from '@material-ui/lab/ToggleButton'; import React, { MouseEvent, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/CurveFilter.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/CurveFilter.tsx index 2f3278dc6b..f4e52bf23f 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/CurveFilter.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/CurveFilter.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import { Select, SelectedItems } from '@backstage/core-components'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import React, { useCallback } from 'react'; type Curve = 'curveStepBefore' | 'curveMonotoneX'; diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/DirectionFilter.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/DirectionFilter.tsx index c614ed2b58..5fe308a90b 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/DirectionFilter.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/DirectionFilter.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import { Select, SelectedItems } from '@backstage/core-components'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import React, { useCallback } from 'react'; import { Direction } from '../EntityRelationsGraph'; diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/MaxDepthFilter.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/MaxDepthFilter.tsx index e6fb2fbab4..51ee4643b5 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/MaxDepthFilter.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/MaxDepthFilter.tsx @@ -13,15 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - Box, - FormControl, - IconButton, - InputAdornment, - makeStyles, - OutlinedInput, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import FormControl from '@material-ui/core/FormControl'; +import IconButton from '@material-ui/core/IconButton'; +import InputAdornment from '@material-ui/core/InputAdornment'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import ClearIcon from '@material-ui/icons/Clear'; import React, { useCallback, useEffect, useRef, useState } from 'react'; diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedKindsFilter.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedKindsFilter.tsx index 0817a01e0b..42c456888a 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedKindsFilter.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedKindsFilter.tsx @@ -15,18 +15,16 @@ */ import { alertApiRef, useApi } from '@backstage/core-plugin-api'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { - Box, - Checkbox, - FormControlLabel, - makeStyles, - TextField, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import TextField from '@material-ui/core/TextField'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import CheckBoxIcon from '@material-ui/icons/CheckBox'; import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { Autocomplete } from '@material-ui/lab'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import React, { useCallback, useEffect, useMemo } from 'react'; import useAsync from 'react-use/lib/useAsync'; diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedRelationsFilter.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedRelationsFilter.tsx index 197f65cef8..74adfd0226 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedRelationsFilter.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/SelectedRelationsFilter.tsx @@ -13,18 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - Box, - Checkbox, - FormControlLabel, - makeStyles, - TextField, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import TextField from '@material-ui/core/TextField'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import CheckBoxIcon from '@material-ui/icons/CheckBox'; import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { Autocomplete } from '@material-ui/lab'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import React, { useCallback, useMemo } from 'react'; import { RelationPairs } from '../EntityRelationsGraph'; diff --git a/plugins/catalog-graph/src/components/CatalogGraphPage/SwitchFilter.tsx b/plugins/catalog-graph/src/components/CatalogGraphPage/SwitchFilter.tsx index 495f6b4db2..4427d87a59 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphPage/SwitchFilter.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphPage/SwitchFilter.tsx @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Box, FormControlLabel, makeStyles, Switch } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Switch from '@material-ui/core/Switch'; +import { makeStyles } from '@material-ui/core/styles'; import React, { useCallback } from 'react'; export type Props = { diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx index 35f76a7de0..61e24ecac4 100644 --- a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx +++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx @@ -23,7 +23,8 @@ import { DependencyGraphTypes, } from '@backstage/core-components'; import { errorApiRef, useApi } from '@backstage/core-plugin-api'; -import { CircularProgress, makeStyles, useTheme } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; import classNames from 'classnames'; import React, { MouseEvent, useEffect, useMemo } from 'react'; import { DefaultRenderLabel } from './DefaultRenderLabel'; From d4ff0bb3f6d31ed9c79131da843645dd4b2758ac Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:37:39 +0000 Subject: [PATCH 053/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/weak-vans-heal.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/weak-vans-heal.md diff --git a/.changeset/weak-vans-heal.md b/.changeset/weak-vans-heal.md new file mode 100644 index 0000000000..ae0907f8bd --- /dev/null +++ b/.changeset/weak-vans-heal.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-graph': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From 9e7cbeb1098ee66e566eeba4735e6c4ab9c1c9b7 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:42:41 +0000 Subject: [PATCH 054/219] chore: update api report Signed-off-by: Timothy Deakin --- plugins/catalog/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index 6da30f6f84..8766b983ca 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -36,7 +36,7 @@ import { StyleRules } from '@material-ui/core/styles/withStyles'; import { TableColumn } from '@backstage/core-components'; import { TableOptions } from '@backstage/core-components'; import { TableProps } from '@backstage/core-components'; -import { TabProps } from '@material-ui/core'; +import { TabProps } from '@material-ui/core/Tab'; import { UserListFilterKind } from '@backstage/plugin-catalog-react'; // @public From 56fa9b2bdc31a59d9f6ffe40a139c11ae8b4f2cb Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:54:13 +0000 Subject: [PATCH 055/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/catalog-import/.eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog-import/.eslintrc.js b/plugins/catalog-import/.eslintrc.js index 45bb6db521..157ee11e08 100644 --- a/plugins/catalog-import/.eslintrc.js +++ b/plugins/catalog-import/.eslintrc.js @@ -1,5 +1,6 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { rules: { 'testing-library/prefer-screen-queries': 'error', + '@backstage/no-top-level-material-ui-4-imports': 'error', }, }); From 2a85f4715a36ea14dfb7af6d06eb2c5e4278b219 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:55:55 +0000 Subject: [PATCH 056/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- plugins/catalog-import/dev/index.tsx | 5 ++++- .../src/components/Buttons/index.tsx | 3 ++- .../DefaultImportPage/DefaultImportPage.tsx | 4 +++- .../EntityListComponent/EntityListComponent.tsx | 16 +++++++--------- .../components/ImportInfoCard/ImportInfoCard.tsx | 3 ++- .../components/ImportStepper/ImportStepper.tsx | 4 +++- .../src/components/ImportStepper/defaults.tsx | 16 +++++++--------- .../StepFinishImportLocation.tsx | 3 ++- .../StepInitAnalyzeUrl/StepInitAnalyzeUrl.tsx | 4 +++- .../AutocompleteTextField.tsx | 5 +++-- .../PreparePullRequestForm.test.tsx | 3 ++- .../PreviewCatalogInfoComponent.test.tsx | 2 +- .../PreviewCatalogInfoComponent.tsx | 4 +++- .../PreviewPullRequestComponent.test.tsx | 2 +- .../PreviewPullRequestComponent.tsx | 4 +++- .../StepPrepareCreatePullRequest.test.tsx | 2 +- .../StepPrepareCreatePullRequest.tsx | 5 ++++- .../StepPrepareSelectLocations.tsx | 14 ++++++-------- .../StepReviewLocation/StepReviewLocation.tsx | 4 +++- 19 files changed, 60 insertions(+), 43 deletions(-) diff --git a/plugins/catalog-import/dev/index.tsx b/plugins/catalog-import/dev/index.tsx index e2e5e1d22c..b35dc2a298 100644 --- a/plugins/catalog-import/dev/index.tsx +++ b/plugins/catalog-import/dev/index.tsx @@ -18,7 +18,10 @@ import { CatalogApi } from '@backstage/catalog-client'; import { Entity, CompoundEntityRef } from '@backstage/catalog-model'; import { createDevApp } from '@backstage/dev-utils'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { Grid, ListItem, ListItemIcon, ListItemText } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; import AlarmIcon from '@material-ui/icons/Alarm'; import LocationOnIcon from '@material-ui/icons/LocationOn'; import React from 'react'; diff --git a/plugins/catalog-import/src/components/Buttons/index.tsx b/plugins/catalog-import/src/components/Buttons/index.tsx index 4b9043cd6d..cdcb2169a6 100644 --- a/plugins/catalog-import/src/components/Buttons/index.tsx +++ b/plugins/catalog-import/src/components/Buttons/index.tsx @@ -15,7 +15,8 @@ */ import { LinkButton } from '@backstage/core-components'; -import { Button, CircularProgress } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import CircularProgress from '@material-ui/core/CircularProgress'; import { makeStyles } from '@material-ui/core/styles'; import React, { ComponentProps } from 'react'; diff --git a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx index aad6e8686e..680ce16ae4 100644 --- a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx +++ b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx @@ -22,7 +22,9 @@ import { SupportButton, } from '@backstage/core-components'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { Grid, useMediaQuery, useTheme } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import useMediaQuery from '@material-ui/core/useMediaQuery'; +import { useTheme } from '@material-ui/core/styles'; import React from 'react'; import { ImportInfoCard } from '../ImportInfoCard'; import { ImportStepper } from '../ImportStepper'; diff --git a/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx b/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx index 86030758a7..ef57fad204 100644 --- a/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx +++ b/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx @@ -20,15 +20,13 @@ import { EntityRefLink, humanizeEntityRef, } from '@backstage/plugin-catalog-react'; -import { - Collapse, - IconButton, - List, - ListItem, - ListItemIcon, - ListItemSecondaryAction, - ListItemText, -} from '@material-ui/core'; +import Collapse from '@material-ui/core/Collapse'; +import IconButton from '@material-ui/core/IconButton'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemText from '@material-ui/core/ListItemText'; import { makeStyles } from '@material-ui/core/styles'; import ExpandLessIcon from '@material-ui/icons/ExpandLess'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; diff --git a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx index 26b6b8eb52..be8a457572 100644 --- a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx +++ b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx @@ -16,7 +16,8 @@ import { InfoCard } from '@backstage/core-components'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { Chip, Typography } from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { catalogImportApiRef } from '../../api'; import { useCatalogFilename } from '../../hooks'; diff --git a/plugins/catalog-import/src/components/ImportStepper/ImportStepper.tsx b/plugins/catalog-import/src/components/ImportStepper/ImportStepper.tsx index b2638e582e..38c33a02e4 100644 --- a/plugins/catalog-import/src/components/ImportStepper/ImportStepper.tsx +++ b/plugins/catalog-import/src/components/ImportStepper/ImportStepper.tsx @@ -16,7 +16,9 @@ import { InfoCard, InfoCardVariants } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; -import { Step, StepContent, Stepper } from '@material-ui/core'; +import Step from '@material-ui/core/Step'; +import StepContent from '@material-ui/core/StepContent'; +import Stepper from '@material-ui/core/Stepper'; import { makeStyles } from '@material-ui/core/styles'; import React, { useMemo } from 'react'; import { catalogImportApiRef } from '../../api'; diff --git a/plugins/catalog-import/src/components/ImportStepper/defaults.tsx b/plugins/catalog-import/src/components/ImportStepper/defaults.tsx index 94dff39d0f..0acde07a39 100644 --- a/plugins/catalog-import/src/components/ImportStepper/defaults.tsx +++ b/plugins/catalog-import/src/components/ImportStepper/defaults.tsx @@ -14,15 +14,13 @@ * limitations under the License. */ -import { - Box, - Checkbox, - FormControlLabel, - FormHelperText, - StepLabel, - TextField, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import StepLabel from '@material-ui/core/StepLabel'; +import TextField from '@material-ui/core/TextField'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { BackButton } from '../Buttons'; import { asInputRef } from '../helpers'; diff --git a/plugins/catalog-import/src/components/StepFinishImportLocation/StepFinishImportLocation.tsx b/plugins/catalog-import/src/components/StepFinishImportLocation/StepFinishImportLocation.tsx index 9e19eea6d2..47cee21045 100644 --- a/plugins/catalog-import/src/components/StepFinishImportLocation/StepFinishImportLocation.tsx +++ b/plugins/catalog-import/src/components/StepFinishImportLocation/StepFinishImportLocation.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import LocationOnIcon from '@material-ui/icons/LocationOn'; import React from 'react'; import { BackButton, ViewComponentButton } from '../Buttons'; diff --git a/plugins/catalog-import/src/components/StepInitAnalyzeUrl/StepInitAnalyzeUrl.tsx b/plugins/catalog-import/src/components/StepInitAnalyzeUrl/StepInitAnalyzeUrl.tsx index 588217974c..2cf4e58ee9 100644 --- a/plugins/catalog-import/src/components/StepInitAnalyzeUrl/StepInitAnalyzeUrl.tsx +++ b/plugins/catalog-import/src/components/StepInitAnalyzeUrl/StepInitAnalyzeUrl.tsx @@ -15,7 +15,9 @@ */ import { errorApiRef, useApi } from '@backstage/core-plugin-api'; -import { FormHelperText, Grid, TextField } from '@material-ui/core'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import Grid from '@material-ui/core/Grid'; +import TextField from '@material-ui/core/TextField'; import React, { useCallback, useState } from 'react'; import { useForm } from 'react-hook-form'; import { AnalyzeResult, catalogImportApiRef } from '../../api'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/AutocompleteTextField.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/AutocompleteTextField.tsx index 2e163be2aa..1e28b973db 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/AutocompleteTextField.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/AutocompleteTextField.tsx @@ -14,9 +14,10 @@ * limitations under the License. */ -import { CircularProgress, TextField } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import TextField from '@material-ui/core/TextField'; import { TextFieldProps } from '@material-ui/core/TextField/TextField'; -import { Autocomplete } from '@material-ui/lab'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import React from 'react'; import { Controller, FieldErrors } from 'react-hook-form'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreparePullRequestForm.test.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreparePullRequestForm.test.tsx index 54d5c27993..bee641ca68 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreparePullRequestForm.test.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreparePullRequestForm.test.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { FormHelperText, TextField } from '@material-ui/core'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import TextField from '@material-ui/core/TextField'; import Button from '@material-ui/core/Button'; import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.test.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.test.tsx index 4e737bd115..1ed8026a2b 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.test.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.test.tsx @@ -17,7 +17,7 @@ import { Entity } from '@backstage/catalog-model'; import { configApiRef } from '@backstage/core-plugin-api'; import { MockConfigApi, TestApiProvider } from '@backstage/test-utils'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import { render, screen } from '@testing-library/react'; import { renderHook } from '@testing-library/react'; import React from 'react'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.tsx index a16276f90b..a5e3c58448 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewCatalogInfoComponent.tsx @@ -15,7 +15,9 @@ */ import { Entity } from '@backstage/catalog-model'; -import { Card, CardContent, CardHeader } from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; import React from 'react'; import YAML from 'yaml'; import { CodeSnippet } from '@backstage/core-components'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.test.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.test.tsx index 53485bedb5..0d0660a543 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.test.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import { render, screen } from '@testing-library/react'; import { renderHook } from '@testing-library/react'; import React from 'react'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.tsx index e8a54489a0..dea1243202 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/PreviewPullRequestComponent.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { Card, CardContent, CardHeader } from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; import React from 'react'; import { MarkdownContent } from '@backstage/core-components'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.test.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.test.tsx index 079b010ec6..ec7762f50f 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.test.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.test.tsx @@ -17,7 +17,7 @@ import { configApiRef, errorApiRef } from '@backstage/core-plugin-api'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; import { TestApiProvider, MockConfigApi } from '@backstage/test-utils'; -import { TextField } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; diff --git a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.tsx b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.tsx index 1cbdfce355..580f21b16f 100644 --- a/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.tsx +++ b/plugins/catalog-import/src/components/StepPrepareCreatePullRequest/StepPrepareCreatePullRequest.tsx @@ -21,7 +21,10 @@ import { catalogApiRef, humanizeEntityRef, } from '@backstage/plugin-catalog-react'; -import { Box, FormHelperText, Grid, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import React, { useCallback, useEffect, useState } from 'react'; import { UnpackNestedValue, UseFormReturn } from 'react-hook-form'; diff --git a/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.tsx b/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.tsx index 210b49d188..9ba7904fe4 100644 --- a/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.tsx +++ b/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.tsx @@ -14,14 +14,12 @@ * limitations under the License. */ -import { - Checkbox, - Grid, - ListItem, - ListItemIcon, - ListItemText, - Typography, -} from '@material-ui/core'; +import Checkbox from '@material-ui/core/Checkbox'; +import Grid from '@material-ui/core/Grid'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Typography from '@material-ui/core/Typography'; import LocationOnIcon from '@material-ui/icons/LocationOn'; import React, { useCallback, useState } from 'react'; import { AnalyzeResult } from '../../api'; diff --git a/plugins/catalog-import/src/components/StepReviewLocation/StepReviewLocation.tsx b/plugins/catalog-import/src/components/StepReviewLocation/StepReviewLocation.tsx index b0db174787..c0c3b2c428 100644 --- a/plugins/catalog-import/src/components/StepReviewLocation/StepReviewLocation.tsx +++ b/plugins/catalog-import/src/components/StepReviewLocation/StepReviewLocation.tsx @@ -15,7 +15,9 @@ */ import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { FormHelperText, Grid, Typography } from '@material-ui/core'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import LocationOnIcon from '@material-ui/icons/LocationOn'; import React, { useCallback, useState } from 'react'; import { BackButton, NextButton } from '../Buttons'; From b91a8d29d706e79725252ba9be233985852a3bd7 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 17:59:17 +0000 Subject: [PATCH 057/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/brown-jokes-study.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/brown-jokes-study.md diff --git a/.changeset/brown-jokes-study.md b/.changeset/brown-jokes-study.md new file mode 100644 index 0000000000..352ef7e603 --- /dev/null +++ b/.changeset/brown-jokes-study.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-import': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From 3a6e72291e13cd38ca6f53ec8528b89fd90485cc Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 18:24:32 +0000 Subject: [PATCH 058/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/catalog-unprocessed-entities/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-unprocessed-entities/.eslintrc.js b/plugins/catalog-unprocessed-entities/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/catalog-unprocessed-entities/.eslintrc.js +++ b/plugins/catalog-unprocessed-entities/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From a3252b3f8f76f99dd9abbe3c8661c0124180a60d Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 18:27:08 +0000 Subject: [PATCH 059/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../src/components/FailedEntities.tsx | 4 +++- .../src/components/PendingEntities.tsx | 3 ++- .../src/components/UnprocessedEntities.tsx | 7 +++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx index 2ef52504d7..a1044c6679 100644 --- a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx @@ -23,7 +23,9 @@ import { TableColumn, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; -import { Box, Theme, Typography, makeStyles } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import { Theme, makeStyles } from '@material-ui/core/styles'; import { UnprocessedEntity } from '../types'; import { EntityDialog } from './EntityDialog'; diff --git a/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx index 08e2f3da66..6f38a68816 100644 --- a/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx @@ -21,7 +21,8 @@ import { TableColumn, Table, } from '@backstage/core-components'; -import { Theme, Typography, makeStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import { Theme, makeStyles } from '@material-ui/core/styles'; import { UnprocessedEntity } from '../types'; diff --git a/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx index 29f59222d1..92f5760c2e 100644 --- a/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx @@ -16,8 +16,11 @@ import React, { useState } from 'react'; import { Page, Header, Content } from '@backstage/core-components'; -import { Tab, makeStyles } from '@material-ui/core'; -import { TabContext, TabList, TabPanel } from '@material-ui/lab'; +import Tab from '@material-ui/core/Tab'; +import { makeStyles } from '@material-ui/core/styles'; +import TabContext from '@material-ui/lab/TabContext'; +import TabList from '@material-ui/lab/TabList'; +import TabPanel from '@material-ui/lab/TabPanel'; import { FailedEntities } from './FailedEntities'; import { PendingEntities } from './PendingEntities'; From 2b397fec7825a2e882ce18f5ac65c4f864378c56 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 18:35:07 +0000 Subject: [PATCH 060/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/modern-snails-ring.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/modern-snails-ring.md diff --git a/.changeset/modern-snails-ring.md b/.changeset/modern-snails-ring.md new file mode 100644 index 0000000000..2a00edfb34 --- /dev/null +++ b/.changeset/modern-snails-ring.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-unprocessed-entities': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From 71a41ad1c5863ab37f7c0484b54378ff3925d34d Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 18:47:43 +0000 Subject: [PATCH 061/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/scaffolder/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder/.eslintrc.js b/plugins/scaffolder/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/scaffolder/.eslintrc.js +++ b/plugins/scaffolder/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 43fd3eacba9928e4fb497cf073b60dd097ce1cbd Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 18:55:58 +0000 Subject: [PATCH 062/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../components/ActionsPage/ActionsPage.tsx | 32 +++++++++---------- .../ListTasksPage/OwnerListPicker.tsx | 16 ++++------ .../components/OngoingTask/ContextMenu.tsx | 18 ++++------- .../components/OngoingTask/OngoingTask.tsx | 5 ++- .../TemplateTypePicker/TemplateTypePicker.tsx | 14 ++++---- .../EntityNamePicker/EntityNamePicker.tsx | 2 +- .../fields/EntityPicker/EntityPicker.tsx | 2 +- .../EntityTagsPicker/EntityTagsPicker.tsx | 5 +-- .../MultiEntityPicker/MultiEntityPicker.tsx | 2 +- .../fields/MyGroupsPicker/MyGroupsPicker.tsx | 5 +-- .../OwnedEntityPicker/OwnedEntityPicker.tsx | 2 +- .../fields/RepoUrlPicker/RepoUrlPicker.tsx | 4 ++- .../fields/SecretInput/SecretInput.tsx | 3 +- .../CustomFieldExplorer.tsx | 22 ++++++------- .../DryRunResults/IconLink.tsx | 5 ++- .../DryRunResults/TaskPageLinks.tsx | 2 +- .../DryRunResults/TaskStatusStepper.tsx | 12 +++---- .../TemplateEditorPage/TemplateEditor.tsx | 2 +- .../TemplateEditorBrowser.tsx | 5 ++- .../TemplateEditorTextArea.tsx | 5 ++- .../TemplateFormPreviewer.tsx | 16 ++++------ .../RegisterExistingButton.tsx | 2 +- 22 files changed, 90 insertions(+), 91 deletions(-) diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx index 9c0276fa28..9129b87f25 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx @@ -19,23 +19,21 @@ import { ActionExample, scaffolderApiRef, } from '@backstage/plugin-scaffolder-react'; -import { - Accordion, - AccordionDetails, - AccordionSummary, - Box, - Collapse, - Grid, - makeStyles, - Paper, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Typography, -} from '@material-ui/core'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import Box from '@material-ui/core/Box'; +import Collapse from '@material-ui/core/Collapse'; +import Grid from '@material-ui/core/Grid'; +import Paper from '@material-ui/core/Paper'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableContainer from '@material-ui/core/TableContainer'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import { JSONSchema7, JSONSchema7Definition } from 'json-schema'; import classNames from 'classnames'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; diff --git a/plugins/scaffolder/src/components/ListTasksPage/OwnerListPicker.tsx b/plugins/scaffolder/src/components/ListTasksPage/OwnerListPicker.tsx index fdb13b68a0..d2489303d3 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/OwnerListPicker.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/OwnerListPicker.tsx @@ -14,15 +14,13 @@ * limitations under the License. */ import { IconComponent } from '@backstage/core-plugin-api'; -import { - Card, - List, - ListItemIcon, - ListItemText, - makeStyles, - MenuItem, - Typography, -} from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import List from '@material-ui/core/List'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import SettingsIcon from '@material-ui/icons/Settings'; import React, { Fragment } from 'react'; diff --git a/plugins/scaffolder/src/components/OngoingTask/ContextMenu.tsx b/plugins/scaffolder/src/components/OngoingTask/ContextMenu.tsx index 1612b943c2..99d9235791 100644 --- a/plugins/scaffolder/src/components/OngoingTask/ContextMenu.tsx +++ b/plugins/scaffolder/src/components/OngoingTask/ContextMenu.tsx @@ -14,17 +14,13 @@ * limitations under the License. */ -import { - IconButton, - ListItemIcon, - ListItemText, - makeStyles, - MenuItem, - MenuList, - Popover, - Theme, - useTheme, -} from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; +import MenuList from '@material-ui/core/MenuList'; +import Popover from '@material-ui/core/Popover'; +import { makeStyles, Theme, useTheme } from '@material-ui/core/styles'; import { useAsync } from '@react-hookz/web'; import Cancel from '@material-ui/icons/Cancel'; import Retry from '@material-ui/icons/Repeat'; diff --git a/plugins/scaffolder/src/components/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/components/OngoingTask/OngoingTask.tsx index 984b38dcdd..3e7a3b8f52 100644 --- a/plugins/scaffolder/src/components/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/components/OngoingTask/OngoingTask.tsx @@ -16,7 +16,10 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { Content, ErrorPanel, Header, Page } from '@backstage/core-components'; import { useNavigate, useParams } from 'react-router-dom'; -import { Box, Button, makeStyles, Paper } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import Paper from '@material-ui/core/Paper'; +import { makeStyles } from '@material-ui/core/styles'; import { ScaffolderTaskOutput, scaffolderApiRef, diff --git a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx index 0eed8cde75..c6386853e8 100644 --- a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx +++ b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx @@ -17,17 +17,15 @@ import React from 'react'; import capitalize from 'lodash/capitalize'; import { Progress } from '@backstage/core-components'; -import { - Box, - Checkbox, - FormControlLabel, - TextField, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import TextField from '@material-ui/core/TextField'; +import Typography from '@material-ui/core/Typography'; import CheckBoxIcon from '@material-ui/icons/CheckBox'; import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { Autocomplete } from '@material-ui/lab'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import { useEntityTypeFilter } from '@backstage/plugin-catalog-react'; import { alertApiRef, useApi } from '@backstage/core-plugin-api'; diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/EntityNamePicker.tsx b/plugins/scaffolder/src/components/fields/EntityNamePicker/EntityNamePicker.tsx index 555b726917..bc3ca95ae0 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/EntityNamePicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/EntityNamePicker.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; import { EntityNamePickerProps } from './schema'; -import { TextField } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; export { EntityNamePickerSchema } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index 76dbe42332..f8dd29d9d3 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -27,7 +27,7 @@ import { catalogApiRef, humanizeEntityRef, } from '@backstage/plugin-catalog-react'; -import { TextField } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; import FormControl from '@material-ui/core/FormControl'; import Autocomplete, { AutocompleteChangeReason, diff --git a/plugins/scaffolder/src/components/fields/EntityTagsPicker/EntityTagsPicker.tsx b/plugins/scaffolder/src/components/fields/EntityTagsPicker/EntityTagsPicker.tsx index 549ccdb8aa..4625e3b803 100644 --- a/plugins/scaffolder/src/components/fields/EntityTagsPicker/EntityTagsPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityTagsPicker/EntityTagsPicker.tsx @@ -20,8 +20,9 @@ import { GetEntityFacetsRequest } from '@backstage/catalog-client'; import { makeValidator } from '@backstage/catalog-model'; import { useApi } from '@backstage/core-plugin-api'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { FormControl, TextField } from '@material-ui/core'; -import { Autocomplete } from '@material-ui/lab'; +import FormControl from '@material-ui/core/FormControl'; +import TextField from '@material-ui/core/TextField'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import { EntityTagsPickerProps } from './schema'; export { EntityTagsPickerSchema } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx index d850bbd435..a74a3da7f2 100644 --- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx @@ -27,7 +27,7 @@ import { catalogApiRef, humanizeEntityRef, } from '@backstage/plugin-catalog-react'; -import { TextField } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; import FormControl from '@material-ui/core/FormControl'; import Autocomplete, { AutocompleteChangeReason, diff --git a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx index fefdd4230c..d421759789 100644 --- a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx +++ b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx @@ -20,9 +20,10 @@ import { identityApiRef, useApi, } from '@backstage/core-plugin-api'; -import { TextField, FormControl } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; +import FormControl from '@material-ui/core/FormControl'; import { MyGroupsPickerProps, MyGroupsPickerSchema } from './schema'; -import { Autocomplete } from '@material-ui/lab'; +import Autocomplete from '@material-ui/lab/Autocomplete'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; import { NotFoundError } from '@backstage/errors'; import useAsync from 'react-use/lib/useAsync'; diff --git a/plugins/scaffolder/src/components/fields/OwnedEntityPicker/OwnedEntityPicker.tsx b/plugins/scaffolder/src/components/fields/OwnedEntityPicker/OwnedEntityPicker.tsx index d7999c8c0c..d349f55893 100644 --- a/plugins/scaffolder/src/components/fields/OwnedEntityPicker/OwnedEntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/OwnedEntityPicker/OwnedEntityPicker.tsx @@ -15,7 +15,7 @@ */ import { RELATION_OWNED_BY } from '@backstage/catalog-model'; import { identityApiRef, useApi } from '@backstage/core-plugin-api'; -import { TextField } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; import Autocomplete from '@material-ui/lab/Autocomplete'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx index ba333088ab..67b18c4ebd 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx @@ -32,7 +32,9 @@ import { RepoUrlPickerProps } from './schema'; import { RepoUrlPickerState } from './types'; import useDebounce from 'react-use/lib/useDebounce'; import { useTemplateSecrets } from '@backstage/plugin-scaffolder-react'; -import { Box, Divider, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Divider from '@material-ui/core/Divider'; +import Typography from '@material-ui/core/Typography'; export { RepoUrlPickerSchema } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.tsx b/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.tsx index e6eea9fc72..aac0cf809a 100644 --- a/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.tsx +++ b/plugins/scaffolder/src/components/fields/SecretInput/SecretInput.tsx @@ -17,7 +17,8 @@ import React from 'react'; import { useTemplateSecrets } from '@backstage/plugin-scaffolder-react'; import { ScaffolderRJSFFieldProps } from '@backstage/plugin-scaffolder-react'; import { ScaffolderField } from '@backstage/plugin-scaffolder-react/alpha'; -import { Input, InputLabel } from '@material-ui/core'; +import Input from '@material-ui/core/Input'; +import InputLabel from '@material-ui/core/InputLabel'; export const SecretInput = (props: ScaffolderRJSFFieldProps) => { const { setSecrets, secrets } = useTemplateSecrets(); diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/CustomFieldExplorer.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/CustomFieldExplorer.tsx index 2a4326c432..bddf891ec6 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/CustomFieldExplorer.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/CustomFieldExplorer.tsx @@ -15,18 +15,16 @@ */ import { StreamLanguage } from '@codemirror/language'; import { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml'; -import { - Button, - Card, - CardContent, - CardHeader, - FormControl, - IconButton, - InputLabel, - makeStyles, - MenuItem, - Select, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; +import FormControl from '@material-ui/core/FormControl'; +import IconButton from '@material-ui/core/IconButton'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import { makeStyles } from '@material-ui/core/styles'; import CloseIcon from '@material-ui/icons/Close'; import CodeMirror from '@uiw/react-codemirror'; import React, { useCallback, useMemo, useState } from 'react'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx index 6676c622fa..079294cc50 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx @@ -14,7 +14,10 @@ * limitations under the License. */ import React from 'react'; -import { Grid, LinkProps, makeStyles, Typography } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import { LinkProps } from '@material-ui/core/Link'; import LanguageIcon from '@material-ui/icons/Language'; import { IconComponent } from '@backstage/core-plugin-api'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskPageLinks.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskPageLinks.tsx index 59c1515b79..5f62509551 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskPageLinks.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskPageLinks.tsx @@ -16,7 +16,7 @@ import { parseEntityRef } from '@backstage/catalog-model'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import LanguageIcon from '@material-ui/icons/Language'; import React from 'react'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx index f776d133e0..4a79338912 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx @@ -14,19 +14,15 @@ * limitations under the License. */ import React, { useState } from 'react'; +import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; import { memo } from 'react'; import Step from '@material-ui/core/Step'; import StepLabel from '@material-ui/core/StepLabel'; import Stepper from '@material-ui/core/Stepper'; import { ScaffolderTaskStatus } from '@backstage/plugin-scaffolder-react'; -import { - StepButton, - StepIconProps, - Theme, - createStyles, - makeStyles, - CircularProgress, -} from '@material-ui/core'; +import StepButton from '@material-ui/core/StepButton'; +import { StepIconProps } from '@material-ui/core/StepIcon'; +import CircularProgress from '@material-ui/core/CircularProgress'; import Cancel from '@material-ui/icons/Cancel'; import Check from '@material-ui/icons/Check'; import FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditor.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditor.tsx index a348f5e513..0b6b60661a 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditor.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditor.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import React, { useState } from 'react'; import type { LayoutOptions } from '@backstage/plugin-scaffolder-react'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorBrowser.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorBrowser.tsx index 996da98d4a..489ec05bbe 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorBrowser.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorBrowser.tsx @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Divider, IconButton, makeStyles, Tooltip } from '@material-ui/core'; +import Divider from '@material-ui/core/Divider'; +import IconButton from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; +import { makeStyles } from '@material-ui/core/styles'; import CloseIcon from '@material-ui/icons/Close'; import RefreshIcon from '@material-ui/icons/Refresh'; import SaveIcon from '@material-ui/icons/Save'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorTextArea.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorTextArea.tsx index 588b0cd4ba..ce8db485ea 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorTextArea.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateEditorTextArea.tsx @@ -17,7 +17,10 @@ import { StreamLanguage } from '@codemirror/language'; import { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml'; import { showPanel } from '@codemirror/view'; -import { IconButton, makeStyles, Paper, Tooltip } from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import Paper from '@material-ui/core/Paper'; +import Tooltip from '@material-ui/core/Tooltip'; +import { makeStyles } from '@material-ui/core/styles'; import RefreshIcon from '@material-ui/icons/Refresh'; import SaveIcon from '@material-ui/icons/Save'; import { useKeyboardEvent } from '@react-hookz/web'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateFormPreviewer.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateFormPreviewer.tsx index c253bc0a5f..e9515d11a8 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/TemplateFormPreviewer.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/TemplateFormPreviewer.tsx @@ -19,15 +19,13 @@ import { catalogApiRef, humanizeEntityRef, } from '@backstage/plugin-catalog-react'; -import { - FormControl, - IconButton, - InputLabel, - LinearProgress, - makeStyles, - MenuItem, - Select, -} from '@material-ui/core'; +import FormControl from '@material-ui/core/FormControl'; +import IconButton from '@material-ui/core/IconButton'; +import InputLabel from '@material-ui/core/InputLabel'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import { makeStyles } from '@material-ui/core/styles'; import CloseIcon from '@material-ui/icons/Close'; import React, { useCallback, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/RegisterExistingButton.tsx b/plugins/scaffolder/src/next/TemplateListPage/RegisterExistingButton.tsx index eab7ce4485..abec7c47e1 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/RegisterExistingButton.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/RegisterExistingButton.tsx @@ -22,7 +22,7 @@ import { Link as RouterLink, LinkProps } from 'react-router-dom'; import AddCircleOutline from '@material-ui/icons/AddCircleOutline'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; import { usePermission } from '@backstage/plugin-permission-react'; -import { Theme } from '@material-ui/core'; +import { Theme } from '@material-ui/core/styles'; /** * Properties for {@link RegisterExistingButton} From a7e6fb36320b1ce33b625b809b9d02ab0e5e1059 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 18:57:24 +0000 Subject: [PATCH 063/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/thin-cats-speak.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/thin-cats-speak.md diff --git a/.changeset/thin-cats-speak.md b/.changeset/thin-cats-speak.md new file mode 100644 index 0000000000..a789c45cf9 --- /dev/null +++ b/.changeset/thin-cats-speak.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From 0b822eafb7755888f0ff251a09a075a18a3f308d Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 22:09:43 +0000 Subject: [PATCH 064/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/home/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/home/.eslintrc.js b/plugins/home/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/home/.eslintrc.js +++ b/plugins/home/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 57f87dfa5992ca9cb610aafd66fbf444812a1b2b Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 22:27:13 +0000 Subject: [PATCH 065/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- .../home/src/assets/TemplateBackstageLogoIcon.tsx | 2 +- .../src/componentRenderers/ComponentAccordion.tsx | 14 ++++++-------- .../ComponentTabs/ComponentTabs.tsx | 3 ++- .../components/CustomHomepage/AddWidgetDialog.tsx | 4 +++- .../CustomHomepage/CustomHomepageButtons.tsx | 2 +- .../CustomHomepage/CustomHomepageGrid.tsx | 4 ++-- .../CustomHomepage/WidgetSettingsOverlay.tsx | 14 +++++--------- .../StarredEntityListItem.tsx | 12 +++++------- .../home/src/components/VisitList/ItemCategory.tsx | 3 ++- .../home/src/components/VisitList/ItemDetail.tsx | 2 +- plugins/home/src/components/VisitList/ItemName.tsx | 3 ++- .../home/src/components/VisitList/VisitList.tsx | 3 ++- .../src/components/VisitList/VisitListEmpty.tsx | 2 +- .../home/src/components/VisitList/VisitListFew.tsx | 2 +- .../src/components/VisitList/VisitListItem.tsx | 10 ++++------ .../src/components/VisitList/VisitListSkeleton.tsx | 14 ++++++-------- .../CompanyLogo/CompanyLogo.stories.tsx | 3 ++- .../CompanyLogo/CompanyLogo.test.tsx | 2 +- .../homePageComponents/CompanyLogo/CompanyLogo.tsx | 2 +- .../FeaturedDocsCard/Content.tsx | 3 ++- .../FeaturedDocsCard/FeaturedDocsCard.stories.tsx | 2 +- .../src/homePageComponents/RandomJoke/Actions.tsx | 2 +- .../src/homePageComponents/RandomJoke/Settings.tsx | 12 +++++------- .../homePageComponents/StarredEntities/Content.tsx | 5 ++++- .../StarredEntities/StarredEntities.stories.tsx | 2 +- .../src/homePageComponents/Toolkit/Content.tsx | 10 ++++------ .../homePageComponents/Toolkit/Toolkit.stories.tsx | 2 +- .../homePageComponents/VisitedByType/Actions.tsx | 2 +- .../HomePageVisitedByType.stories.tsx | 2 +- .../WelcomeTitle/WelcomeTitle.tsx | 3 ++- 30 files changed, 71 insertions(+), 75 deletions(-) diff --git a/plugins/home/src/assets/TemplateBackstageLogoIcon.tsx b/plugins/home/src/assets/TemplateBackstageLogoIcon.tsx index afa7d94ca0..a8e3c311db 100644 --- a/plugins/home/src/assets/TemplateBackstageLogoIcon.tsx +++ b/plugins/home/src/assets/TemplateBackstageLogoIcon.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles({ svg: { diff --git a/plugins/home/src/componentRenderers/ComponentAccordion.tsx b/plugins/home/src/componentRenderers/ComponentAccordion.tsx index 2a6f74b2dd..6b3242518d 100644 --- a/plugins/home/src/componentRenderers/ComponentAccordion.tsx +++ b/plugins/home/src/componentRenderers/ComponentAccordion.tsx @@ -16,14 +16,12 @@ import React from 'react'; import { SettingsModal } from '@backstage/plugin-home-react'; -import { - Accordion, - AccordionDetails, - AccordionSummary, - Typography, - IconButton, - Theme, -} from '@material-ui/core'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import Typography from '@material-ui/core/Typography'; +import IconButton from '@material-ui/core/IconButton'; +import { Theme } from '@material-ui/core/styles'; import { makeStyles } from '@material-ui/core/styles'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import SettingsIcon from '@material-ui/icons/Settings'; diff --git a/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx b/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx index 20fc9c79b6..4e7053bfcb 100644 --- a/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx +++ b/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Tabs, Tab } from '@material-ui/core'; +import Tabs from '@material-ui/core/Tabs'; +import Tab from '@material-ui/core/Tab'; import { InfoCard } from '@backstage/core-components'; type TabType = { diff --git a/plugins/home/src/components/CustomHomepage/AddWidgetDialog.tsx b/plugins/home/src/components/CustomHomepage/AddWidgetDialog.tsx index ee3ed98cbc..b983983224 100644 --- a/plugins/home/src/components/CustomHomepage/AddWidgetDialog.tsx +++ b/plugins/home/src/components/CustomHomepage/AddWidgetDialog.tsx @@ -17,7 +17,9 @@ import { Widget } from './types'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; -import { DialogContent, DialogTitle, ListItemAvatar } from '@material-ui/core'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import ListItemAvatar from '@material-ui/core/ListItemAvatar'; import AddIcon from '@material-ui/icons/Add'; import ListItemText from '@material-ui/core/ListItemText'; import React from 'react'; diff --git a/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx b/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx index 22c88a30c7..5236eef811 100644 --- a/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx +++ b/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx @@ -15,7 +15,7 @@ */ import Button from '@material-ui/core/Button'; import React from 'react'; -import { createStyles, makeStyles, Theme } from '@material-ui/core'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import SaveIcon from '@material-ui/icons/Save'; import DeleteIcon from '@material-ui/icons/Delete'; import AddIcon from '@material-ui/icons/Add'; diff --git a/plugins/home/src/components/CustomHomepage/CustomHomepageGrid.tsx b/plugins/home/src/components/CustomHomepage/CustomHomepageGrid.tsx index 07e21ff8e2..700f307dec 100644 --- a/plugins/home/src/components/CustomHomepage/CustomHomepageGrid.tsx +++ b/plugins/home/src/components/CustomHomepage/CustomHomepageGrid.tsx @@ -25,13 +25,13 @@ import { } from '@backstage/core-plugin-api'; import 'react-grid-layout/css/styles.css'; import 'react-resizable/css/styles.css'; +import Dialog from '@material-ui/core/Dialog'; import { createStyles, - Dialog, makeStyles, Theme, useTheme, -} from '@material-ui/core'; +} from '@material-ui/core/styles'; import { compact } from 'lodash'; import useObservable from 'react-use/lib/useObservable'; import { ContentHeader, ErrorBoundary } from '@backstage/core-components'; diff --git a/plugins/home/src/components/CustomHomepage/WidgetSettingsOverlay.tsx b/plugins/home/src/components/CustomHomepage/WidgetSettingsOverlay.tsx index 735720ac13..5fe4f65136 100644 --- a/plugins/home/src/components/CustomHomepage/WidgetSettingsOverlay.tsx +++ b/plugins/home/src/components/CustomHomepage/WidgetSettingsOverlay.tsx @@ -13,15 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - createStyles, - Dialog, - DialogContent, - Grid, - makeStyles, - Theme, - Tooltip, -} from '@material-ui/core'; +import Dialog from '@material-ui/core/Dialog'; +import DialogContent from '@material-ui/core/DialogContent'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import IconButton from '@material-ui/core/IconButton'; import SettingsIcon from '@material-ui/icons/Settings'; import DeleteIcon from '@material-ui/icons/Delete'; diff --git a/plugins/home/src/components/StarredEntityListItem/StarredEntityListItem.tsx b/plugins/home/src/components/StarredEntityListItem/StarredEntityListItem.tsx index 2a8960e469..579116b9a9 100644 --- a/plugins/home/src/components/StarredEntityListItem/StarredEntityListItem.tsx +++ b/plugins/home/src/components/StarredEntityListItem/StarredEntityListItem.tsx @@ -15,13 +15,11 @@ */ import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { entityRouteParams } from '@backstage/plugin-catalog-react'; -import { - ListItem, - ListItemIcon, - Tooltip, - IconButton, - ListItemText, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import Tooltip from '@material-ui/core/Tooltip'; +import IconButton from '@material-ui/core/IconButton'; +import ListItemText from '@material-ui/core/ListItemText'; import React from 'react'; import { Link } from 'react-router-dom'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; diff --git a/plugins/home/src/components/VisitList/ItemCategory.tsx b/plugins/home/src/components/VisitList/ItemCategory.tsx index 0f9636ce31..953bc12fc7 100644 --- a/plugins/home/src/components/VisitList/ItemCategory.tsx +++ b/plugins/home/src/components/VisitList/ItemCategory.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Chip, makeStyles } from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; +import { makeStyles } from '@material-ui/core/styles'; import { colorVariants } from '@backstage/theme'; import { Visit } from '../../api/VisitsApi'; import { CompoundEntityRef, parseEntityRef } from '@backstage/catalog-model'; diff --git a/plugins/home/src/components/VisitList/ItemDetail.tsx b/plugins/home/src/components/VisitList/ItemDetail.tsx index 3f55557f73..fed8c5549c 100644 --- a/plugins/home/src/components/VisitList/ItemDetail.tsx +++ b/plugins/home/src/components/VisitList/ItemDetail.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { Visit } from '../../api/VisitsApi'; import { DateTime } from 'luxon'; diff --git a/plugins/home/src/components/VisitList/ItemName.tsx b/plugins/home/src/components/VisitList/ItemName.tsx index 965ad80d5e..00c2273993 100644 --- a/plugins/home/src/components/VisitList/ItemName.tsx +++ b/plugins/home/src/components/VisitList/ItemName.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Typography, makeStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import { Visit } from '../../api/VisitsApi'; import { Link } from '@backstage/core-components'; diff --git a/plugins/home/src/components/VisitList/VisitList.tsx b/plugins/home/src/components/VisitList/VisitList.tsx index 7e79d5439f..225547d5a4 100644 --- a/plugins/home/src/components/VisitList/VisitList.tsx +++ b/plugins/home/src/components/VisitList/VisitList.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Collapse, List } from '@material-ui/core'; +import Collapse from '@material-ui/core/Collapse'; +import List from '@material-ui/core/List'; import { Visit } from '../../api/VisitsApi'; import { VisitListItem } from './VisitListItem'; import { ItemDetailType } from './ItemDetail'; diff --git a/plugins/home/src/components/VisitList/VisitListEmpty.tsx b/plugins/home/src/components/VisitList/VisitListEmpty.tsx index 3996f0f863..b956361a2e 100644 --- a/plugins/home/src/components/VisitList/VisitListEmpty.tsx +++ b/plugins/home/src/components/VisitList/VisitListEmpty.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; export const VisitListEmpty = () => ( <> diff --git a/plugins/home/src/components/VisitList/VisitListFew.tsx b/plugins/home/src/components/VisitList/VisitListFew.tsx index c28f1af931..acee23af4f 100644 --- a/plugins/home/src/components/VisitList/VisitListFew.tsx +++ b/plugins/home/src/components/VisitList/VisitListFew.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; export const VisitListFew = () => ( <> diff --git a/plugins/home/src/components/VisitList/VisitListItem.tsx b/plugins/home/src/components/VisitList/VisitListItem.tsx index 20087c884a..f9ef3ecf35 100644 --- a/plugins/home/src/components/VisitList/VisitListItem.tsx +++ b/plugins/home/src/components/VisitList/VisitListItem.tsx @@ -15,12 +15,10 @@ */ import React from 'react'; -import { - ListItem, - ListItemAvatar, - ListItemText, - makeStyles, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemAvatar from '@material-ui/core/ListItemAvatar'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import { Visit } from '../../api/VisitsApi'; import { ItemName } from './ItemName'; import { ItemDetail, ItemDetailType } from './ItemDetail'; diff --git a/plugins/home/src/components/VisitList/VisitListSkeleton.tsx b/plugins/home/src/components/VisitList/VisitListSkeleton.tsx index 94ba840d9d..c597798e63 100644 --- a/plugins/home/src/components/VisitList/VisitListSkeleton.tsx +++ b/plugins/home/src/components/VisitList/VisitListSkeleton.tsx @@ -15,14 +15,12 @@ */ import React from 'react'; -import { - Collapse, - ListItem, - ListItemAvatar, - ListItemText, - makeStyles, -} from '@material-ui/core'; -import { Skeleton } from '@material-ui/lab'; +import Collapse from '@material-ui/core/Collapse'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemAvatar from '@material-ui/core/ListItemAvatar'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; +import Skeleton from '@material-ui/lab/Skeleton'; const useStyles = makeStyles(_theme => ({ skeleton: { diff --git a/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.stories.tsx b/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.stories.tsx index da5c318af2..9ce1ab9e6b 100644 --- a/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.stories.tsx +++ b/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.stories.tsx @@ -20,7 +20,8 @@ import { rootRouteRef } from '../../routes'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/core-app-api'; -import { Grid, makeStyles } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; import React, { ComponentType, PropsWithChildren } from 'react'; export default { diff --git a/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.test.tsx b/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.test.tsx index 3cd08bc70b..8664e10c42 100644 --- a/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.test.tsx +++ b/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.test.tsx @@ -17,7 +17,7 @@ import { CompanyLogo } from './CompanyLogo'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/core-app-api'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; describe('', () => { diff --git a/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.tsx b/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.tsx index 998c2d46b1..93c3d46f92 100644 --- a/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.tsx +++ b/plugins/home/src/homePageComponents/CompanyLogo/CompanyLogo.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; import React from 'react'; diff --git a/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.tsx b/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.tsx index a7ba4d5e9b..769b68f5e7 100644 --- a/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.tsx +++ b/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.tsx @@ -31,7 +31,8 @@ import { import { useApi } from '@backstage/core-plugin-api'; import { EntityFilterQuery } from '@backstage/catalog-client'; -import { makeStyles, Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import { stringifyEntityRef } from '@backstage/catalog-model'; /** diff --git a/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx b/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx index 91f0dbf27e..4d04a1788c 100644 --- a/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx +++ b/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx @@ -18,7 +18,7 @@ import { FeaturedDocsCard } from '../../plugin'; import React, { ComponentType, PropsWithChildren } from 'react'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; const docsEntities = [ { diff --git a/plugins/home/src/homePageComponents/RandomJoke/Actions.tsx b/plugins/home/src/homePageComponents/RandomJoke/Actions.tsx index cebb0400ab..8cbed8dace 100644 --- a/plugins/home/src/homePageComponents/RandomJoke/Actions.tsx +++ b/plugins/home/src/homePageComponents/RandomJoke/Actions.tsx @@ -16,7 +16,7 @@ import React from 'react'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { useRandomJoke } from './Context'; export const Actions = () => { diff --git a/plugins/home/src/homePageComponents/RandomJoke/Settings.tsx b/plugins/home/src/homePageComponents/RandomJoke/Settings.tsx index 20e7f0b813..7cbf231ac4 100644 --- a/plugins/home/src/homePageComponents/RandomJoke/Settings.tsx +++ b/plugins/home/src/homePageComponents/RandomJoke/Settings.tsx @@ -13,13 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - FormControl, - FormLabel, - RadioGroup, - FormControlLabel, - Radio, -} from '@material-ui/core'; +import FormControl from '@material-ui/core/FormControl'; +import FormLabel from '@material-ui/core/FormLabel'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Radio from '@material-ui/core/Radio'; import React from 'react'; import { useRandomJoke, JokeType } from './Context'; import upperFirst from 'lodash/upperFirst'; diff --git a/plugins/home/src/homePageComponents/StarredEntities/Content.tsx b/plugins/home/src/homePageComponents/StarredEntities/Content.tsx index b3d4caf44e..214f51d81c 100644 --- a/plugins/home/src/homePageComponents/StarredEntities/Content.tsx +++ b/plugins/home/src/homePageComponents/StarredEntities/Content.tsx @@ -21,7 +21,10 @@ import { import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { useApi } from '@backstage/core-plugin-api'; import { Progress, ResponseErrorPanel } from '@backstage/core-components'; -import { List, Typography, Tabs, Tab } from '@material-ui/core'; +import List from '@material-ui/core/List'; +import Typography from '@material-ui/core/Typography'; +import Tabs from '@material-ui/core/Tabs'; +import Tab from '@material-ui/core/Tab'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { StarredEntityListItem } from '../../components/StarredEntityListItem/StarredEntityListItem'; diff --git a/plugins/home/src/homePageComponents/StarredEntities/StarredEntities.stories.tsx b/plugins/home/src/homePageComponents/StarredEntities/StarredEntities.stories.tsx index 8172041f94..d260a1681b 100644 --- a/plugins/home/src/homePageComponents/StarredEntities/StarredEntities.stories.tsx +++ b/plugins/home/src/homePageComponents/StarredEntities/StarredEntities.stories.tsx @@ -22,7 +22,7 @@ import { MockStarredEntitiesApi, entityRouteRef, } from '@backstage/plugin-catalog-react'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React, { ComponentType, PropsWithChildren } from 'react'; const starredEntitiesApi = new MockStarredEntitiesApi(); diff --git a/plugins/home/src/homePageComponents/Toolkit/Content.tsx b/plugins/home/src/homePageComponents/Toolkit/Content.tsx index a1ada00b0b..2547184c44 100644 --- a/plugins/home/src/homePageComponents/Toolkit/Content.tsx +++ b/plugins/home/src/homePageComponents/Toolkit/Content.tsx @@ -15,12 +15,10 @@ */ import { Link } from '@backstage/core-components'; -import { - makeStyles, - List, - ListItemIcon, - ListItemText, -} from '@material-ui/core'; +import List from '@material-ui/core/List'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import React from 'react'; import { useToolkit, Tool } from './Context'; diff --git a/plugins/home/src/homePageComponents/Toolkit/Toolkit.stories.tsx b/plugins/home/src/homePageComponents/Toolkit/Toolkit.stories.tsx index 9a7ab95fa1..8ab0b2a8bd 100644 --- a/plugins/home/src/homePageComponents/Toolkit/Toolkit.stories.tsx +++ b/plugins/home/src/homePageComponents/Toolkit/Toolkit.stories.tsx @@ -16,7 +16,7 @@ import { InfoCard } from '@backstage/core-components'; import { wrapInTestApp } from '@backstage/test-utils'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React, { ComponentType, PropsWithChildren } from 'react'; import { ComponentAccordion } from '../../componentRenderers'; import { HomePageToolkit } from '../../plugin'; diff --git a/plugins/home/src/homePageComponents/VisitedByType/Actions.tsx b/plugins/home/src/homePageComponents/VisitedByType/Actions.tsx index 45e67802c9..cad204d0e3 100644 --- a/plugins/home/src/homePageComponents/VisitedByType/Actions.tsx +++ b/plugins/home/src/homePageComponents/VisitedByType/Actions.tsx @@ -15,7 +15,7 @@ */ import React, { useCallback } from 'react'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { useContext } from './Context'; export const Actions = () => { diff --git a/plugins/home/src/homePageComponents/VisitedByType/HomePageVisitedByType.stories.tsx b/plugins/home/src/homePageComponents/VisitedByType/HomePageVisitedByType.stories.tsx index d20d5344ae..baf2a092d9 100644 --- a/plugins/home/src/homePageComponents/VisitedByType/HomePageVisitedByType.stories.tsx +++ b/plugins/home/src/homePageComponents/VisitedByType/HomePageVisitedByType.stories.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; import { ComponentType, PropsWithChildren } from 'react'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import { homePlugin } from '../../plugin'; import { Visit, visitsApiRef } from '../../api/VisitsApi'; import { createCardExtension } from '@backstage/plugin-home-react'; diff --git a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx index 9981d91873..62eade6fd0 100644 --- a/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx +++ b/plugins/home/src/homePageComponents/WelcomeTitle/WelcomeTitle.tsx @@ -18,7 +18,8 @@ import { identityApiRef, useApi, } from '@backstage/core-plugin-api'; -import { Tooltip, Typography } from '@material-ui/core'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; import React, { useEffect, useMemo } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { getTimeBasedGreeting } from './timeUtil'; From 2e1768176b8215e50bc817719818dc37fc928db9 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 22:30:15 +0000 Subject: [PATCH 066/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/shiny-buttons-whisper.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/shiny-buttons-whisper.md diff --git a/.changeset/shiny-buttons-whisper.md b/.changeset/shiny-buttons-whisper.md new file mode 100644 index 0000000000..a19a22e8b1 --- /dev/null +++ b/.changeset/shiny-buttons-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From f82f651ee784bae0e039f4cdc5bfc87dc8677977 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 22:46:56 +0000 Subject: [PATCH 067/219] feat: add eslint rule for top level imports Signed-off-by: Timothy Deakin --- plugins/cost-insights/.eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/cost-insights/.eslintrc.js b/plugins/cost-insights/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/cost-insights/.eslintrc.js +++ b/plugins/cost-insights/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); From 31b14f1bcd894d21b6a6d4662c3a5feadf1c9f16 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 23:07:13 +0000 Subject: [PATCH 068/219] refactor: update material ui imports Signed-off-by: Timothy Deakin --- plugins/cost-insights/dev/index.tsx | 2 +- .../components/ActionItems/ActionItemCard.tsx | 3 ++- .../components/ActionItems/ActionItems.tsx | 18 ++++++++--------- .../AlertInsights/AlertDialog.test.tsx | 2 +- .../components/AlertInsights/AlertDialog.tsx | 20 +++++++++---------- .../AlertInsights/AlertInsights.tsx | 4 +++- .../AlertInsights/AlertInsightsHeader.tsx | 3 ++- .../AlertInsights/AlertInsightsSection.tsx | 3 ++- .../AlertInsightsSectionHeader.tsx | 6 +++++- .../AlertInsights/AlertStatusSummary.tsx | 6 +++++- .../AlertStatusSummaryButton.tsx | 2 +- .../AlertInstructionsLayout.tsx | 5 ++++- .../src/components/BarChart/BarChart.tsx | 3 ++- .../src/components/BarChart/BarChartLabel.tsx | 3 ++- .../components/BarChart/BarChartLegend.tsx | 3 ++- .../components/BarChart/BarChartStepper.tsx | 3 ++- .../BarChart/BarChartStepperButton.tsx | 2 +- .../src/components/BarChart/BarChartSteps.tsx | 2 +- .../components/BarChart/BarChartTooltip.tsx | 4 +++- .../BarChart/BarChartTooltipItem.tsx | 3 ++- .../CopyUrlToClipboard/CopyUrlToClipboard.tsx | 3 ++- .../CostGrowth/CostGrowthIndicator.tsx | 2 +- .../CostInsightsHeader/CostInsightsHeader.tsx | 2 +- .../CostInsightsLayout/CostInsightsLayout.tsx | 2 +- .../CostInsightsNavigation.tsx | 16 +++++++-------- .../CostInsightsPage/CostInsightsPage.tsx | 14 ++++++------- .../CostInsightsThemeProvider.tsx | 6 +++--- .../CostInsightsTabs/CostInsightsTabs.tsx | 6 +++++- .../CostOverviewBreakdownChart.tsx | 12 +++++------ .../CostOverviewCard/CostOverviewCard.tsx | 18 ++++++++--------- .../CostOverviewCard/CostOverviewChart.tsx | 3 ++- .../CostOverviewCard/CostOverviewHeader.tsx | 3 ++- .../CostOverviewCard/CostOverviewLegend.tsx | 3 ++- .../CurrencySelect/CurrencySelect.tsx | 11 ++++------ .../LabelDataflowInstructionsPage.tsx | 3 ++- .../src/components/LegendItem/LegendItem.tsx | 4 +++- .../components/MetricSelect/MetricSelect.tsx | 5 ++++- .../components/PeriodSelect/PeriodSelect.tsx | 3 ++- .../ProductInsights/ProductInsights.tsx | 3 ++- .../ProductEntityDialog.tsx | 3 ++- .../ProductEntityTable.tsx | 2 +- .../ProductInsightsCard.tsx | 2 +- .../ProductInsightsCardList.tsx | 4 +++- .../ProductInsightsChart.tsx | 3 ++- .../ProjectGrowthAlertChart.tsx | 2 +- .../ProjectGrowthInstructionsPage.tsx | 3 ++- .../ProjectSelect/ProjectSelect.tsx | 3 ++- .../UnlabeledDataflowAlertCard.tsx | 2 +- .../WhyCostsMatter/WhyCostsMatter.tsx | 6 +++++- .../KubernetesMigrationAlertCard.tsx | 2 +- .../KubernetesMigrationBarChart.tsx | 2 +- .../KubernetesMigrationBarChartLegend.tsx | 3 ++- .../forms/KubernetesMigrationDismissForm.tsx | 12 +++++------ .../src/forms/AlertAcceptForm.tsx | 4 +++- .../src/forms/AlertDismissForm.tsx | 18 ++++++++--------- .../src/forms/AlertSnoozeForm.tsx | 14 ++++++------- .../cost-insights/src/hooks/useFilters.tsx | 2 +- plugins/cost-insights/src/hooks/useGroups.tsx | 2 +- .../src/hooks/useLastCompleteBillingDate.tsx | 2 +- .../cost-insights/src/hooks/useLoading.tsx | 3 ++- plugins/cost-insights/src/utils/styles.ts | 8 +++----- 61 files changed, 174 insertions(+), 144 deletions(-) diff --git a/plugins/cost-insights/dev/index.tsx b/plugins/cost-insights/dev/index.tsx index 622abaffc9..49f18f9d65 100644 --- a/plugins/cost-insights/dev/index.tsx +++ b/plugins/cost-insights/dev/index.tsx @@ -26,7 +26,7 @@ import { EntityCostInsightsContent, } from '../src/plugin'; import { Content, Header, Page } from '@backstage/core-components'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import { EntityProvider } from '@backstage/plugin-catalog-react'; import { Entity } from '@backstage/catalog-model'; diff --git a/plugins/cost-insights/src/components/ActionItems/ActionItemCard.tsx b/plugins/cost-insights/src/components/ActionItems/ActionItemCard.tsx index 93025a8052..33005d0ba6 100644 --- a/plugins/cost-insights/src/components/ActionItems/ActionItemCard.tsx +++ b/plugins/cost-insights/src/components/ActionItems/ActionItemCard.tsx @@ -15,7 +15,8 @@ */ import React, { MouseEventHandler } from 'react'; import classnames from 'classnames'; -import { Card, CardHeader } from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardHeader from '@material-ui/core/CardHeader'; import { useScroll } from '../../hooks'; import { Alert } from '../../types'; import { useActionItemCardStyles as useStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/ActionItems/ActionItems.tsx b/plugins/cost-insights/src/components/ActionItems/ActionItems.tsx index 78c40045be..a0a5461e37 100644 --- a/plugins/cost-insights/src/components/ActionItems/ActionItems.tsx +++ b/plugins/cost-insights/src/components/ActionItems/ActionItems.tsx @@ -14,16 +14,14 @@ * limitations under the License. */ import React, { Fragment, MouseEventHandler } from 'react'; -import { - Avatar, - Badge, - Box, - IconButtonProps, - IconButton, - Paper, - Divider, - Tooltip, -} from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; +import { IconButtonProps } from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; +import IconButton from '@material-ui/core/IconButton'; +import Badge from '@material-ui/core/Badge'; +import Box from '@material-ui/core/Box'; +import Paper from '@material-ui/core/Paper'; +import Divider from '@material-ui/core/Divider'; import { default as SnoozeIcon } from '@material-ui/icons/AccessTime'; import { default as AcceptIcon } from '@material-ui/icons/Check'; import { default as DismissIcon } from '@material-ui/icons/Delete'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertDialog.test.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertDialog.test.tsx index 31e83cf039..3d6e653910 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertDialog.test.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertDialog.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React from 'react'; -import { capitalize } from '@material-ui/core'; +import { capitalize } from '@material-ui/core/utils'; import { AlertDialog } from './AlertDialog'; import { render } from '@testing-library/react'; import { Alert, AlertFormProps, AlertStatus } from '../../types'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertDialog.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertDialog.tsx index 385116e188..e4e87fc70c 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertDialog.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertDialog.tsx @@ -15,17 +15,15 @@ */ import React, { useEffect, useRef, useState } from 'react'; -import { - capitalize, - Box, - Button, - Divider, - Dialog, - DialogActions, - IconButton, - DialogContent, - Typography, -} from '@material-ui/core'; +import { capitalize } from '@material-ui/core/utils'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import Divider from '@material-ui/core/Divider'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import IconButton from '@material-ui/core/IconButton'; +import DialogContent from '@material-ui/core/DialogContent'; +import Typography from '@material-ui/core/Typography'; import { default as CloseIcon } from '@material-ui/icons/Close'; import { useAlertDialogStyles as useStyles } from '../../utils/styles'; import { Alert, AlertStatus } from '../../types'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertInsights.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertInsights.tsx index e48ae2789d..0ca254908d 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertInsights.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertInsights.tsx @@ -16,7 +16,9 @@ import React, { useEffect, useState } from 'react'; import pluralize from 'pluralize'; -import { Box, Grid, Snackbar } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import Snackbar from '@material-ui/core/Snackbar'; import { default as MuiAlert } from '@material-ui/lab/Alert'; import { AlertDialog } from './AlertDialog'; import { AlertStatusSummary } from './AlertStatusSummary'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx index 97def45b76..b2cd796e6e 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsHeader.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { useCostInsightsStyles as useStyles } from '../../utils/styles'; import { ScrollAnchor } from '../../utils/scroll'; import { DefaultNavigation } from '../../utils/navigation'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSection.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSection.tsx index 70dbfe66c7..725a902417 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSection.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSection.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ import React from 'react'; -import { Box, Button } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; import { default as SnoozeIcon } from '@material-ui/icons/AccessTime'; import { default as AcceptIcon } from '@material-ui/icons/Check'; import { default as DismissIcon } from '@material-ui/icons/Delete'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSectionHeader.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSectionHeader.tsx index e4abf3a3ac..d4c2acd3a8 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSectionHeader.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertInsightsSectionHeader.tsx @@ -15,7 +15,11 @@ */ import React from 'react'; -import { Avatar, Box, Button, Grid, Typography } from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import { useAlertInsightsSectionStyles as useStyles } from '../../utils/styles'; import { ScrollAnchor } from '../../utils/scroll'; import { Alert } from '../../types'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummary.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummary.tsx index 211167931c..10e10d0770 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummary.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummary.tsx @@ -15,7 +15,11 @@ */ import React, { Fragment } from 'react'; -import { Avatar, Box, Collapse, Divider, Tooltip } from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; +import Box from '@material-ui/core/Box'; +import Collapse from '@material-ui/core/Collapse'; +import Divider from '@material-ui/core/Divider'; +import Tooltip from '@material-ui/core/Tooltip'; import { default as AcceptIcon } from '@material-ui/icons/Check'; import { default as DismissIcon } from '@material-ui/icons/Delete'; import { default as SnoozeIcon } from '@material-ui/icons/AccessTime'; diff --git a/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummaryButton.tsx b/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummaryButton.tsx index 95a4c44c3a..392d6eda2c 100644 --- a/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummaryButton.tsx +++ b/plugins/cost-insights/src/components/AlertInsights/AlertStatusSummaryButton.tsx @@ -16,7 +16,7 @@ import React, { useState, MouseEventHandler, PropsWithChildren } from 'react'; import classnames from 'classnames'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { default as ExpandMoreIcon } from '@material-ui/icons/ExpandMore'; import { useAlertStatusSummaryButtonStyles as useStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/AlertInstructionsLayout/AlertInstructionsLayout.tsx b/plugins/cost-insights/src/components/AlertInstructionsLayout/AlertInstructionsLayout.tsx index 3749763fad..983778103d 100644 --- a/plugins/cost-insights/src/components/AlertInstructionsLayout/AlertInstructionsLayout.tsx +++ b/plugins/cost-insights/src/components/AlertInstructionsLayout/AlertInstructionsLayout.tsx @@ -15,7 +15,10 @@ */ import React, { PropsWithChildren } from 'react'; -import { Box, Button, Container, makeStyles } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import Container from '@material-ui/core/Container'; +import { makeStyles } from '@material-ui/core/styles'; import ChevronLeftIcon from '@material-ui/icons/ChevronLeft'; import { CostInsightsThemeProvider } from '../CostInsightsPage/CostInsightsThemeProvider'; import { ConfigProvider, CurrencyProvider } from '../../hooks'; diff --git a/plugins/cost-insights/src/components/BarChart/BarChart.tsx b/plugins/cost-insights/src/components/BarChart/BarChart.tsx index fa4ae18e24..18a6a56962 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChart.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChart.tsx @@ -24,7 +24,8 @@ import { XAxis, YAxis, } from 'recharts'; -import { Box, useTheme } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import { useTheme } from '@material-ui/core/styles'; import { BarChartTick } from './BarChartTick'; import { BarChartStepper } from './BarChartStepper'; import { BarChartTooltip } from './BarChartTooltip'; diff --git a/plugins/cost-insights/src/components/BarChart/BarChartLabel.tsx b/plugins/cost-insights/src/components/BarChart/BarChartLabel.tsx index c3a6570a35..857d5f148f 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartLabel.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartLabel.tsx @@ -15,7 +15,8 @@ */ import React, { PropsWithChildren } from 'react'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { useBarChartLabelStyles } from '../../utils/styles'; type BarChartLabelProps = { diff --git a/plugins/cost-insights/src/components/BarChart/BarChartLegend.tsx b/plugins/cost-insights/src/components/BarChart/BarChartLegend.tsx index becd5467d1..44d3684c70 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartLegend.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartLegend.tsx @@ -15,7 +15,8 @@ */ import React, { PropsWithChildren } from 'react'; -import { Box, useTheme } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import { useTheme } from '@material-ui/core/styles'; import { LegendItem } from '../LegendItem'; import { currencyFormatter } from '../../utils/formatters'; import { CostInsightsTheme } from '../../types'; diff --git a/plugins/cost-insights/src/components/BarChart/BarChartStepper.tsx b/plugins/cost-insights/src/components/BarChart/BarChartStepper.tsx index d2153c673f..ae85065ff2 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartStepper.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartStepper.tsx @@ -15,7 +15,8 @@ */ import React, { useEffect, useState } from 'react'; -import { Paper, Slide } from '@material-ui/core'; +import Paper from '@material-ui/core/Paper'; +import Slide from '@material-ui/core/Slide'; import ChevronLeftIcon from '@material-ui/icons/ChevronLeft'; import ChevronRightIcon from '@material-ui/icons/ChevronRight'; import { BarChartStepperButton } from './BarChartStepperButton'; diff --git a/plugins/cost-insights/src/components/BarChart/BarChartStepperButton.tsx b/plugins/cost-insights/src/components/BarChart/BarChartStepperButton.tsx index 20562b1097..18d75d114d 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartStepperButton.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartStepperButton.tsx @@ -15,7 +15,7 @@ */ import React, { forwardRef, PropsWithChildren, Ref } from 'react'; -import { ButtonBase, ButtonBaseProps } from '@material-ui/core'; +import ButtonBase, { ButtonBaseProps } from '@material-ui/core/ButtonBase'; import { useBarChartStepperButtonStyles as useStyles } from '../../utils/styles'; interface BarChartStepperButtonProps extends ButtonBaseProps { diff --git a/plugins/cost-insights/src/components/BarChart/BarChartSteps.tsx b/plugins/cost-insights/src/components/BarChart/BarChartSteps.tsx index 556154d046..aec3bab323 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartSteps.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartSteps.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { ButtonBase } from '@material-ui/core'; +import ButtonBase from '@material-ui/core/ButtonBase'; import { useBarChartStepperStyles as useStyles } from '../../utils/styles'; export type BarChartStepsProps = { diff --git a/plugins/cost-insights/src/components/BarChart/BarChartTooltip.tsx b/plugins/cost-insights/src/components/BarChart/BarChartTooltip.tsx index 0b522e5e09..127b6bec04 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartTooltip.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartTooltip.tsx @@ -16,7 +16,9 @@ import React, { ReactNode, PropsWithChildren } from 'react'; import classnames from 'classnames'; -import { Box, Divider, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Divider from '@material-ui/core/Divider'; +import Typography from '@material-ui/core/Typography'; import { useTooltipStyles as useStyles } from '../../utils/styles'; /** @public */ diff --git a/plugins/cost-insights/src/components/BarChart/BarChartTooltipItem.tsx b/plugins/cost-insights/src/components/BarChart/BarChartTooltipItem.tsx index 123720cbc0..79190f700d 100644 --- a/plugins/cost-insights/src/components/BarChart/BarChartTooltipItem.tsx +++ b/plugins/cost-insights/src/components/BarChart/BarChartTooltipItem.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import LensIcon from '@material-ui/icons/Lens'; import { useTooltipStyles as useStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx b/plugins/cost-insights/src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx index bef6f159de..d67a2814f1 100644 --- a/plugins/cost-insights/src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx +++ b/plugins/cost-insights/src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx @@ -17,7 +17,8 @@ import React, { useEffect, useState } from 'react'; import { useLocation } from 'react-router-dom'; import useCopyToClipboard from 'react-use/lib/useCopyToClipboard'; -import { Tooltip, IconButton } from '@material-ui/core'; +import Tooltip from '@material-ui/core/Tooltip'; +import IconButton from '@material-ui/core/IconButton'; import AssignmentOutlinedIcon from '@material-ui/icons/AssignmentOutlined'; import AssignmentTurnedInOutlinedIcon from '@material-ui/icons/AssignmentTurnedInOutlined'; import SentimentVeryDissatisfiedIcon from '@material-ui/icons/SentimentVeryDissatisfied'; diff --git a/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx b/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx index cf07d97d0a..583a279231 100644 --- a/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx +++ b/plugins/cost-insights/src/components/CostGrowth/CostGrowthIndicator.tsx @@ -16,7 +16,7 @@ import React from 'react'; import classnames from 'classnames'; -import { Typography, TypographyProps } from '@material-ui/core'; +import Typography, { TypographyProps } from '@material-ui/core/Typography'; import { default as ArrowDropUp } from '@material-ui/icons/ArrowDropUp'; import { default as ArrowDropDown } from '@material-ui/icons/ArrowDropDown'; import { growthOf } from '../../utils/change'; diff --git a/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx b/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx index c1b3e12575..ae885d9277 100644 --- a/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx +++ b/plugins/cost-insights/src/components/CostInsightsHeader/CostInsightsHeader.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import useAsync from 'react-use/lib/useAsync'; import { useCostInsightsStyles } from '../../utils/styles'; import { Group } from '@backstage/plugin-cost-insights-common'; diff --git a/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx b/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx index 55d5668189..818518acb1 100644 --- a/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx +++ b/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React, { PropsWithChildren } from 'react'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import { Group } from '@backstage/plugin-cost-insights-common'; import { CostInsightsTabs } from '../CostInsightsTabs'; import { Header, Page } from '@backstage/core-components'; diff --git a/plugins/cost-insights/src/components/CostInsightsNavigation/CostInsightsNavigation.tsx b/plugins/cost-insights/src/components/CostInsightsNavigation/CostInsightsNavigation.tsx index 0bdfed3855..26506040a3 100644 --- a/plugins/cost-insights/src/components/CostInsightsNavigation/CostInsightsNavigation.tsx +++ b/plugins/cost-insights/src/components/CostInsightsNavigation/CostInsightsNavigation.tsx @@ -15,15 +15,13 @@ */ import React, { useEffect, useState } from 'react'; -import { - Collapse, - MenuList, - MenuItem, - ListItemIcon, - ListItemText, - Typography, - Badge, -} from '@material-ui/core'; +import Collapse from '@material-ui/core/Collapse'; +import MenuList from '@material-ui/core/MenuList'; +import MenuItem from '@material-ui/core/MenuItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Typography from '@material-ui/core/Typography'; +import Badge from '@material-ui/core/Badge'; import { useNavigationStyles as useStyles } from '../../utils/styles'; import { useConfig, useScroll } from '../../hooks'; import { findAlways } from '../../utils/assert'; diff --git a/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsPage.tsx b/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsPage.tsx index d113f1b8f3..e579f155c2 100644 --- a/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsPage.tsx +++ b/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsPage.tsx @@ -15,14 +15,12 @@ */ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { - Box, - Collapse, - Container, - Divider, - Grid, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Collapse from '@material-ui/core/Collapse'; +import Container from '@material-ui/core/Container'; +import Divider from '@material-ui/core/Divider'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import { default as MaterialAlert } from '@material-ui/lab/Alert'; import { costInsightsApiRef } from '../../api'; import { ActionItems } from '../ActionItems'; diff --git a/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsThemeProvider.tsx b/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsThemeProvider.tsx index 40745c4301..f05fb1072f 100644 --- a/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsThemeProvider.tsx +++ b/plugins/cost-insights/src/components/CostInsightsPage/CostInsightsThemeProvider.tsx @@ -16,10 +16,10 @@ import React, { PropsWithChildren } from 'react'; import { - createTheme as createMuiTheme, - Theme, ThemeProvider, -} from '@material-ui/core'; + createTheme as createMuiTheme, +} from '@material-ui/core/styles'; +import { Theme } from '@material-ui/core/styles'; import { costInsightsDarkTheme, costInsightsLightTheme, diff --git a/plugins/cost-insights/src/components/CostInsightsTabs/CostInsightsTabs.tsx b/plugins/cost-insights/src/components/CostInsightsTabs/CostInsightsTabs.tsx index 152ce56902..928e6c98ed 100644 --- a/plugins/cost-insights/src/components/CostInsightsTabs/CostInsightsTabs.tsx +++ b/plugins/cost-insights/src/components/CostInsightsTabs/CostInsightsTabs.tsx @@ -15,7 +15,11 @@ */ import React, { useState } from 'react'; -import { Menu, MenuItem, Tab, Tabs, Typography } from '@material-ui/core'; +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; +import Tab from '@material-ui/core/Tab'; +import Tabs from '@material-ui/core/Tabs'; +import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { mapLoadingToProps, mapFiltersToProps } from './selector'; import { Group } from '@backstage/plugin-cost-insights-common'; diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewBreakdownChart.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewBreakdownChart.tsx index 842e76c991..dd92b80faf 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewBreakdownChart.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewBreakdownChart.tsx @@ -15,13 +15,11 @@ */ import React, { useState } from 'react'; import { DateTime } from 'luxon'; -import { - Box, - Divider, - emphasize, - Typography, - useTheme, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Divider from '@material-ui/core/Divider'; +import { emphasize } from '@material-ui/core/styles/colorManipulator'; +import Typography from '@material-ui/core/Typography'; +import { useTheme } from '@material-ui/core/styles'; import { default as FullScreenIcon } from '@material-ui/icons/Fullscreen'; import { Area, diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.tsx index c816da97ed..7fcf45ed67 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewCard.tsx @@ -15,16 +15,14 @@ */ import React, { useEffect, useState } from 'react'; -import { - Box, - capitalize, - Card, - CardContent, - Divider, - Tab, - Tabs, - useTheme, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import { capitalize } from '@material-ui/core/utils'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import Divider from '@material-ui/core/Divider'; +import Tab from '@material-ui/core/Tab'; +import Tabs from '@material-ui/core/Tabs'; +import { useTheme } from '@material-ui/core/styles'; import { CostOverviewChart } from './CostOverviewChart'; import { CostOverviewBreakdownChart } from './CostOverviewBreakdownChart'; import { CostOverviewHeader } from './CostOverviewHeader'; diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx index 2201dcc650..f272fe0219 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewChart.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; import { DateTime } from 'luxon'; -import { useTheme, Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import { useTheme } from '@material-ui/core/styles'; import { ComposedChart, XAxis, diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewHeader.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewHeader.tsx index 849ffeeab6..c6f23449c4 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewHeader.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewHeader.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ import React, { PropsWithChildren } from 'react'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; type CostOverviewHeaderProps = { title: string; diff --git a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewLegend.tsx b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewLegend.tsx index d823c54691..303dd63018 100644 --- a/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewLegend.tsx +++ b/plugins/cost-insights/src/components/CostOverviewCard/CostOverviewLegend.tsx @@ -15,7 +15,8 @@ */ import React, { PropsWithChildren } from 'react'; -import { Box, useTheme } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import { useTheme } from '@material-ui/core/styles'; import { LegendItem } from '../LegendItem'; import { CostInsightsTheme } from '../../types'; import { diff --git a/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx b/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx index 8f7d466de7..2706364f89 100644 --- a/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx +++ b/plugins/cost-insights/src/components/CurrencySelect/CurrencySelect.tsx @@ -15,13 +15,10 @@ */ import React from 'react'; -import { - InputLabel, - FormControl, - MenuItem, - Select, - SelectProps, -} from '@material-ui/core'; +import InputLabel from '@material-ui/core/InputLabel'; +import Select, { SelectProps } from '@material-ui/core/Select'; +import FormControl from '@material-ui/core/FormControl'; +import MenuItem from '@material-ui/core/MenuItem'; import Typography from '@material-ui/core/Typography'; import { Currency, CurrencyType } from '../../types'; import { findAlways } from '../../utils/assert'; diff --git a/plugins/cost-insights/src/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.tsx b/plugins/cost-insights/src/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.tsx index 8a6fcded77..705a690c7a 100644 --- a/plugins/cost-insights/src/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.tsx +++ b/plugins/cost-insights/src/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { AlertInstructionsLayout } from '../AlertInstructionsLayout'; import { CodeSnippet, Link } from '@backstage/core-components'; diff --git a/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx b/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx index 93b1df7bdb..3ef093f366 100644 --- a/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx +++ b/plugins/cost-insights/src/components/LegendItem/LegendItem.tsx @@ -15,7 +15,9 @@ */ import React, { PropsWithChildren } from 'react'; -import { Box, Typography, Tooltip } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import Tooltip from '@material-ui/core/Tooltip'; import LensIcon from '@material-ui/icons/Lens'; import HelpOutlineOutlinedIcon from '@material-ui/icons/HelpOutlineOutlined'; import { useCostGrowthLegendStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/MetricSelect/MetricSelect.tsx b/plugins/cost-insights/src/components/MetricSelect/MetricSelect.tsx index fd534eb8f0..da9d6f3df8 100644 --- a/plugins/cost-insights/src/components/MetricSelect/MetricSelect.tsx +++ b/plugins/cost-insights/src/components/MetricSelect/MetricSelect.tsx @@ -15,7 +15,10 @@ */ import React from 'react'; -import { InputLabel, FormControl, Select, MenuItem } from '@material-ui/core'; +import InputLabel from '@material-ui/core/InputLabel'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import MenuItem from '@material-ui/core/MenuItem'; import { Maybe, Metric } from '@backstage/plugin-cost-insights-common'; import { useSelectStyles as useStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/PeriodSelect/PeriodSelect.tsx b/plugins/cost-insights/src/components/PeriodSelect/PeriodSelect.tsx index 29a77ae420..96f7374187 100644 --- a/plugins/cost-insights/src/components/PeriodSelect/PeriodSelect.tsx +++ b/plugins/cost-insights/src/components/PeriodSelect/PeriodSelect.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { MenuItem, Select, SelectProps } from '@material-ui/core'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select, { SelectProps } from '@material-ui/core/Select'; import { Duration } from '../../types'; import { formatLastTwoLookaheadQuarters } from '../../utils/formatters'; import { findAlways } from '../../utils/assert'; diff --git a/plugins/cost-insights/src/components/ProductInsights/ProductInsights.tsx b/plugins/cost-insights/src/components/ProductInsights/ProductInsights.tsx index 9df763a5d4..11803246fc 100644 --- a/plugins/cost-insights/src/components/ProductInsights/ProductInsights.tsx +++ b/plugins/cost-insights/src/components/ProductInsights/ProductInsights.tsx @@ -15,7 +15,8 @@ */ import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { default as Alert } from '@material-ui/lab/Alert'; import { costInsightsApiRef } from '../../api'; import { ProductInsightsCardList } from '../ProductInsightsCard/ProductInsightsCardList'; diff --git a/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityDialog.tsx b/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityDialog.tsx index 55fa795728..90edec5fc1 100644 --- a/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityDialog.tsx +++ b/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityDialog.tsx @@ -15,7 +15,8 @@ */ import React, { useState } from 'react'; -import { Dialog, IconButton } from '@material-ui/core'; +import Dialog from '@material-ui/core/Dialog'; +import IconButton from '@material-ui/core/IconButton'; import { default as CloseButton } from '@material-ui/icons/Close'; import { useEntityDialogStyles as useStyles } from '../../utils/styles'; import { Entity } from '@backstage/plugin-cost-insights-common'; diff --git a/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityTable.tsx b/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityTable.tsx index affb16cb30..1b21f8db72 100644 --- a/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityTable.tsx +++ b/plugins/cost-insights/src/components/ProductInsightsCard/ProductEntityTable.tsx @@ -16,7 +16,7 @@ import React from 'react'; import classnames from 'classnames'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { formatChange } from '../../utils/formatters'; import { useEntityDialogStyles as useStyles } from '../../utils/styles'; import { CostGrowthIndicator } from '../CostGrowth'; diff --git a/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCard.tsx b/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCard.tsx index a587bfb26e..7d0ec4dba3 100644 --- a/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCard.tsx +++ b/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCard.tsx @@ -22,7 +22,7 @@ import React, { useState, } from 'react'; import pluralize from 'pluralize'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { default as Alert } from '@material-ui/lab/Alert'; import { PeriodSelect } from '../PeriodSelect'; import { ProductInsightsChart } from './ProductInsightsChart'; diff --git a/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCardList.tsx b/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCardList.tsx index 3ae97daecb..f031b52cd7 100644 --- a/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCardList.tsx +++ b/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsCardList.tsx @@ -15,7 +15,9 @@ */ import React from 'react'; -import { Box, CircularProgress, Collapse } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Collapse from '@material-ui/core/Collapse'; import { ProductInsightsCard } from './ProductInsightsCard'; import { Duration } from '../../types'; import { Entity, Product } from '@backstage/plugin-cost-insights-common'; diff --git a/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsChart.tsx b/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsChart.tsx index 2976b1f30f..7e2e6d6244 100644 --- a/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsChart.tsx +++ b/plugins/cost-insights/src/components/ProductInsightsCard/ProductInsightsChart.tsx @@ -16,7 +16,8 @@ import React, { useMemo, useState } from 'react'; import pluralize from 'pluralize'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { default as FullScreenIcon } from '@material-ui/icons/Fullscreen'; import { LegendItem } from '../LegendItem'; import { ProductEntityDialog } from './ProductEntityDialog'; diff --git a/plugins/cost-insights/src/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.tsx b/plugins/cost-insights/src/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.tsx index 74c0cea34b..fd4d2ef004 100644 --- a/plugins/cost-insights/src/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.tsx +++ b/plugins/cost-insights/src/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { DateTime } from 'luxon'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import { BarChart, BarChartLegend, BarChartLegendOptions } from '../BarChart'; import { LegendItem } from '../LegendItem'; import { CostGrowth } from '../CostGrowth'; diff --git a/plugins/cost-insights/src/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.tsx b/plugins/cost-insights/src/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.tsx index 0435210a98..7dfad406e8 100644 --- a/plugins/cost-insights/src/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.tsx +++ b/plugins/cost-insights/src/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.tsx @@ -16,7 +16,8 @@ import React from 'react'; import { DateTime } from 'luxon'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { AlertInstructionsLayout } from '../AlertInstructionsLayout'; import { ProductInsightsChart } from '../ProductInsightsCard'; import { diff --git a/plugins/cost-insights/src/components/ProjectSelect/ProjectSelect.tsx b/plugins/cost-insights/src/components/ProjectSelect/ProjectSelect.tsx index c83fa67d94..0d3a86c3a1 100644 --- a/plugins/cost-insights/src/components/ProjectSelect/ProjectSelect.tsx +++ b/plugins/cost-insights/src/components/ProjectSelect/ProjectSelect.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ import React from 'react'; -import { MenuItem, Select } from '@material-ui/core'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; import { Maybe, Project } from '@backstage/plugin-cost-insights-common'; import { useSelectStyles as useStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.tsx b/plugins/cost-insights/src/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.tsx index af44f434bf..f1cccc2dd0 100644 --- a/plugins/cost-insights/src/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.tsx +++ b/plugins/cost-insights/src/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.tsx @@ -16,7 +16,7 @@ import React from 'react'; import pluralize from 'pluralize'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import { BarChart, BarChartLegend } from '../BarChart'; import { UnlabeledDataflowData, ResourceData } from '../../types'; import { useBarChartLayoutStyles as useStyles } from '../../utils/styles'; diff --git a/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx b/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx index 0b3ea9f00d..e58ccbb525 100644 --- a/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx +++ b/plugins/cost-insights/src/components/WhyCostsMatter/WhyCostsMatter.tsx @@ -15,7 +15,11 @@ */ import React from 'react'; -import { Typography, Box, Grid, Container, Divider } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import Container from '@material-ui/core/Container'; +import Divider from '@material-ui/core/Divider'; export const WhyCostsMatter = () => { return ( diff --git a/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.tsx b/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.tsx index bc61ffbf2b..f0ca5a3ee3 100644 --- a/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.tsx +++ b/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import { KubernetesMigrationBarChartLegend } from './KubernetesMigrationBarChartLegend'; import { KubernetesMigrationBarChart } from './KubernetesMigrationBarChart'; import { KubernetesMigrationData } from '../../alerts'; diff --git a/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.tsx b/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.tsx index bdc7af551a..67cbadb4d3 100644 --- a/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.tsx +++ b/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.tsx @@ -22,7 +22,7 @@ import { ResourceData, } from '../../../types'; import { Entity } from '@backstage/plugin-cost-insights-common'; -import { useTheme } from '@material-ui/core'; +import { useTheme } from '@material-ui/core/styles'; type MigrationBarChartProps = { currentProduct: string; diff --git a/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.tsx b/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.tsx index 1b46b15a10..d516ab9c33 100644 --- a/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.tsx +++ b/plugins/cost-insights/src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Box, useTheme } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import { useTheme } from '@material-ui/core/styles'; import { CostGrowth, LegendItem } from '../../../components'; import { CostInsightsTheme, Duration } from '../../../types'; import { ChangeStatistic } from '@backstage/plugin-cost-insights-common'; diff --git a/plugins/cost-insights/src/example/forms/KubernetesMigrationDismissForm.tsx b/plugins/cost-insights/src/example/forms/KubernetesMigrationDismissForm.tsx index 7efd32616c..181e3492ce 100644 --- a/plugins/cost-insights/src/example/forms/KubernetesMigrationDismissForm.tsx +++ b/plugins/cost-insights/src/example/forms/KubernetesMigrationDismissForm.tsx @@ -21,13 +21,11 @@ import React, { FormEventHandler, ChangeEvent, } from 'react'; -import { - Checkbox, - FormControl, - FormControlLabel, - FormGroup, - Typography, -} from '@material-ui/core'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControl from '@material-ui/core/FormControl'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormGroup from '@material-ui/core/FormGroup'; +import Typography from '@material-ui/core/Typography'; import { AlertFormProps } from '../../types'; import { Entity } from '@backstage/plugin-cost-insights-common'; import { KubernetesMigrationAlert } from '../alerts'; diff --git a/plugins/cost-insights/src/forms/AlertAcceptForm.tsx b/plugins/cost-insights/src/forms/AlertAcceptForm.tsx index ab22a0f330..b31bf8ff74 100644 --- a/plugins/cost-insights/src/forms/AlertAcceptForm.tsx +++ b/plugins/cost-insights/src/forms/AlertAcceptForm.tsx @@ -20,7 +20,9 @@ import React, { ChangeEvent, FormEventHandler, } from 'react'; -import { Checkbox, FormControl, FormControlLabel } from '@material-ui/core'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControl from '@material-ui/core/FormControl'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; import { Alert, AlertFormProps } from '../types'; export type AlertAcceptFormProps = AlertFormProps; diff --git a/plugins/cost-insights/src/forms/AlertDismissForm.tsx b/plugins/cost-insights/src/forms/AlertDismissForm.tsx index 7506fe8ee1..0755664935 100644 --- a/plugins/cost-insights/src/forms/AlertDismissForm.tsx +++ b/plugins/cost-insights/src/forms/AlertDismissForm.tsx @@ -21,16 +21,14 @@ import React, { forwardRef, FormEventHandler, } from 'react'; -import { - Box, - Collapse, - FormControl, - FormControlLabel, - TextField, - Typography, - Radio, - RadioGroup, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Collapse from '@material-ui/core/Collapse'; +import FormControl from '@material-ui/core/FormControl'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import TextField from '@material-ui/core/TextField'; +import Typography from '@material-ui/core/Typography'; +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; import { Alert, AlertFormProps, diff --git a/plugins/cost-insights/src/forms/AlertSnoozeForm.tsx b/plugins/cost-insights/src/forms/AlertSnoozeForm.tsx index 3f87c87771..95ceb4b7e8 100644 --- a/plugins/cost-insights/src/forms/AlertSnoozeForm.tsx +++ b/plugins/cost-insights/src/forms/AlertSnoozeForm.tsx @@ -22,14 +22,12 @@ import React, { FormEventHandler, } from 'react'; import { DateTime } from 'luxon'; -import { - Box, - FormControl, - FormControlLabel, - RadioGroup, - Radio, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import FormControl from '@material-ui/core/FormControl'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import Radio from '@material-ui/core/Radio'; +import Typography from '@material-ui/core/Typography'; import { Alert, AlertFormProps, diff --git a/plugins/cost-insights/src/hooks/useFilters.tsx b/plugins/cost-insights/src/hooks/useFilters.tsx index e888da369e..49ae2b3b43 100644 --- a/plugins/cost-insights/src/hooks/useFilters.tsx +++ b/plugins/cost-insights/src/hooks/useFilters.tsx @@ -22,7 +22,7 @@ import React, { useEffect, useState, } from 'react'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { PageFilters, ProductFilters } from '../types'; import { Maybe } from '@backstage/plugin-cost-insights-common'; import { useLocation, useNavigate } from 'react-router-dom'; diff --git a/plugins/cost-insights/src/hooks/useGroups.tsx b/plugins/cost-insights/src/hooks/useGroups.tsx index ec10faa7de..2dc4f624d1 100644 --- a/plugins/cost-insights/src/hooks/useGroups.tsx +++ b/plugins/cost-insights/src/hooks/useGroups.tsx @@ -20,7 +20,7 @@ import React, { useEffect, useState, } from 'react'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { costInsightsApiRef } from '../api'; import { MapLoadingToProps, useLoading } from './useLoading'; import { Group, Maybe } from '@backstage/plugin-cost-insights-common'; diff --git a/plugins/cost-insights/src/hooks/useLastCompleteBillingDate.tsx b/plugins/cost-insights/src/hooks/useLastCompleteBillingDate.tsx index 24c5716442..c75e510395 100644 --- a/plugins/cost-insights/src/hooks/useLastCompleteBillingDate.tsx +++ b/plugins/cost-insights/src/hooks/useLastCompleteBillingDate.tsx @@ -21,7 +21,7 @@ import React, { useState, } from 'react'; import * as yup from 'yup'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { costInsightsApiRef } from '../api'; import { MapLoadingToProps, useLoading } from './useLoading'; import { DefaultLoadingAction } from '../utils/loading'; diff --git a/plugins/cost-insights/src/hooks/useLoading.tsx b/plugins/cost-insights/src/hooks/useLoading.tsx index 84828491de..9242c05410 100644 --- a/plugins/cost-insights/src/hooks/useLoading.tsx +++ b/plugins/cost-insights/src/hooks/useLoading.tsx @@ -25,7 +25,8 @@ import React, { useReducer, useState, } from 'react'; -import { Backdrop, CircularProgress } from '@material-ui/core'; +import Backdrop from '@material-ui/core/Backdrop'; +import CircularProgress from '@material-ui/core/CircularProgress'; import { Loading } from '../types'; import { DefaultLoadingAction, diff --git a/plugins/cost-insights/src/utils/styles.ts b/plugins/cost-insights/src/utils/styles.ts index c4c330138b..179f7eb295 100644 --- a/plugins/cost-insights/src/utils/styles.ts +++ b/plugins/cost-insights/src/utils/styles.ts @@ -15,14 +15,12 @@ */ import { - createStyles, emphasize, + lighten, darken, getLuminance, - lighten, - makeStyles, - Theme, -} from '@material-ui/core'; +} from '@material-ui/core/styles/colorManipulator'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import { CostInsightsTheme, CostInsightsThemeOptions } from '../types'; export const costInsightsLightTheme = { From 083ba280ebd1a7254c950b827ec9a3809795a260 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 23:13:38 +0000 Subject: [PATCH 069/219] chore: add changeset Signed-off-by: Timothy Deakin --- .changeset/perfect-countries-appear.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/perfect-countries-appear.md diff --git a/.changeset/perfect-countries-appear.md b/.changeset/perfect-countries-appear.md new file mode 100644 index 0000000000..8005e443d5 --- /dev/null +++ b/.changeset/perfect-countries-appear.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-cost-insights': patch +--- + +Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 From 103eb2209f696a2e52b5fd47e110183ff11877a8 Mon Sep 17 00:00:00 2001 From: Timothy Deakin Date: Thu, 14 Mar 2024 23:31:20 +0000 Subject: [PATCH 070/219] chore: update api report Signed-off-by: Timothy Deakin --- plugins/cost-insights/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/cost-insights/api-report.md b/plugins/cost-insights/api-report.md index 11cdbd8141..546c7e2873 100644 --- a/plugins/cost-insights/api-report.md +++ b/plugins/cost-insights/api-report.md @@ -30,7 +30,7 @@ import { RefAttributes } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { SetStateAction } from 'react'; import { TooltipProps } from 'recharts'; -import { TypographyProps } from '@material-ui/core'; +import { TypographyProps } from '@material-ui/core/Typography'; // @public export type Alert = { From 875c594040d289cf0ffe1c947913ad981d0abfb7 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 08:29:42 +0530 Subject: [PATCH 071/219] Add ESLint Rule to Code-Climate Plugin Signed-off-by: Aditya Kumar --- .changeset/small-wasps-perform.md | 5 +++++ plugins/code-climate/.eslintrc.js | 6 +++++- plugins/code-climate/dev/index.tsx | 2 +- .../src/components/CodeClimateTable/CodeClimateTable.tsx | 4 +++- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 .changeset/small-wasps-perform.md diff --git a/.changeset/small-wasps-perform.md b/.changeset/small-wasps-perform.md new file mode 100644 index 0000000000..cdcea1ba98 --- /dev/null +++ b/.changeset/small-wasps-perform.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-code-climate': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the Code-Climate plugin to migrate the Material UI imports. diff --git a/plugins/code-climate/.eslintrc.js b/plugins/code-climate/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/code-climate/.eslintrc.js +++ b/plugins/code-climate/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/code-climate/dev/index.tsx b/plugins/code-climate/dev/index.tsx index 060679337e..46619dcbeb 100644 --- a/plugins/code-climate/dev/index.tsx +++ b/plugins/code-climate/dev/index.tsx @@ -17,7 +17,7 @@ import { Entity } from '@backstage/catalog-model'; // eslint-disable-next-line @backstage/no-undeclared-imports import { createDevApp, EntityGridItem } from '@backstage/dev-utils'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React from 'react'; import { EntityCodeClimateCard, diff --git a/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.tsx b/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.tsx index ca5b24565c..ebb13abfbc 100644 --- a/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.tsx +++ b/plugins/code-climate/src/components/CodeClimateTable/CodeClimateTable.tsx @@ -17,7 +17,9 @@ import React from 'react'; import { CodeClimateData } from '../../api'; import { Link } from '@backstage/core-components'; -import { Box, makeStyles, Theme, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles, Theme } from '@material-ui/core/styles'; const letterStyle = (theme: Theme) => ({ color: theme.palette.common.white, From eca08359ec32b30433c67a346e41c59c307e05f0 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 08:38:56 +0530 Subject: [PATCH 072/219] Add ESLint Rule to Code-Coverage Plugin Signed-off-by: Aditya Kumar --- .changeset/yellow-panthers-refuse.md | 5 +++++ plugins/code-coverage/.eslintrc.js | 6 +++++- .../CoverageHistoryChart.tsx | 18 ++++++++---------- .../src/components/FileExplorer/CodeRow.tsx | 2 +- .../components/FileExplorer/FileContent.tsx | 5 +++-- .../components/FileExplorer/FileExplorer.tsx | 6 ++++-- 6 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 .changeset/yellow-panthers-refuse.md diff --git a/.changeset/yellow-panthers-refuse.md b/.changeset/yellow-panthers-refuse.md new file mode 100644 index 0000000000..fde2dca0ac --- /dev/null +++ b/.changeset/yellow-panthers-refuse.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-code-coverage': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the Code-Coverage plugin to migrate the Material UI imports. diff --git a/plugins/code-coverage/.eslintrc.js b/plugins/code-coverage/.eslintrc.js index e2a53a6ad2..6f6668b53d 100644 --- a/plugins/code-coverage/.eslintrc.js +++ b/plugins/code-coverage/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx index 3cb4ad5d56..bea6a8bec7 100644 --- a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx +++ b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx @@ -15,19 +15,17 @@ */ import { useEntity } from '@backstage/plugin-catalog-react'; -import { - Box, - Card, - CardContent, - CardHeader, - makeStyles, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import TrendingDownIcon from '@material-ui/icons/TrendingDown'; import TrendingFlatIcon from '@material-ui/icons/TrendingFlat'; import TrendingUpIcon from '@material-ui/icons/TrendingUp'; -import { Alert } from '@material-ui/lab'; -import { ClassNameMap } from '@material-ui/styles'; +import Alert from '@material-ui/lab/Alert'; +import ClassNameMap from '@material-ui/styles/ClassNameMap'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { diff --git a/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx b/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx index 20f0548f16..28ff8e241d 100644 --- a/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx +++ b/plugins/code-coverage/src/components/FileExplorer/CodeRow.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles(theme => ({ lineNumberCell: { diff --git a/plugins/code-coverage/src/components/FileExplorer/FileContent.tsx b/plugins/code-coverage/src/components/FileExplorer/FileContent.tsx index 2ca6987be7..b401e66334 100644 --- a/plugins/code-coverage/src/components/FileExplorer/FileContent.tsx +++ b/plugins/code-coverage/src/components/FileExplorer/FileContent.tsx @@ -15,8 +15,9 @@ */ import { useEntity } from '@backstage/plugin-catalog-react'; -import { makeStyles, Paper } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +import Paper from '@material-ui/core/Paper'; +import { makeStyles } from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { codeCoverageApiRef } from '../../api'; diff --git a/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx b/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx index 57bb9a2be0..4fb20dbd52 100644 --- a/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx +++ b/plugins/code-coverage/src/components/FileExplorer/FileExplorer.tsx @@ -15,10 +15,12 @@ */ import { humanizeEntityRef, useEntity } from '@backstage/plugin-catalog-react'; -import { Box, Modal, makeStyles } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Modal from '@material-ui/core/Modal'; +import { makeStyles } from '@material-ui/core/styles'; import FolderIcon from '@material-ui/icons/Folder'; import FileOutlinedIcon from '@material-ui/icons/InsertDriveFileOutlined'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import React, { Fragment, useEffect, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { codeCoverageApiRef } from '../../api'; From 380ea7d67495c9a08f73e2dd4ebd9dfe2ecd3359 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 09:52:19 +0530 Subject: [PATCH 073/219] Add ESLint Rule to Code-Coverage Plugin Signed-off-by: Aditya Kumar --- .../components/CoverageHistoryChart/CoverageHistoryChart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx index bea6a8bec7..2ce9940d5a 100644 --- a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx +++ b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx @@ -25,7 +25,7 @@ import TrendingDownIcon from '@material-ui/icons/TrendingDown'; import TrendingFlatIcon from '@material-ui/icons/TrendingFlat'; import TrendingUpIcon from '@material-ui/icons/TrendingUp'; import Alert from '@material-ui/lab/Alert'; -import ClassNameMap from '@material-ui/styles/ClassNameMap'; +import { ClassNameMap } from '@material-ui/styles'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { From f2d3ea0bdc9f865e60d1d4977f1d29396e0afbaf Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 10:07:38 +0530 Subject: [PATCH 074/219] Add ESLint Rule to Codescene Plugin Signed-off-by: Aditya Kumar --- .changeset/nine-dryers-drive.md | 5 +++++ plugins/codescene/.eslintrc.js | 6 +++++- .../CodeHealthKpisCard/CodeHealthKpisCard.tsx | 5 ++++- .../CodeSceneEntityFileSummary.tsx | 2 +- .../CodeSceneEntityKPICard.tsx | 3 ++- .../CodeScenePageComponent.tsx | 2 +- .../CodeSceneProjectDetailsPage.tsx | 3 ++- .../ProjectsComponent/ProjectsComponent.tsx | 18 ++++++++---------- 8 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 .changeset/nine-dryers-drive.md diff --git a/.changeset/nine-dryers-drive.md b/.changeset/nine-dryers-drive.md new file mode 100644 index 0000000000..d2c7c6b7e6 --- /dev/null +++ b/.changeset/nine-dryers-drive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-codescene': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the Codescene plugin to migrate the Material UI imports. diff --git a/plugins/codescene/.eslintrc.js b/plugins/codescene/.eslintrc.js index e2a53a6ad2..6f6668b53d 100644 --- a/plugins/codescene/.eslintrc.js +++ b/plugins/codescene/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/codescene/src/components/CodeHealthKpisCard/CodeHealthKpisCard.tsx b/plugins/codescene/src/components/CodeHealthKpisCard/CodeHealthKpisCard.tsx index f7dda5c56c..59781f6304 100644 --- a/plugins/codescene/src/components/CodeHealthKpisCard/CodeHealthKpisCard.tsx +++ b/plugins/codescene/src/components/CodeHealthKpisCard/CodeHealthKpisCard.tsx @@ -14,7 +14,10 @@ * limitations under the License. */ import { EmptyState, InfoCard } from '@backstage/core-components'; -import { Button, Grid, makeStyles, Typography } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import React, { PropsWithChildren } from 'react'; import { Analysis } from '../../api/types'; import { Gauge } from '../Gauge/Gauge'; diff --git a/plugins/codescene/src/components/CodeSceneEntityFileSummary/CodeSceneEntityFileSummary.tsx b/plugins/codescene/src/components/CodeSceneEntityFileSummary/CodeSceneEntityFileSummary.tsx index db5cef8c44..5714bb15c4 100644 --- a/plugins/codescene/src/components/CodeSceneEntityFileSummary/CodeSceneEntityFileSummary.tsx +++ b/plugins/codescene/src/components/CodeSceneEntityFileSummary/CodeSceneEntityFileSummary.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import { Content, EmptyState, InfoCard } from '@backstage/core-components'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import Alert from '@material-ui/lab/Alert'; import React from 'react'; import { diff --git a/plugins/codescene/src/components/CodeSceneEntityKPICard/CodeSceneEntityKPICard.tsx b/plugins/codescene/src/components/CodeSceneEntityKPICard/CodeSceneEntityKPICard.tsx index 1757ad19cf..826d726d1f 100644 --- a/plugins/codescene/src/components/CodeSceneEntityKPICard/CodeSceneEntityKPICard.tsx +++ b/plugins/codescene/src/components/CodeSceneEntityKPICard/CodeSceneEntityKPICard.tsx @@ -29,7 +29,8 @@ import { } from '../../utils/commonUtil'; import { DateTime } from 'luxon'; import { MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react'; -import { Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; export const CodeSceneEntityKPICard = () => { const { entity } = useEntity(); diff --git a/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.tsx b/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.tsx index 118a68f39e..d3afcc0e06 100644 --- a/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.tsx +++ b/plugins/codescene/src/components/CodeScenePageComponent/CodeScenePageComponent.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React from 'react'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import { Header, Page, diff --git a/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.tsx b/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.tsx index dbacd919b4..6d3298383b 100644 --- a/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.tsx +++ b/plugins/codescene/src/components/CodeSceneProjectDetailsPage/CodeSceneProjectDetailsPage.tsx @@ -25,7 +25,8 @@ import { TableColumn, } from '@backstage/core-components'; import { configApiRef, useApi, useApp } from '@backstage/core-plugin-api'; -import { Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import Alert from '@material-ui/lab/Alert'; import React from 'react'; import { useParams } from 'react-router-dom'; diff --git a/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.tsx b/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.tsx index 212ab6e746..b291002ae4 100644 --- a/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.tsx +++ b/plugins/codescene/src/components/ProjectsComponent/ProjectsComponent.tsx @@ -27,16 +27,14 @@ import { Link as RouterLink } from 'react-router-dom'; import { rootRouteRef } from '../../routes'; import { codesceneApiRef } from '../../api/api'; import { Project, Analysis } from '../../api/types'; -import { - Grid, - Card, - CardActionArea, - Input, - makeStyles, - CardContent, - Chip, - CardActions, -} from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Card from '@material-ui/core/Card'; +import CardActionArea from '@material-ui/core/CardActionArea'; +import Input from '@material-ui/core/Input'; +import CardContent from '@material-ui/core/CardContent'; +import Chip from '@material-ui/core/Chip'; +import CardActions from '@material-ui/core/CardActions'; +import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles(() => ({ overflowXScroll: { From 9c9e0a10d926a81d9330126fd00a82ea3aec3586 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 12:45:22 +0530 Subject: [PATCH 075/219] Add ESLint Rule to Gcalendar Plugin Signed-off-by: Aditya Kumar --- .changeset/healthy-suits-fetch.md | 5 +++++ plugins/gcalendar/.eslintrc.js | 6 +++++- .../components/CalendarCard/AttendeeChip.tsx | 4 +++- .../components/CalendarCard/CalendarCard.tsx | 4 +++- .../components/CalendarCard/CalendarEvent.tsx | 14 ++++++-------- .../CalendarEventPopoverContent.tsx | 14 ++++++-------- .../components/CalendarCard/CalendarSelect.tsx | 18 ++++++++---------- .../components/CalendarCard/SignInContent.tsx | 4 +++- 8 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 .changeset/healthy-suits-fetch.md diff --git a/.changeset/healthy-suits-fetch.md b/.changeset/healthy-suits-fetch.md new file mode 100644 index 0000000000..3477679d8f --- /dev/null +++ b/.changeset/healthy-suits-fetch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-gcalendar': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the GCalendar plugin to migrate the Material UI imports. diff --git a/plugins/gcalendar/.eslintrc.js b/plugins/gcalendar/.eslintrc.js index e2a53a6ad2..91d571d5ed 100644 --- a/plugins/gcalendar/.eslintrc.js +++ b/plugins/gcalendar/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); \ No newline at end of file diff --git a/plugins/gcalendar/src/components/CalendarCard/AttendeeChip.tsx b/plugins/gcalendar/src/components/CalendarCard/AttendeeChip.tsx index 9008f263bf..184a5b0a27 100644 --- a/plugins/gcalendar/src/components/CalendarCard/AttendeeChip.tsx +++ b/plugins/gcalendar/src/components/CalendarCard/AttendeeChip.tsx @@ -15,7 +15,9 @@ */ import React from 'react'; -import { Badge, Chip, makeStyles } from '@material-ui/core'; +import Badge from '@material-ui/core/Badge'; +import Chip from '@material-ui/core/Chip'; +import { makeStyles } from '@material-ui/core/styles'; import CancelIcon from '@material-ui/icons/Cancel'; import CheckIcon from '@material-ui/icons/CheckCircle'; import { EventAttendee, ResponseStatus } from '../../api'; diff --git a/plugins/gcalendar/src/components/CalendarCard/CalendarCard.tsx b/plugins/gcalendar/src/components/CalendarCard/CalendarCard.tsx index 26d6f1eed0..e26e245174 100644 --- a/plugins/gcalendar/src/components/CalendarCard/CalendarCard.tsx +++ b/plugins/gcalendar/src/components/CalendarCard/CalendarCard.tsx @@ -21,7 +21,9 @@ import React, { useState } from 'react'; import { InfoCard, Progress } from '@backstage/core-components'; import { useAnalytics } from '@backstage/core-plugin-api'; -import { Box, IconButton, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import IconButton from '@material-ui/core/IconButton'; +import Typography from '@material-ui/core/Typography'; import PrevIcon from '@material-ui/icons/NavigateBefore'; import NextIcon from '@material-ui/icons/NavigateNext'; diff --git a/plugins/gcalendar/src/components/CalendarCard/CalendarEvent.tsx b/plugins/gcalendar/src/components/CalendarCard/CalendarEvent.tsx index 5ea538df86..d1c9791354 100644 --- a/plugins/gcalendar/src/components/CalendarCard/CalendarEvent.tsx +++ b/plugins/gcalendar/src/components/CalendarCard/CalendarEvent.tsx @@ -24,14 +24,12 @@ import React, { useState } from 'react'; import { useAnalytics } from '@backstage/core-plugin-api'; import { Link } from '@backstage/core-components'; -import { - Box, - Paper, - Popover, - Tooltip, - Typography, - makeStyles, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Paper from '@material-ui/core/Paper'; +import Popover from '@material-ui/core/Popover'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import zoomIcon from '../../icons/zoomIcon.svg'; import { CalendarEventPopoverContent } from './CalendarEventPopoverContent'; diff --git a/plugins/gcalendar/src/components/CalendarCard/CalendarEventPopoverContent.tsx b/plugins/gcalendar/src/components/CalendarCard/CalendarEventPopoverContent.tsx index 45e793470b..36dfa493e4 100644 --- a/plugins/gcalendar/src/components/CalendarCard/CalendarEventPopoverContent.tsx +++ b/plugins/gcalendar/src/components/CalendarCard/CalendarEventPopoverContent.tsx @@ -19,14 +19,12 @@ import DOMPurify from 'dompurify'; import { useAnalytics } from '@backstage/core-plugin-api'; import { Link } from '@backstage/core-components'; -import { - Box, - Divider, - IconButton, - Tooltip, - Typography, - makeStyles, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Divider from '@material-ui/core/Divider'; +import IconButton from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import ArrowForwardIcon from '@material-ui/icons/ArrowForward'; import { AttendeeChip } from './AttendeeChip'; diff --git a/plugins/gcalendar/src/components/CalendarCard/CalendarSelect.tsx b/plugins/gcalendar/src/components/CalendarCard/CalendarSelect.tsx index cd48d9ad3e..cd69db2230 100644 --- a/plugins/gcalendar/src/components/CalendarCard/CalendarSelect.tsx +++ b/plugins/gcalendar/src/components/CalendarCard/CalendarSelect.tsx @@ -16,16 +16,14 @@ import { sortBy } from 'lodash'; import React from 'react'; -import { - Checkbox, - FormControl, - Input, - ListItemText, - MenuItem, - Select, - Typography, - makeStyles, -} from '@material-ui/core'; +import Checkbox from '@material-ui/core/Checkbox'; +import FormControl from '@material-ui/core/FormControl'; +import Input from '@material-ui/core/Input'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import { GCalendar } from '../../api'; diff --git a/plugins/gcalendar/src/components/CalendarCard/SignInContent.tsx b/plugins/gcalendar/src/components/CalendarCard/SignInContent.tsx index 544d761102..4e1690cd84 100644 --- a/plugins/gcalendar/src/components/CalendarCard/SignInContent.tsx +++ b/plugins/gcalendar/src/components/CalendarCard/SignInContent.tsx @@ -15,7 +15,9 @@ */ import React from 'react'; -import { Box, Button, styled } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import { styled } from '@material-ui/core/styles'; import { CalendarEvent } from './CalendarEvent'; import { eventsMock } from './signInEventMock'; import { GCalendarEvent } from '../../api'; From c501ccb04a6ff46f6f5b1d9c8ee1b88ca004919f Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 12:50:47 +0530 Subject: [PATCH 076/219] Add ESLint Rule to Gcalendar Plugin Signed-off-by: Aditya Kumar --- plugins/gcalendar/.eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gcalendar/.eslintrc.js b/plugins/gcalendar/.eslintrc.js index 91d571d5ed..8a594f42ab 100644 --- a/plugins/gcalendar/.eslintrc.js +++ b/plugins/gcalendar/.eslintrc.js @@ -2,4 +2,4 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { rules: { '@backstage/no-top-level-material-ui-4-imports': 'error', }, -}); \ No newline at end of file +}); From 73c39a092a51b82f45dba681ad75c271531f6b49 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 13:07:00 +0530 Subject: [PATCH 077/219] Add ESLint Rule to Gcalendar Plugin Signed-off-by: Aditya Kumar --- .changeset/healthy-suits-fetch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/healthy-suits-fetch.md b/.changeset/healthy-suits-fetch.md index 3477679d8f..600b9fb93c 100644 --- a/.changeset/healthy-suits-fetch.md +++ b/.changeset/healthy-suits-fetch.md @@ -2,4 +2,4 @@ '@backstage/plugin-gcalendar': patch --- -Added ESLint rule `no-top-level-material-ui-4-imports` in the GCalendar plugin to migrate the Material UI imports. +Added ESLint rule `no-top-level-material-ui-4-imports` in the gcalendar plugin to migrate the Material UI imports. From 75277abc5f63c364ab3e1ec012ee1878f47f6148 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 13:14:30 +0530 Subject: [PATCH 078/219] Add ESLint Rule to Jenkins Plugin Signed-off-by: Aditya Kumar --- .changeset/wise-schools-invite.md | 5 +++++ plugins/jenkins/.eslintrc.js | 6 +++++- .../BuildWithStepsPage/BuildWithStepsPage.tsx | 18 ++++++++---------- .../lib/ActionOutput/ActionOutput.tsx | 10 ++++------ .../BuildsPage/lib/CITable/CITable.tsx | 3 ++- .../BuildsPage/lib/CITable/columns.tsx | 5 ++++- plugins/jenkins/src/components/Cards/Cards.tsx | 3 ++- .../components/JobRunsTable/JobRunsTable.tsx | 5 ++++- 8 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 .changeset/wise-schools-invite.md diff --git a/.changeset/wise-schools-invite.md b/.changeset/wise-schools-invite.md new file mode 100644 index 0000000000..50cd0c8171 --- /dev/null +++ b/.changeset/wise-schools-invite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-jenkins': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the Jenkins plugin to migrate the Material UI imports. diff --git a/plugins/jenkins/.eslintrc.js b/plugins/jenkins/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/jenkins/.eslintrc.js +++ b/plugins/jenkins/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx index 3b52c65930..88c7d12ff6 100644 --- a/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx +++ b/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -13,16 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - Box, - Paper, - Table, - TableBody, - TableCell, - TableContainer, - TableRow, - Typography, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Paper from '@material-ui/core/Paper'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableContainer from '@material-ui/core/TableContainer'; +import TableRow from '@material-ui/core/TableRow'; +import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import ExternalLinkIcon from '@material-ui/icons/Launch'; import React from 'react'; diff --git a/plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx b/plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx index 2cfc4eb073..750c79ff9f 100644 --- a/plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx @@ -14,12 +14,10 @@ * limitations under the License. */ -import { - Accordion, - AccordionDetails, - AccordionSummary, - Typography, -} from '@material-ui/core'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import React, { useEffect } from 'react'; diff --git a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx index 1f5d272c61..5318c4feb1 100644 --- a/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ import { Table, TableColumn } from '@backstage/core-components'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import RetryIcon from '@material-ui/icons/Replay'; import { default as React } from 'react'; import { Project } from '../../../../api/JenkinsApi'; diff --git a/plugins/jenkins/src/components/BuildsPage/lib/CITable/columns.tsx b/plugins/jenkins/src/components/BuildsPage/lib/CITable/columns.tsx index f18d3e5b21..cdf2b2febe 100644 --- a/plugins/jenkins/src/components/BuildsPage/lib/CITable/columns.tsx +++ b/plugins/jenkins/src/components/BuildsPage/lib/CITable/columns.tsx @@ -16,7 +16,10 @@ import { Link, Progress, TableColumn } from '@backstage/core-components'; import { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; import { useEntityPermission } from '@backstage/plugin-catalog-react/alpha'; -import { Box, IconButton, Tooltip, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import IconButton from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; import RetryIcon from '@material-ui/icons/Replay'; import VisibilityIcon from '@material-ui/icons/Visibility'; import HistoryIcon from '@material-ui/icons/History'; diff --git a/plugins/jenkins/src/components/Cards/Cards.tsx b/plugins/jenkins/src/components/Cards/Cards.tsx index 1cbc3e5d9f..0ae46a346f 100644 --- a/plugins/jenkins/src/components/Cards/Cards.tsx +++ b/plugins/jenkins/src/components/Cards/Cards.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { LinearProgress, makeStyles } from '@material-ui/core'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import { makeStyles } from '@material-ui/core/styles'; import ExternalLinkIcon from '@material-ui/icons/Launch'; import { DateTime, Duration } from 'luxon'; import React from 'react'; diff --git a/plugins/jenkins/src/components/JobRunsTable/JobRunsTable.tsx b/plugins/jenkins/src/components/JobRunsTable/JobRunsTable.tsx index 78b66b98eb..9fa2f71448 100644 --- a/plugins/jenkins/src/components/JobRunsTable/JobRunsTable.tsx +++ b/plugins/jenkins/src/components/JobRunsTable/JobRunsTable.tsx @@ -14,7 +14,10 @@ * limitations under the License. */ import { Link, Table, TableColumn } from '@backstage/core-components'; -import { Box, IconButton, Tooltip, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import IconButton from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; import { default as React } from 'react'; import JenkinsLogo from './../../assets/JenkinsLogo.svg'; import { useJobRuns } from './../useJobRuns'; From 3913fd8ef526f91848fe52a2d3aa9c3f8efe6789 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 13:32:06 +0530 Subject: [PATCH 079/219] Add ESLint Rule to Kafka Plugin Signed-off-by: Aditya Kumar --- .changeset/wise-fireants-doubt.md | 5 +++++ plugins/kafka/.eslintrc.js | 6 +++++- .../ConsumerGroupOffsets/ConsumerGroupOffsets.tsx | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 .changeset/wise-fireants-doubt.md diff --git a/.changeset/wise-fireants-doubt.md b/.changeset/wise-fireants-doubt.md new file mode 100644 index 0000000000..7ec973b64c --- /dev/null +++ b/.changeset/wise-fireants-doubt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kafka': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the Kafka plugin to migrate the Material UI imports. diff --git a/plugins/kafka/.eslintrc.js b/plugins/kafka/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/kafka/.eslintrc.js +++ b/plugins/kafka/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/kafka/src/components/ConsumerGroupOffsets/ConsumerGroupOffsets.tsx b/plugins/kafka/src/components/ConsumerGroupOffsets/ConsumerGroupOffsets.tsx index d166195cf9..5aab647b25 100644 --- a/plugins/kafka/src/components/ConsumerGroupOffsets/ConsumerGroupOffsets.tsx +++ b/plugins/kafka/src/components/ConsumerGroupOffsets/ConsumerGroupOffsets.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { Box, Grid, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import RetryIcon from '@material-ui/icons/Replay'; import React from 'react'; import { useConsumerGroupsOffsetsForEntity } from './useConsumerGroupsOffsetsForEntity'; From c4c8476825e22094ac08ebe273e9325cf3bd8981 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 14:27:39 +0530 Subject: [PATCH 080/219] Add ESLint Rule to Lighthouse Plugin Signed-off-by: Aditya Kumar --- .changeset/rich-houses-wonder.md | 5 +++++ plugins/lighthouse/.eslintrc.js | 6 +++++- .../components/AuditList/AuditListForEntity.tsx | 2 +- .../src/components/AuditList/index.tsx | 3 ++- .../src/components/AuditView/index.tsx | 16 +++++++--------- .../src/components/CreateAudit/index.tsx | 16 +++++++--------- .../lighthouse/src/components/Intro/index.tsx | 6 +++++- 7 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 .changeset/rich-houses-wonder.md diff --git a/.changeset/rich-houses-wonder.md b/.changeset/rich-houses-wonder.md new file mode 100644 index 0000000000..7aa392badf --- /dev/null +++ b/.changeset/rich-houses-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-lighthouse': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the Lighthouse plugin to migrate the Material UI imports. diff --git a/plugins/lighthouse/.eslintrc.js b/plugins/lighthouse/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/lighthouse/.eslintrc.js +++ b/plugins/lighthouse/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/lighthouse/src/components/AuditList/AuditListForEntity.tsx b/plugins/lighthouse/src/components/AuditList/AuditListForEntity.tsx index 4c8de4d786..779309c648 100644 --- a/plugins/lighthouse/src/components/AuditList/AuditListForEntity.tsx +++ b/plugins/lighthouse/src/components/AuditList/AuditListForEntity.tsx @@ -24,7 +24,7 @@ import { Progress, WarningPanel, } from '@backstage/core-components'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { resolvePath, useNavigate } from 'react-router-dom'; import { useEntity } from '@backstage/plugin-catalog-react'; import { useRouteRef } from '@backstage/core-plugin-api'; diff --git a/plugins/lighthouse/src/components/AuditList/index.tsx b/plugins/lighthouse/src/components/AuditList/index.tsx index f030ec4708..77df8217c5 100644 --- a/plugins/lighthouse/src/components/AuditList/index.tsx +++ b/plugins/lighthouse/src/components/AuditList/index.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Button, Grid } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; import Pagination from '@material-ui/lab/Pagination'; import React, { ChangeEvent, ReactNode, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; diff --git a/plugins/lighthouse/src/components/AuditView/index.tsx b/plugins/lighthouse/src/components/AuditView/index.tsx index 8d82f920cd..66a3880148 100644 --- a/plugins/lighthouse/src/components/AuditView/index.tsx +++ b/plugins/lighthouse/src/components/AuditView/index.tsx @@ -14,15 +14,13 @@ * limitations under the License. */ -import { - Button, - Grid, - List, - ListItem, - ListItemIcon, - ListItemText, - makeStyles, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import Alert from '@material-ui/lab/Alert'; import React, { ReactNode, useEffect, useState } from 'react'; import { diff --git a/plugins/lighthouse/src/components/CreateAudit/index.tsx b/plugins/lighthouse/src/components/CreateAudit/index.tsx index a76b031796..1e941256e8 100644 --- a/plugins/lighthouse/src/components/CreateAudit/index.tsx +++ b/plugins/lighthouse/src/components/CreateAudit/index.tsx @@ -14,15 +14,13 @@ * limitations under the License. */ -import { - Button, - Grid, - List, - ListItem, - makeStyles, - MenuItem, - TextField, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import MenuItem from '@material-ui/core/MenuItem'; +import TextField from '@material-ui/core/TextField'; +import { makeStyles } from '@material-ui/core/styles'; import React, { useCallback, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { diff --git a/plugins/lighthouse/src/components/Intro/index.tsx b/plugins/lighthouse/src/components/Intro/index.tsx index 4c102b7587..044d4cc408 100644 --- a/plugins/lighthouse/src/components/Intro/index.tsx +++ b/plugins/lighthouse/src/components/Intro/index.tsx @@ -14,7 +14,11 @@ * limitations under the License. */ -import { Button, Grid, makeStyles, Tab, Tabs } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tab from '@material-ui/core/Tab'; +import Tabs from '@material-ui/core/Tabs'; +import { makeStyles } from '@material-ui/core/styles'; import CloseIcon from '@material-ui/icons/Close'; import React, { useState } from 'react'; import useLocalStorage from 'react-use/lib/useLocalStorage'; From 6edc412b97d009797a9f90fcc38cd665abdf3e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 15 Mar 2024 10:29:52 +0100 Subject: [PATCH 081/219] Update .changeset/healthy-suits-fetch.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/healthy-suits-fetch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/healthy-suits-fetch.md b/.changeset/healthy-suits-fetch.md index 600b9fb93c..29ff940b8f 100644 --- a/.changeset/healthy-suits-fetch.md +++ b/.changeset/healthy-suits-fetch.md @@ -2,4 +2,4 @@ '@backstage/plugin-gcalendar': patch --- -Added ESLint rule `no-top-level-material-ui-4-imports` in the gcalendar plugin to migrate the Material UI imports. +Added ESLint rule `no-top-level-material-ui-4-imports` in the `gcalendar` plugin to migrate the Material UI imports. From 92be43b9b370a4b06b7c226446d3e8b0ef49424d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 10:09:46 +0000 Subject: [PATCH 082/219] Update dependency @swc/core to v1.4.8 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- microsite/yarn.lock | 86 ++++++++++++++++++++++----------------------- storybook/yarn.lock | 86 ++++++++++++++++++++++----------------------- yarn.lock | 86 ++++++++++++++++++++++----------------------- 3 files changed, 129 insertions(+), 129 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index bce8e33ff1..60a81db3a0 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2697,90 +2697,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-darwin-arm64@npm:1.4.2" +"@swc/core-darwin-arm64@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-darwin-arm64@npm:1.4.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-darwin-x64@npm:1.4.2" +"@swc/core-darwin-x64@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-darwin-x64@npm:1.4.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.2" +"@swc/core-linux-arm-gnueabihf@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm64-gnu@npm:1.4.2" +"@swc/core-linux-arm64-gnu@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm64-gnu@npm:1.4.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm64-musl@npm:1.4.2" +"@swc/core-linux-arm64-musl@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm64-musl@npm:1.4.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-x64-gnu@npm:1.4.2" +"@swc/core-linux-x64-gnu@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-x64-gnu@npm:1.4.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-x64-musl@npm:1.4.2" +"@swc/core-linux-x64-musl@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-x64-musl@npm:1.4.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-arm64-msvc@npm:1.4.2" +"@swc/core-win32-arm64-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-arm64-msvc@npm:1.4.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-ia32-msvc@npm:1.4.2" +"@swc/core-win32-ia32-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-ia32-msvc@npm:1.4.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-x64-msvc@npm:1.4.2" +"@swc/core-win32-x64-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-x64-msvc@npm:1.4.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.4.2 - resolution: "@swc/core@npm:1.4.2" + version: 1.4.8 + resolution: "@swc/core@npm:1.4.8" dependencies: - "@swc/core-darwin-arm64": 1.4.2 - "@swc/core-darwin-x64": 1.4.2 - "@swc/core-linux-arm-gnueabihf": 1.4.2 - "@swc/core-linux-arm64-gnu": 1.4.2 - "@swc/core-linux-arm64-musl": 1.4.2 - "@swc/core-linux-x64-gnu": 1.4.2 - "@swc/core-linux-x64-musl": 1.4.2 - "@swc/core-win32-arm64-msvc": 1.4.2 - "@swc/core-win32-ia32-msvc": 1.4.2 - "@swc/core-win32-x64-msvc": 1.4.2 + "@swc/core-darwin-arm64": 1.4.8 + "@swc/core-darwin-x64": 1.4.8 + "@swc/core-linux-arm-gnueabihf": 1.4.8 + "@swc/core-linux-arm64-gnu": 1.4.8 + "@swc/core-linux-arm64-musl": 1.4.8 + "@swc/core-linux-x64-gnu": 1.4.8 + "@swc/core-linux-x64-musl": 1.4.8 + "@swc/core-win32-arm64-msvc": 1.4.8 + "@swc/core-win32-ia32-msvc": 1.4.8 + "@swc/core-win32-x64-msvc": 1.4.8 "@swc/counter": ^0.1.2 "@swc/types": ^0.1.5 peerDependencies: @@ -2809,7 +2809,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: b17afda692b2627d3a82e589f1b29cef31bdee626a2dd997d78312dcbfc6eb701850fbab22e85f02b1261da39f0b0afb6a236c6065f6d0d7478cff939ca5a888 + checksum: 3284e64fe72896d1be8637f7fdcbba575d86e02da056a8c5208c93877250bfb1922fc5194281926650d5694e2434b7906efc0db8925769a4558f5fbd93028fd6 languageName: node linkType: hard diff --git a/storybook/yarn.lock b/storybook/yarn.lock index ffb632f758..5cda56a327 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2842,90 +2842,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-darwin-arm64@npm:1.4.2" +"@swc/core-darwin-arm64@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-darwin-arm64@npm:1.4.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-darwin-x64@npm:1.4.2" +"@swc/core-darwin-x64@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-darwin-x64@npm:1.4.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.2" +"@swc/core-linux-arm-gnueabihf@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm64-gnu@npm:1.4.2" +"@swc/core-linux-arm64-gnu@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm64-gnu@npm:1.4.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm64-musl@npm:1.4.2" +"@swc/core-linux-arm64-musl@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm64-musl@npm:1.4.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-x64-gnu@npm:1.4.2" +"@swc/core-linux-x64-gnu@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-x64-gnu@npm:1.4.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-x64-musl@npm:1.4.2" +"@swc/core-linux-x64-musl@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-x64-musl@npm:1.4.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-arm64-msvc@npm:1.4.2" +"@swc/core-win32-arm64-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-arm64-msvc@npm:1.4.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-ia32-msvc@npm:1.4.2" +"@swc/core-win32-ia32-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-ia32-msvc@npm:1.4.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-x64-msvc@npm:1.4.2" +"@swc/core-win32-x64-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-x64-msvc@npm:1.4.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.4.2 - resolution: "@swc/core@npm:1.4.2" + version: 1.4.8 + resolution: "@swc/core@npm:1.4.8" dependencies: - "@swc/core-darwin-arm64": 1.4.2 - "@swc/core-darwin-x64": 1.4.2 - "@swc/core-linux-arm-gnueabihf": 1.4.2 - "@swc/core-linux-arm64-gnu": 1.4.2 - "@swc/core-linux-arm64-musl": 1.4.2 - "@swc/core-linux-x64-gnu": 1.4.2 - "@swc/core-linux-x64-musl": 1.4.2 - "@swc/core-win32-arm64-msvc": 1.4.2 - "@swc/core-win32-ia32-msvc": 1.4.2 - "@swc/core-win32-x64-msvc": 1.4.2 + "@swc/core-darwin-arm64": 1.4.8 + "@swc/core-darwin-x64": 1.4.8 + "@swc/core-linux-arm-gnueabihf": 1.4.8 + "@swc/core-linux-arm64-gnu": 1.4.8 + "@swc/core-linux-arm64-musl": 1.4.8 + "@swc/core-linux-x64-gnu": 1.4.8 + "@swc/core-linux-x64-musl": 1.4.8 + "@swc/core-win32-arm64-msvc": 1.4.8 + "@swc/core-win32-ia32-msvc": 1.4.8 + "@swc/core-win32-x64-msvc": 1.4.8 "@swc/counter": ^0.1.2 "@swc/types": ^0.1.5 peerDependencies: @@ -2954,7 +2954,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: b17afda692b2627d3a82e589f1b29cef31bdee626a2dd997d78312dcbfc6eb701850fbab22e85f02b1261da39f0b0afb6a236c6065f6d0d7478cff939ca5a888 + checksum: 3284e64fe72896d1be8637f7fdcbba575d86e02da056a8c5208c93877250bfb1922fc5194281926650d5694e2434b7906efc0db8925769a4558f5fbd93028fd6 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index ee48e36cef..b697b61644 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17843,90 +17843,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-darwin-arm64@npm:1.4.2" +"@swc/core-darwin-arm64@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-darwin-arm64@npm:1.4.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-darwin-x64@npm:1.4.2" +"@swc/core-darwin-x64@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-darwin-x64@npm:1.4.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.2" +"@swc/core-linux-arm-gnueabihf@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm64-gnu@npm:1.4.2" +"@swc/core-linux-arm64-gnu@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm64-gnu@npm:1.4.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-arm64-musl@npm:1.4.2" +"@swc/core-linux-arm64-musl@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-arm64-musl@npm:1.4.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-x64-gnu@npm:1.4.2" +"@swc/core-linux-x64-gnu@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-x64-gnu@npm:1.4.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-linux-x64-musl@npm:1.4.2" +"@swc/core-linux-x64-musl@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-linux-x64-musl@npm:1.4.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-arm64-msvc@npm:1.4.2" +"@swc/core-win32-arm64-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-arm64-msvc@npm:1.4.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-ia32-msvc@npm:1.4.2" +"@swc/core-win32-ia32-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-ia32-msvc@npm:1.4.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.4.2": - version: 1.4.2 - resolution: "@swc/core-win32-x64-msvc@npm:1.4.2" +"@swc/core-win32-x64-msvc@npm:1.4.8": + version: 1.4.8 + resolution: "@swc/core-win32-x64-msvc@npm:1.4.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.4.2 - resolution: "@swc/core@npm:1.4.2" + version: 1.4.8 + resolution: "@swc/core@npm:1.4.8" dependencies: - "@swc/core-darwin-arm64": 1.4.2 - "@swc/core-darwin-x64": 1.4.2 - "@swc/core-linux-arm-gnueabihf": 1.4.2 - "@swc/core-linux-arm64-gnu": 1.4.2 - "@swc/core-linux-arm64-musl": 1.4.2 - "@swc/core-linux-x64-gnu": 1.4.2 - "@swc/core-linux-x64-musl": 1.4.2 - "@swc/core-win32-arm64-msvc": 1.4.2 - "@swc/core-win32-ia32-msvc": 1.4.2 - "@swc/core-win32-x64-msvc": 1.4.2 + "@swc/core-darwin-arm64": 1.4.8 + "@swc/core-darwin-x64": 1.4.8 + "@swc/core-linux-arm-gnueabihf": 1.4.8 + "@swc/core-linux-arm64-gnu": 1.4.8 + "@swc/core-linux-arm64-musl": 1.4.8 + "@swc/core-linux-x64-gnu": 1.4.8 + "@swc/core-linux-x64-musl": 1.4.8 + "@swc/core-win32-arm64-msvc": 1.4.8 + "@swc/core-win32-ia32-msvc": 1.4.8 + "@swc/core-win32-x64-msvc": 1.4.8 "@swc/counter": ^0.1.2 "@swc/types": ^0.1.5 peerDependencies: @@ -17955,7 +17955,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: b17afda692b2627d3a82e589f1b29cef31bdee626a2dd997d78312dcbfc6eb701850fbab22e85f02b1261da39f0b0afb6a236c6065f6d0d7478cff939ca5a888 + checksum: 3284e64fe72896d1be8637f7fdcbba575d86e02da056a8c5208c93877250bfb1922fc5194281926650d5694e2434b7906efc0db8925769a4558f5fbd93028fd6 languageName: node linkType: hard From 10e8b8b7213f7d029adbe56c51513d5ac2f8c04a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 10:10:55 +0000 Subject: [PATCH 083/219] Update dependency archiver to v6.0.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ee48e36cef..f86b6fb8b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21379,8 +21379,8 @@ __metadata: linkType: hard "archiver@npm:^6.0.0": - version: 6.0.1 - resolution: "archiver@npm:6.0.1" + version: 6.0.2 + resolution: "archiver@npm:6.0.2" dependencies: archiver-utils: ^4.0.1 async: ^3.2.4 @@ -21389,7 +21389,7 @@ __metadata: readdir-glob: ^1.1.2 tar-stream: ^3.0.0 zip-stream: ^5.0.1 - checksum: 20549eef7366173440a86873387412226568744a410626f826998b0dda85fe84e739c542d9db9aca3923b772436eb795eafdff29c2983e683355fdd9faaa0fdb + checksum: 17a20a1291d9bf41e25c96f029373bec5306d6e381063b3ab06ea805d234afaf55a7829c3577dd003558c188c6631769a80c51f245175fdb8310631df36ceb4b languageName: node linkType: hard From 6c9961f369f8c5a1888e8fa8f743ef96f76db731 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 16:14:21 +0530 Subject: [PATCH 084/219] Add ESLint Rule to Code-Coverage Plugin Signed-off-by: Aditya Kumar --- .../components/CoverageHistoryChart/CoverageHistoryChart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx index 2ce9940d5a..63784b6b3f 100644 --- a/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx +++ b/plugins/code-coverage/src/components/CoverageHistoryChart/CoverageHistoryChart.tsx @@ -25,7 +25,7 @@ import TrendingDownIcon from '@material-ui/icons/TrendingDown'; import TrendingFlatIcon from '@material-ui/icons/TrendingFlat'; import TrendingUpIcon from '@material-ui/icons/TrendingUp'; import Alert from '@material-ui/lab/Alert'; -import { ClassNameMap } from '@material-ui/styles'; +import { ClassNameMap } from '@material-ui/styles/withStyles'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { From 7ab13e86bd1fff3580c5ad977216a848d9101a67 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 11:26:24 +0000 Subject: [PATCH 085/219] Update dependency esbuild to v0.20.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 190 +++++++++++++++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/yarn.lock b/yarn.lock index f86b6fb8b2..d074c040cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10965,9 +10965,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/aix-ppc64@npm:0.20.1" +"@esbuild/aix-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/aix-ppc64@npm:0.20.2" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -10986,9 +10986,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/android-arm64@npm:0.20.1" +"@esbuild/android-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm64@npm:0.20.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -11007,9 +11007,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/android-arm@npm:0.20.1" +"@esbuild/android-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm@npm:0.20.2" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -11028,9 +11028,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/android-x64@npm:0.20.1" +"@esbuild/android-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-x64@npm:0.20.2" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -11049,9 +11049,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/darwin-arm64@npm:0.20.1" +"@esbuild/darwin-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-arm64@npm:0.20.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -11070,9 +11070,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/darwin-x64@npm:0.20.1" +"@esbuild/darwin-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-x64@npm:0.20.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -11091,9 +11091,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/freebsd-arm64@npm:0.20.1" +"@esbuild/freebsd-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-arm64@npm:0.20.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -11112,9 +11112,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/freebsd-x64@npm:0.20.1" +"@esbuild/freebsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-x64@npm:0.20.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -11133,9 +11133,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-arm64@npm:0.20.1" +"@esbuild/linux-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm64@npm:0.20.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -11154,9 +11154,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-arm@npm:0.20.1" +"@esbuild/linux-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm@npm:0.20.2" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -11175,9 +11175,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-ia32@npm:0.20.1" +"@esbuild/linux-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ia32@npm:0.20.2" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -11196,9 +11196,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-loong64@npm:0.20.1" +"@esbuild/linux-loong64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-loong64@npm:0.20.2" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -11217,9 +11217,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-mips64el@npm:0.20.1" +"@esbuild/linux-mips64el@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-mips64el@npm:0.20.2" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -11238,9 +11238,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-ppc64@npm:0.20.1" +"@esbuild/linux-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ppc64@npm:0.20.2" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -11259,9 +11259,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-riscv64@npm:0.20.1" +"@esbuild/linux-riscv64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-riscv64@npm:0.20.2" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -11280,9 +11280,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-s390x@npm:0.20.1" +"@esbuild/linux-s390x@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-s390x@npm:0.20.2" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -11301,9 +11301,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/linux-x64@npm:0.20.1" +"@esbuild/linux-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-x64@npm:0.20.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -11322,9 +11322,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/netbsd-x64@npm:0.20.1" +"@esbuild/netbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/netbsd-x64@npm:0.20.2" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -11343,9 +11343,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/openbsd-x64@npm:0.20.1" +"@esbuild/openbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/openbsd-x64@npm:0.20.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -11364,9 +11364,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/sunos-x64@npm:0.20.1" +"@esbuild/sunos-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/sunos-x64@npm:0.20.2" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -11385,9 +11385,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/win32-arm64@npm:0.20.1" +"@esbuild/win32-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-arm64@npm:0.20.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -11406,9 +11406,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/win32-ia32@npm:0.20.1" +"@esbuild/win32-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-ia32@npm:0.20.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -11427,9 +11427,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.1": - version: 0.20.1 - resolution: "@esbuild/win32-x64@npm:0.20.1" +"@esbuild/win32-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-x64@npm:0.20.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -26844,32 +26844,32 @@ __metadata: linkType: hard "esbuild@npm:^0.20.0": - version: 0.20.1 - resolution: "esbuild@npm:0.20.1" + version: 0.20.2 + resolution: "esbuild@npm:0.20.2" dependencies: - "@esbuild/aix-ppc64": 0.20.1 - "@esbuild/android-arm": 0.20.1 - "@esbuild/android-arm64": 0.20.1 - "@esbuild/android-x64": 0.20.1 - "@esbuild/darwin-arm64": 0.20.1 - "@esbuild/darwin-x64": 0.20.1 - "@esbuild/freebsd-arm64": 0.20.1 - "@esbuild/freebsd-x64": 0.20.1 - "@esbuild/linux-arm": 0.20.1 - "@esbuild/linux-arm64": 0.20.1 - "@esbuild/linux-ia32": 0.20.1 - "@esbuild/linux-loong64": 0.20.1 - "@esbuild/linux-mips64el": 0.20.1 - "@esbuild/linux-ppc64": 0.20.1 - "@esbuild/linux-riscv64": 0.20.1 - "@esbuild/linux-s390x": 0.20.1 - "@esbuild/linux-x64": 0.20.1 - "@esbuild/netbsd-x64": 0.20.1 - "@esbuild/openbsd-x64": 0.20.1 - "@esbuild/sunos-x64": 0.20.1 - "@esbuild/win32-arm64": 0.20.1 - "@esbuild/win32-ia32": 0.20.1 - "@esbuild/win32-x64": 0.20.1 + "@esbuild/aix-ppc64": 0.20.2 + "@esbuild/android-arm": 0.20.2 + "@esbuild/android-arm64": 0.20.2 + "@esbuild/android-x64": 0.20.2 + "@esbuild/darwin-arm64": 0.20.2 + "@esbuild/darwin-x64": 0.20.2 + "@esbuild/freebsd-arm64": 0.20.2 + "@esbuild/freebsd-x64": 0.20.2 + "@esbuild/linux-arm": 0.20.2 + "@esbuild/linux-arm64": 0.20.2 + "@esbuild/linux-ia32": 0.20.2 + "@esbuild/linux-loong64": 0.20.2 + "@esbuild/linux-mips64el": 0.20.2 + "@esbuild/linux-ppc64": 0.20.2 + "@esbuild/linux-riscv64": 0.20.2 + "@esbuild/linux-s390x": 0.20.2 + "@esbuild/linux-x64": 0.20.2 + "@esbuild/netbsd-x64": 0.20.2 + "@esbuild/openbsd-x64": 0.20.2 + "@esbuild/sunos-x64": 0.20.2 + "@esbuild/win32-arm64": 0.20.2 + "@esbuild/win32-ia32": 0.20.2 + "@esbuild/win32-x64": 0.20.2 dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -26919,7 +26919,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: af8b3c79e48d303501cac8551bf1ac5ebf5d86eebf2d1eb9d2a7018f4c5506bb120ed2454a013e3387e499de780a916bbffc9edd4ef132be403cd39771ace045 + checksum: bc88050fc1ca5c1bd03648f9979e514bdefb956a63aa3974373bb7b9cbac0b3aac9b9da1b5bdca0b3490e39d6b451c72815dbd6b7d7f978c91fbe9c9e9aa4e4c languageName: node linkType: hard From 39fbea09e57f3d0f6017113b09ec01a41c80129b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 11:27:23 +0000 Subject: [PATCH 086/219] Update dependency express to v4.18.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 42 +++++------------------------------------- 1 file changed, 5 insertions(+), 37 deletions(-) diff --git a/yarn.lock b/yarn.lock index f86b6fb8b2..bf8a010b02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22466,27 +22466,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" - dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 - languageName: node - linkType: hard - -"body-parser@npm:^1.15.2, body-parser@npm:^1.20.0": +"body-parser@npm:1.20.2, body-parser@npm:^1.15.2, body-parser@npm:^1.20.0": version: 1.20.2 resolution: "body-parser@npm:1.20.2" dependencies: @@ -28044,12 +28024,12 @@ __metadata: linkType: hard "express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2": - version: 4.18.2 - resolution: "express@npm:4.18.2" + version: 4.18.3 + resolution: "express@npm:4.18.3" dependencies: accepts: ~1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: ~1.0.4 cookie: 0.5.0 @@ -28078,7 +28058,7 @@ __metadata: type-is: ~1.6.18 utils-merge: 1.0.1 vary: ~1.1.2 - checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 + checksum: 3d7fc8762a81dee0adf0b604f11627db2af082c5f2234e78a4aa8134f22c51f96c6282063f2f8b87f5dbc70679a3087caccb93b6107e324c6feb3a70960a5864 languageName: node linkType: hard @@ -39494,18 +39474,6 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e - languageName: node - linkType: hard - "raw-body@npm:2.5.2, raw-body@npm:^2.4.1": version: 2.5.2 resolution: "raw-body@npm:2.5.2" From 9daf3016076d015bccf89dc8fae91ffb945db397 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 15 Mar 2024 17:06:37 +0530 Subject: [PATCH 087/219] Add ESLint Rule to Xcmetrics Plugin Signed-off-by: Aditya Kumar --- .changeset/popular-poems-battle.md | 5 +++++ plugins/xcmetrics/.eslintrc.js | 6 +++++- .../src/components/Accordion/Accordion.tsx | 13 +++++-------- .../components/BuildDetails/BuildDetails.tsx | 6 ++++-- .../src/components/BuildList/BuildList.tsx | 3 ++- .../BuildListFilter/BuildListFilter.tsx | 5 ++++- .../src/components/BuildTableColumns.tsx | 2 +- .../components/BuildTimeline/BuildTimeline.tsx | 2 +- .../src/components/DataValue/DataValue.tsx | 4 +++- .../src/components/DatePicker/DatePicker.tsx | 16 +++++++--------- .../src/components/Overview/Overview.tsx | 4 ++-- .../OverviewTrends/OverviewTrends.tsx | 6 ++++-- .../PreformattedText/PreformattedText.tsx | 17 +++++++---------- .../src/components/StatusCell/StatusCell.tsx | 3 ++- .../components/StatusMatrix/StatusMatrix.tsx | 4 ++-- .../xcmetrics/src/components/Trend/Trend.tsx | 2 +- 16 files changed, 55 insertions(+), 43 deletions(-) create mode 100644 .changeset/popular-poems-battle.md diff --git a/.changeset/popular-poems-battle.md b/.changeset/popular-poems-battle.md new file mode 100644 index 0000000000..481603f03c --- /dev/null +++ b/.changeset/popular-poems-battle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-xcmetrics': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `xcmetrics` plugin to migrate the Material UI imports. diff --git a/plugins/xcmetrics/.eslintrc.js b/plugins/xcmetrics/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/xcmetrics/.eslintrc.js +++ b/plugins/xcmetrics/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/xcmetrics/src/components/Accordion/Accordion.tsx b/plugins/xcmetrics/src/components/Accordion/Accordion.tsx index 5c418de496..866b4148e8 100644 --- a/plugins/xcmetrics/src/components/Accordion/Accordion.tsx +++ b/plugins/xcmetrics/src/components/Accordion/Accordion.tsx @@ -14,14 +14,11 @@ * limitations under the License. */ -import { - Accordion as MuiAccordion, - AccordionSummary as MuiAccordionSummary, - Typography, - AccordionDetails, - makeStyles, - createStyles, -} from '@material-ui/core'; +import MuiAccordion from '@material-ui/core/Accordion'; +import MuiAccordionSummary from '@material-ui/core/AccordionSummary'; +import Typography from '@material-ui/core/Typography'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import { makeStyles, createStyles } from '@material-ui/core/styles'; import React, { PropsWithChildren } from 'react'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; diff --git a/plugins/xcmetrics/src/components/BuildDetails/BuildDetails.tsx b/plugins/xcmetrics/src/components/BuildDetails/BuildDetails.tsx index 86db3be858..52806797dc 100644 --- a/plugins/xcmetrics/src/components/BuildDetails/BuildDetails.tsx +++ b/plugins/xcmetrics/src/components/BuildDetails/BuildDetails.tsx @@ -14,11 +14,13 @@ * limitations under the License. */ -import { createStyles, Divider, Grid, makeStyles } from '@material-ui/core'; +import Divider from '@material-ui/core/Divider'; +import Grid from '@material-ui/core/Grid'; +import { createStyles, makeStyles } from '@material-ui/core/styles'; import React from 'react'; import { BuildResponse, xcmetricsApiRef } from '../../api'; import { Progress, StructuredMetadataTable } from '@backstage/core-components'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import useAsync from 'react-use/lib/useAsync'; import { useApi } from '@backstage/core-plugin-api'; import { formatDuration, formatStatus, formatTime } from '../../utils'; diff --git a/plugins/xcmetrics/src/components/BuildList/BuildList.tsx b/plugins/xcmetrics/src/components/BuildList/BuildList.tsx index 85eee6009d..0ddcd75aca 100644 --- a/plugins/xcmetrics/src/components/BuildList/BuildList.tsx +++ b/plugins/xcmetrics/src/components/BuildList/BuildList.tsx @@ -18,7 +18,8 @@ import React, { useRef, useState } from 'react'; import { Table } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; import { BuildFilters, xcmetricsApiRef } from '../../api'; -import { createStyles, Grid, makeStyles } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import { createStyles, makeStyles } from '@material-ui/core/styles'; import { BuildListFilter as Filters } from '../BuildListFilter'; import { DateTime } from 'luxon'; import { buildPageColumns } from '../BuildTableColumns'; diff --git a/plugins/xcmetrics/src/components/BuildListFilter/BuildListFilter.tsx b/plugins/xcmetrics/src/components/BuildListFilter/BuildListFilter.tsx index ce2a2f4c05..121a5cafab 100644 --- a/plugins/xcmetrics/src/components/BuildListFilter/BuildListFilter.tsx +++ b/plugins/xcmetrics/src/components/BuildListFilter/BuildListFilter.tsx @@ -15,7 +15,10 @@ */ import React, { useEffect, useState } from 'react'; -import { makeStyles, IconButton, Grid, Button } from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import Grid from '@material-ui/core/Grid'; +import Button from '@material-ui/core/Button'; +import { makeStyles } from '@material-ui/core/styles'; import FilterList from '@material-ui/icons/FilterList'; import { InfoCard, Select } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; diff --git a/plugins/xcmetrics/src/components/BuildTableColumns.tsx b/plugins/xcmetrics/src/components/BuildTableColumns.tsx index 0d1141dfae..709dc7bc90 100644 --- a/plugins/xcmetrics/src/components/BuildTableColumns.tsx +++ b/plugins/xcmetrics/src/components/BuildTableColumns.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Chip } from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; import React from 'react'; import { TableColumn } from '@backstage/core-components'; import { Build } from '../api'; diff --git a/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx b/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx index 5c0a1b1e67..ca4ce39d16 100644 --- a/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx +++ b/plugins/xcmetrics/src/components/BuildTimeline/BuildTimeline.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { createStyles, makeStyles, useTheme } from '@material-ui/core'; +import { createStyles, makeStyles, useTheme } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import React from 'react'; import { diff --git a/plugins/xcmetrics/src/components/DataValue/DataValue.tsx b/plugins/xcmetrics/src/components/DataValue/DataValue.tsx index 78f1cdcaea..fc38bd3bd6 100644 --- a/plugins/xcmetrics/src/components/DataValue/DataValue.tsx +++ b/plugins/xcmetrics/src/components/DataValue/DataValue.tsx @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Grid, GridSize, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import { GridSize } from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; interface DataValueProps { diff --git a/plugins/xcmetrics/src/components/DatePicker/DatePicker.tsx b/plugins/xcmetrics/src/components/DatePicker/DatePicker.tsx index e247f05cb6..58104e1b53 100644 --- a/plugins/xcmetrics/src/components/DatePicker/DatePicker.tsx +++ b/plugins/xcmetrics/src/components/DatePicker/DatePicker.tsx @@ -15,15 +15,13 @@ */ import React from 'react'; -import { - createStyles, - InputBase, - InputProps, - makeStyles, - Theme, - Typography, - withStyles, -} from '@material-ui/core'; +import { createStyles } from '@material-ui/core/styles'; +import { InputProps } from '@material-ui/core/Input'; +import withStyles from '@material-ui/core/styles/withStyles'; +import { Theme } from '@material-ui/core/styles/createTheme'; +import InputBase from '@material-ui/core/InputBase/InputBase'; +import makeStyles from '@material-ui/core/styles/makeStyles'; +import Typography from '@material-ui/core/Typography/Typography'; const BootstrapInput = withStyles((theme: Theme) => createStyles({ diff --git a/plugins/xcmetrics/src/components/Overview/Overview.tsx b/plugins/xcmetrics/src/components/Overview/Overview.tsx index 22fd3185a0..84e0b5e23e 100644 --- a/plugins/xcmetrics/src/components/Overview/Overview.tsx +++ b/plugins/xcmetrics/src/components/Overview/Overview.tsx @@ -25,9 +25,9 @@ import { import { useApi } from '@backstage/core-plugin-api'; import { xcmetricsApiRef } from '../../api'; import useAsync from 'react-use/lib/useAsync'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { StatusMatrix } from '../StatusMatrix'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import { OverviewTrends } from '../OverviewTrends'; import { overviewColumns } from '../BuildTableColumns'; diff --git a/plugins/xcmetrics/src/components/OverviewTrends/OverviewTrends.tsx b/plugins/xcmetrics/src/components/OverviewTrends/OverviewTrends.tsx index e6a1601e37..012b1a5df2 100644 --- a/plugins/xcmetrics/src/components/OverviewTrends/OverviewTrends.tsx +++ b/plugins/xcmetrics/src/components/OverviewTrends/OverviewTrends.tsx @@ -14,11 +14,13 @@ * limitations under the License. */ -import { Grid, makeStyles, useTheme } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; import React, { useState } from 'react'; import { Progress, Select } from '@backstage/core-components'; import { Trend } from '../Trend'; -import { Alert, AlertTitle } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; +import AlertTitle from '@material-ui/lab/AlertTitle'; import { xcmetricsApiRef } from '../../api'; import useAsync from 'react-use/lib/useAsync'; import { useApi } from '@backstage/core-plugin-api'; diff --git a/plugins/xcmetrics/src/components/PreformattedText/PreformattedText.tsx b/plugins/xcmetrics/src/components/PreformattedText/PreformattedText.tsx index 2b6a77cc9d..712d94f8aa 100644 --- a/plugins/xcmetrics/src/components/PreformattedText/PreformattedText.tsx +++ b/plugins/xcmetrics/src/components/PreformattedText/PreformattedText.tsx @@ -14,16 +14,13 @@ * limitations under the License. */ -import { - Button, - createStyles, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - IconButton, - makeStyles, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import IconButton from '@material-ui/core/IconButton'; +import { createStyles, makeStyles } from '@material-ui/core/styles'; import CloseIcon from '@material-ui/icons/Close'; import React, { useState } from 'react'; import { cn } from '../../utils'; diff --git a/plugins/xcmetrics/src/components/StatusCell/StatusCell.tsx b/plugins/xcmetrics/src/components/StatusCell/StatusCell.tsx index 98ddadc1ff..7e73d8483a 100644 --- a/plugins/xcmetrics/src/components/StatusCell/StatusCell.tsx +++ b/plugins/xcmetrics/src/components/StatusCell/StatusCell.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { makeStyles, Theme, Tooltip } from '@material-ui/core'; +import Tooltip from '@material-ui/core/Tooltip'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import React from 'react'; import { BuildStatus, BuildStatusResult, xcmetricsApiRef } from '../../api'; import { cn, formatDuration, formatStatus } from '../../utils'; diff --git a/plugins/xcmetrics/src/components/StatusMatrix/StatusMatrix.tsx b/plugins/xcmetrics/src/components/StatusMatrix/StatusMatrix.tsx index 4c5af54017..b51852607f 100644 --- a/plugins/xcmetrics/src/components/StatusMatrix/StatusMatrix.tsx +++ b/plugins/xcmetrics/src/components/StatusMatrix/StatusMatrix.tsx @@ -15,13 +15,13 @@ */ import React from 'react'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import { xcmetricsApiRef } from '../../api'; import useAsync from 'react-use/lib/useAsync'; import useMeasure from 'react-use/lib/useMeasure'; import { cn } from '../../utils'; import { useApi } from '@backstage/core-plugin-api'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { StatusCell } from '../StatusCell'; const CELL_SIZE = 12; diff --git a/plugins/xcmetrics/src/components/Trend/Trend.tsx b/plugins/xcmetrics/src/components/Trend/Trend.tsx index 575872e813..29ed737a71 100644 --- a/plugins/xcmetrics/src/components/Trend/Trend.tsx +++ b/plugins/xcmetrics/src/components/Trend/Trend.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; import { TrendLine } from '@backstage/core-components'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; interface TrendProps { data?: number[]; From 50a331b16adf1d0a92186a319aed6b4c6257b72c Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 15 Mar 2024 12:44:51 +0100 Subject: [PATCH 088/219] chore: use return await to make sure that the promise is settled before returning Signed-off-by: blam --- .changeset/metal-toes-mate.md | 5 +++++ plugins/auth-backend-module-guest-provider/src/resolvers.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/metal-toes-mate.md diff --git a/.changeset/metal-toes-mate.md b/.changeset/metal-toes-mate.md new file mode 100644 index 0000000000..8ad933eda0 --- /dev/null +++ b/.changeset/metal-toes-mate.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-guest-provider': patch +--- + +Fix issue for issuing a token when `guest` user does not exist in catalog diff --git a/plugins/auth-backend-module-guest-provider/src/resolvers.ts b/plugins/auth-backend-module-guest-provider/src/resolvers.ts index 35f724f746..cb4e59704c 100644 --- a/plugins/auth-backend-module-guest-provider/src/resolvers.ts +++ b/plugins/auth-backend-module-guest-provider/src/resolvers.ts @@ -46,7 +46,7 @@ export const signInAsGuestUser: (config: Config) => SignInResolver<{}> = 'ownershipEntityRefs', ) ?? [userRef]; try { - return ctx.signInWithCatalogUser({ entityRef: userRef }); + return await ctx.signInWithCatalogUser({ entityRef: userRef }); } catch (err) { // We can't guarantee that a guest user exists in the catalog, so we issue a token directly, return ctx.issueToken({ From 2be27b9ac67756d2508384f478e78055274d4941 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:02:34 +0000 Subject: [PATCH 089/219] Update dependency graphiql to v3.1.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-9d26a46.md | 5 +++++ plugins/api-docs/package.json | 2 +- yarn.lock | 22 +++------------------- 3 files changed, 9 insertions(+), 20 deletions(-) create mode 100644 .changeset/renovate-9d26a46.md diff --git a/.changeset/renovate-9d26a46.md b/.changeset/renovate-9d26a46.md new file mode 100644 index 0000000000..b25b04c94b --- /dev/null +++ b/.changeset/renovate-9d26a46.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Updated dependency `graphiql` to `3.1.1`. diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index c730d332b3..07ecf07411 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -64,7 +64,7 @@ "@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.0", + "graphiql": "3.1.1", "graphql": "^16.0.0", "graphql-config": "^5.0.2", "graphql-ws": "^5.4.1", diff --git a/yarn.lock b/yarn.lock index 7f610b8f48..2ba0b373a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4654,7 +4654,7 @@ __metadata: "@testing-library/user-event": ^14.0.0 "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 "@types/swagger-ui-react": ^4.18.0 - graphiql: 3.1.0 + graphiql: 3.1.1 graphql: ^16.0.0 graphql-config: ^5.0.2 graphql-ws: ^5.4.1 @@ -11731,7 +11731,7 @@ __metadata: languageName: node linkType: hard -"@graphiql/react@npm:^0.20.0, @graphiql/react@npm:^0.20.2, @graphiql/react@npm:^0.20.3": +"@graphiql/react@npm:^0.20.0, @graphiql/react@npm:^0.20.3": version: 0.20.3 resolution: "@graphiql/react@npm:0.20.3" dependencies: @@ -29591,23 +29591,7 @@ __metadata: languageName: node linkType: hard -"graphiql@npm:3.1.0": - version: 3.1.0 - resolution: "graphiql@npm:3.1.0" - dependencies: - "@graphiql/react": ^0.20.2 - "@graphiql/toolkit": ^0.9.1 - graphql-language-service: ^5.2.0 - markdown-it: ^12.2.0 - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - checksum: a8969ea299561fe627ba566fb72dd90eda31b195e9983af87c4079bf807f5b356d116ece133e46d5098d6809a88b8f3b64b04a9e95dfe34cd84eb8fd109e2b8a - languageName: node - linkType: hard - -"graphiql@npm:^3.0.6": +"graphiql@npm:3.1.1, graphiql@npm:^3.0.6": version: 3.1.1 resolution: "graphiql@npm:3.1.1" dependencies: From 942a580aa4b162d06f537a474d0a80e249dd13e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:12:35 +0000 Subject: [PATCH 090/219] Update dependency jose to v5.2.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7f610b8f48..63e46381d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32490,16 +32490,16 @@ __metadata: linkType: hard "jose@npm:^4.15.4": - version: 4.15.4 - resolution: "jose@npm:4.15.4" - checksum: dccad91cb3357f36423774a0b89ad830dd84b31090de65cd139b85488439f16a00f8c59c0773825e8a1adb0dd9d13ad725ad66e6ea33880ecb3959bb99e1ea5b + version: 4.15.5 + resolution: "jose@npm:4.15.5" + checksum: 7dde76447c7707bd4b448f914b216f3858e701aa83f00447434252461af5b9e159dcbffb88badea3f9616739526763581267c9560622f0a058df8d68c86d7f79 languageName: node linkType: hard "jose@npm:^5.0.0": - version: 5.2.2 - resolution: "jose@npm:5.2.2" - checksum: d23def3c1df8aae1ae59d1c027a073804034fe8b971dafe51f0452ca8f6eb7e5cd3e3c90b6e544776443e01e58c8f8eefbd1984dbcde378e693e0ebbd176584d + version: 5.2.3 + resolution: "jose@npm:5.2.3" + checksum: 7c41025d3e449f654a4cbf0e18e3a4a3bcb74b242d716e2e665a20be5c93b3f68421032a4531fd984d4bad6aa225c7c517da18da6e0cf778b104cd7e30bde5de languageName: node linkType: hard From 81793abc0c563bb01de8ea45b3b33cf6c97f0336 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 12 Mar 2024 13:56:35 +0100 Subject: [PATCH 091/219] refactor: create a generic auth cookie provider Signed-off-by: Camila Belo --- plugins/auth-react/.eslintrc.js | 1 + plugins/auth-react/README.md | 5 ++ plugins/auth-react/catalog-info.yaml | 10 +++ plugins/auth-react/package.json | 44 ++++++++++ .../CookieAuthRefreshProvider.tsx | 51 ++++++++++++ .../CookieAuthRefreshProvider/index.ts | 17 ++++ plugins/auth-react/src/components/index.ts | 20 +++++ plugins/auth-react/src/hooks/index.ts | 20 +++++ .../src/hooks/useCookieAuthRefresh/index.ts | 17 ++++ .../useCookieAuthRefresh.tsx | 82 +++++++++++++++++++ plugins/auth-react/src/index.ts | 27 ++++++ plugins/auth-react/src/setupTests.ts | 16 ++++ plugins/auth-react/src/types.ts | 17 ++++ yarn.lock | 20 ++++- 14 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 plugins/auth-react/.eslintrc.js create mode 100644 plugins/auth-react/README.md create mode 100644 plugins/auth-react/catalog-info.yaml create mode 100644 plugins/auth-react/package.json create mode 100644 plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx create mode 100644 plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts create mode 100644 plugins/auth-react/src/components/index.ts create mode 100644 plugins/auth-react/src/hooks/index.ts create mode 100644 plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts create mode 100644 plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx create mode 100644 plugins/auth-react/src/index.ts create mode 100644 plugins/auth-react/src/setupTests.ts create mode 100644 plugins/auth-react/src/types.ts diff --git a/plugins/auth-react/.eslintrc.js b/plugins/auth-react/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/auth-react/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/auth-react/README.md b/plugins/auth-react/README.md new file mode 100644 index 0000000000..0137f95371 --- /dev/null +++ b/plugins/auth-react/README.md @@ -0,0 +1,5 @@ +# @backstage/plugin-auth-react + +Welcome to the web library package for the auth plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/auth-react/catalog-info.yaml b/plugins/auth-react/catalog-info.yaml new file mode 100644 index 0000000000..b75aa32c56 --- /dev/null +++ b/plugins/auth-react/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-auth-react + title: '@backstage/plugin-auth-react' + description: Web library for the auth plugin +spec: + lifecycle: experimental + type: backstage-web-library + owner: maintainers diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json new file mode 100644 index 0000000000..089dafd7f6 --- /dev/null +++ b/plugins/auth-react/package.json @@ -0,0 +1,44 @@ +{ + "name": "@backstage/plugin-auth-react", + "description": "Web library for the auth plugin", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "web-library" + }, + "sideEffects": false, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@material-ui/core": "^4.9.13", + "@react-hookz/web": "^24.0.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx new file mode 100644 index 0000000000..941717f1e1 --- /dev/null +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx @@ -0,0 +1,51 @@ +/* + * 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 React, { ReactNode } from 'react'; +import { ErrorPanel } from '@backstage/core-components'; +import { ApiRef, useApp } from '@backstage/core-plugin-api'; +import { Button } from '@material-ui/core'; +import { useCookieAuthRefresh } from '../../hooks'; +import { AuthApi } from '../../types'; + +export function CookieAuthRefreshProvider({ + apiRef, + children, +}: { + apiRef: ApiRef; + children: ReactNode; +}) { + const app = useApp(); + const { Progress } = app.getComponents(); + + const { state, actions } = useCookieAuthRefresh({ apiRef }); + + if (state.status === 'error' && state.error) { + return ( + + + + ); + } + + if (state.status === 'loading') { + return ; + } + + return children; +} diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts b/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts new file mode 100644 index 0000000000..968fa5c4b4 --- /dev/null +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export { CookieAuthRefreshProvider } from './CookieAuthRefreshProvider'; diff --git a/plugins/auth-react/src/components/index.ts b/plugins/auth-react/src/components/index.ts new file mode 100644 index 0000000000..f561672096 --- /dev/null +++ b/plugins/auth-react/src/components/index.ts @@ -0,0 +1,20 @@ +/* + * 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. + */ + +// The index file in ./components/ is typically responsible for selecting +// which components are public API and should be exported from the package. + +export * from './CookieAuthRefreshProvider'; diff --git a/plugins/auth-react/src/hooks/index.ts b/plugins/auth-react/src/hooks/index.ts new file mode 100644 index 0000000000..1257334498 --- /dev/null +++ b/plugins/auth-react/src/hooks/index.ts @@ -0,0 +1,20 @@ +/* + * 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. + */ + +// The index file in ./hooks/ is typically responsible for selecting +// which hooks are public API and should be exported from the package. + +export * from './useCookieAuthRefresh'; diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts b/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts new file mode 100644 index 0000000000..42b60840f8 --- /dev/null +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export { useCookieAuthRefresh } from './useCookieAuthRefresh'; diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx new file mode 100644 index 0000000000..338c662486 --- /dev/null +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -0,0 +1,82 @@ +/* + * 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 { useEffect, useState, useCallback } from 'react'; +import { ApiRef, useApi } from '@backstage/core-plugin-api'; +import { useAsync, useMountEffect } from '@react-hookz/web'; +import { AuthApi } from '../../types'; + +type CookieAuthRefreshMessage = MessageEvent<{ + action: string; + payload: { + expiresAt: string; + }; +}>; + +export function useCookieAuthRefresh({ + apiRef, +}: { + apiRef: ApiRef; +}) { + const api = useApi(apiRef); + + const [channel] = useState( + () => new BroadcastChannel(`${apiRef.id}.auth.cookie.channel`), + ); + + const [state, actions] = useAsync(async () => await api.getCookie()); + + useMountEffect(actions.execute); + + const refresh = useCallback( + (options: { expiresAt: string }) => { + // Randomize the refreshing margin to avoid all tabs refreshing at the same time + const margin = (1 + 3 * Math.random()) * 60000; + const delay = Date.parse(options.expiresAt) - Date.now() - margin; + const timeout = setTimeout(actions.execute, delay); + return () => clearTimeout(timeout); + }, + [actions], + ); + + useEffect(() => { + if (!state.result) return () => {}; + + channel.postMessage({ + action: 'COOKIE_REFRESHED', + payload: state.result, + }); + + let cancel = refresh(state.result); + + const handleMessage = (event: CookieAuthRefreshMessage): void => { + const { action, payload } = event.data; + if (action === 'COOKIE_REFRESHED') { + cancel(); + cancel = refresh(payload); + } + }; + + channel.addEventListener('message', handleMessage); + + return () => { + cancel(); + channel.removeEventListener('message', handleMessage); + }; + }, [state, refresh, channel]); + + return { state, actions }; +} diff --git a/plugins/auth-react/src/index.ts b/plugins/auth-react/src/index.ts new file mode 100644 index 0000000000..30ac7cfe72 --- /dev/null +++ b/plugins/auth-react/src/index.ts @@ -0,0 +1,27 @@ +/* + * 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. + */ + +/** + * Web library for the auth plugin. + * + * @packageDocumentation + */ + +// In this package you might for example export components or hooks +// that are useful to other plugins or modules. + +export * from './components'; +export * from './hooks'; diff --git a/plugins/auth-react/src/setupTests.ts b/plugins/auth-react/src/setupTests.ts new file mode 100644 index 0000000000..658016ffdd --- /dev/null +++ b/plugins/auth-react/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * 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 '@testing-library/jest-dom'; diff --git a/plugins/auth-react/src/types.ts b/plugins/auth-react/src/types.ts new file mode 100644 index 0000000000..b8c74cec8e --- /dev/null +++ b/plugins/auth-react/src/types.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export type AuthApi = { getCookie(): Promise<{ expiresAt: string }> }; diff --git a/yarn.lock b/yarn.lock index 63e46381d6..c438e5f39d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5110,6 +5110,23 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-auth-react@workspace:^, @backstage/plugin-auth-react@workspace:plugins/auth-react": + version: 0.0.0-use.local + resolution: "@backstage/plugin-auth-react@workspace:plugins/auth-react" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@material-ui/core": ^4.9.13 + "@react-hookz/web": ^24.0.4 + "@testing-library/jest-dom": ^6.0.0 + "@testing-library/react": ^14.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-azure-devops-backend@workspace:^, @backstage/plugin-azure-devops-backend@workspace:plugins/azure-devops-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-azure-devops-backend@workspace:plugins/azure-devops-backend" @@ -9852,6 +9869,7 @@ __metadata: "@backstage/frontend-plugin-api": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/integration-react": "workspace:^" + "@backstage/plugin-auth-react": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-search-react": "workspace:^" @@ -15707,7 +15725,7 @@ __metadata: languageName: node linkType: hard -"@react-hookz/web@npm:^24.0.0": +"@react-hookz/web@npm:^24.0.0, @react-hookz/web@npm:^24.0.4": version: 24.0.4 resolution: "@react-hookz/web@npm:24.0.4" dependencies: From a992f863848271255f19b7105ed15ddde2c56c9a Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 12 Mar 2024 13:58:41 +0100 Subject: [PATCH 092/219] refactor: use generic auth cookie provider in techdocs Signed-off-by: Camila Belo --- plugins/techdocs/package.json | 1 + .../TechDocsAuthProvider.tsx | 103 ------------------ .../TechDocsReaderPage/TechDocsReaderPage.tsx | 12 +- 3 files changed, 8 insertions(+), 108 deletions(-) delete mode 100644 plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 533736c3bc..a51eb5f723 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -60,6 +60,7 @@ "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/integration-react": "workspace:^", + "@backstage/plugin-auth-react": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-search-react": "workspace:^", diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx deleted file mode 100644 index baeb809a6c..0000000000 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsAuthProvider.tsx +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, { ReactNode, useEffect, useState, useCallback } from 'react'; -import { ErrorPanel } from '@backstage/core-components'; -import { techdocsApiRef } from '@backstage/plugin-techdocs-react'; -import { useApi, useApp } from '@backstage/core-plugin-api'; -import useAsyncRetry from 'react-use/lib/useAsyncRetry'; -import Button from '@material-ui/core/Button'; - -type TechDocsRefreshCookieMessage = MessageEvent<{ - action: string; - payload: { - expiresAt: string; - }; -}>; - -function useTechDocsCookie() { - const techdocsApi = useApi(techdocsApiRef); - - const { retry, ...state } = useAsyncRetry(async () => { - return await techdocsApi.getCookie(); - }, [techdocsApi]); - - const refresh = useCallback( - (expiresAt: string) => { - // Randomize the refreshing margin to avoid all tabs refreshing at the same time - const refreshingMargin = (1 + 3 * Math.random()) * 60000; - const delay = Date.parse(expiresAt) - Date.now() - refreshingMargin; - const timeout = setTimeout(retry, delay); - return () => clearTimeout(timeout); - }, - [retry], - ); - - return { ...state, retry, refresh }; -} - -export function TechDocsAuthProvider({ children }: { children: ReactNode }) { - const app = useApp(); - const { Progress } = app.getComponents(); - - const [channel] = useState( - () => new BroadcastChannel('techdocs-cookie-refresh'), - ); - - const { loading, error, value, retry, refresh } = useTechDocsCookie(); - - useEffect(() => { - if (!value) return () => {}; - - channel.postMessage({ - action: 'TECHDOCS_COOKIE_REFRESHED', - payload: value, - }); - - let cancel = refresh(value.expiresAt); - - const handleMessage = (event: TechDocsRefreshCookieMessage): void => { - const { action, payload } = event.data; - if (action === 'TECHDOCS_COOKIE_REFRESHED') { - cancel(); - cancel = refresh(payload.expiresAt); - } - }; - - channel.addEventListener('message', handleMessage); - - return () => { - cancel(); - channel.removeEventListener('message', handleMessage); - }; - }, [value, refresh, channel]); - - if (error) { - return ( - - - - ); - } - - if (loading) { - return ; - } - - return children; -} diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx index d7f3843ebb..2a366b7da4 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx @@ -23,6 +23,7 @@ import { TECHDOCS_ADDONS_WRAPPER_KEY, TECHDOCS_ADDONS_KEY, TechDocsReaderPageProvider, + techdocsApiRef, } from '@backstage/plugin-techdocs-react'; import { TechDocsReaderPageRenderFunction } from '../../../types'; @@ -35,7 +36,8 @@ import { getComponentData, useRouteRefParams, } from '@backstage/core-plugin-api'; -import { TechDocsAuthProvider } from './TechDocsAuthProvider'; + +import { CookieAuthRefreshProvider } from '@backstage/plugin-auth-react'; /* An explanation for the multiple ways of customizing the TechDocs reader page @@ -178,17 +180,17 @@ export const TechDocsReaderPage = (props: TechDocsReaderPageProps) => { // As explained above, "page" is configuration 4 and is 1 return ( - + {(page as JSX.Element) || } - + ); } // As explained above, a render function is configuration 3 and React element is 2 return ( - + {({ metadata, entityMetadata, onReady }) => (

@@ -205,6 +207,6 @@ export const TechDocsReaderPage = (props: TechDocsReaderPageProps) => {
)} - + ); }; From e0690351589fc2584f3761ef2e8915c668a74821 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 13 Mar 2024 10:57:41 +0100 Subject: [PATCH 093/219] test: cover use cookie auth hook Signed-off-by: Camila Belo --- .../useCookieAuthRefresh.test.tsx | 239 ++++++++++++++++++ .../useCookieAuthRefresh.tsx | 2 +- plugins/auth-react/src/setupTests.ts | 25 ++ 3 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx new file mode 100644 index 0000000000..7a3efd5fd0 --- /dev/null +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx @@ -0,0 +1,239 @@ +/* + * 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 React from 'react'; +import { renderHook, waitFor } from '@testing-library/react'; +import { createApiRef } from '@backstage/core-plugin-api'; +import { TestApiProvider } from '@backstage/test-utils'; +import { useCookieAuthRefresh } from './useCookieAuthRefresh'; +import { AuthApi } from '../../types'; + +describe('useCookieAuthRefresh', () => { + const now = 1710316886171; + const tenMinutesInMilliseconds = 10 * 60 * 1000; + const tenMinutesFromNowInMilliseconds = now + tenMinutesInMilliseconds; + const expiresAt = new Date(tenMinutesFromNowInMilliseconds).toISOString(); + + type Listener = (event: { data: any }) => void; + + let listeners: Listener[]; + let channelMock: any; + + beforeEach(() => { + jest.useFakeTimers({ now }); + listeners = []; + channelMock = { + postMessage: jest.fn((message: any) => { + listeners.forEach(listener => listener({ data: message })); + }), + addEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners.push(listener); + } + }), + removeEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners = listeners.filter(l => l !== listener); + } + }), + }; + global.BroadcastChannel = jest.fn().mockImplementation(() => channelMock); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should return a loading status when the refresh is in progress', () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn(), + }; + + const { result } = renderHook(() => useCookieAuthRefresh({ apiRef }), { + wrapper: ({ children }) => ( + {children} + ), + }); + + expect(result.current.state.status).toBe('loading'); + }); + + it('should return an error status when the refresh has failed', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const error = new Error('Failed to get cookie'); + const apiMock = { + getCookie: jest.fn().mockRejectedValue(error), + }; + + const { result } = renderHook(() => useCookieAuthRefresh({ apiRef }), { + wrapper: ({ children }) => ( + {children} + ), + }); + + await waitFor(() => expect(result.current.state.status).toBe('error')); + + expect(result.current.state.error).toStrictEqual(error); + }); + + it('should call the api to get the cookie and use it', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockResolvedValue({ expiresAt }), + }; + + const { result } = renderHook(() => useCookieAuthRefresh({ apiRef }), { + wrapper: ({ children }) => ( + {children} + ), + }); + + expect(apiMock.getCookie).toHaveBeenCalled(); + + await waitFor(() => + expect(result.current.state.result).toMatchObject({ expiresAt }), + ); + }); + + it('should send a message to other tabs when the cookie is refreshed', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockResolvedValue({ expiresAt }), + }; + + renderHook(() => useCookieAuthRefresh({ apiRef }), { + wrapper: ({ children }) => ( + {children} + ), + }); + + expect(global.BroadcastChannel).toHaveBeenCalledWith( + 'auth-test-auth-cookie-channel', + ); + + await waitFor(() => + expect(channelMock.postMessage).toHaveBeenCalledTimes(1), + ); + + // posting the message to other tabs when the cookie is requested in the first time + await waitFor(() => + expect(channelMock.postMessage).toHaveBeenCalledWith({ + action: 'COOKIE_REFRESHED', + payload: { expiresAt }, + }), + ); + }); + + it('should cancel the refresh when a message is received from another tab', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockResolvedValue({ expiresAt }), + }; + + renderHook(() => useCookieAuthRefresh({ apiRef }), { + wrapper: ({ children }) => ( + {children} + ), + }); + + await waitFor(() => + expect(channelMock.addEventListener).toHaveBeenCalledTimes(1), + ); + + const twentyMinutesFromNowInMilliseconds = + now + 2 * tenMinutesInMilliseconds; + + // simulating other tab refreshing the cookie + channelMock.postMessage({ + action: 'COOKIE_REFRESHED', + payload: { + expiresAt: new Date(twentyMinutesFromNowInMilliseconds).toISOString(), + }, + }); + + // advance the timers in 10 minutes to match the old expires at + jest.advanceTimersByTime(tenMinutesInMilliseconds); + + // should not call the api + expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + + // advance the timers in more 10 minutes to match the new expires at + jest.advanceTimersByTime(tenMinutesInMilliseconds); + + // should call the api + await waitFor(() => expect(apiMock.getCookie).toHaveBeenCalledTimes(2)); + }); + + it('should cancel the refresh when the component is unmounted', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockResolvedValue({ expiresAt }), + }; + + const { result, unmount } = renderHook( + () => useCookieAuthRefresh({ apiRef }), + { + wrapper: ({ children }) => ( + + {children} + + ), + }, + ); + + expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + + await waitFor(() => + expect(result.current.state.result).toMatchObject({ expiresAt }), + ); + + unmount(); + + expect(channelMock.removeEventListener).toHaveBeenCalledTimes(1); + expect(channelMock.removeEventListener).toHaveBeenCalledWith( + 'message', + expect.any(Function), + ); + + // advance the timers to ensure that the refresh is not called + jest.advanceTimersByTime(tenMinutesInMilliseconds); + + // should not call the api after unmount + await waitFor(() => expect(apiMock.getCookie).not.toHaveBeenCalledTimes(2)); + }); + + it('should refresh the cookie when it is about to expire', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockResolvedValue({ expiresAt }), + }; + + renderHook(() => useCookieAuthRefresh({ apiRef }), { + wrapper: ({ children }) => ( + {children} + ), + }); + + expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + + // advance the timers to the expiration date + jest.advanceTimersByTime(tenMinutesInMilliseconds); + + // should call the api + await waitFor(() => expect(apiMock.getCookie).toHaveBeenCalledTimes(2)); + }); +}); diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index 338c662486..7888fa7e81 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -34,7 +34,7 @@ export function useCookieAuthRefresh({ const api = useApi(apiRef); const [channel] = useState( - () => new BroadcastChannel(`${apiRef.id}.auth.cookie.channel`), + () => new BroadcastChannel(`${apiRef.id}-auth-cookie-channel`), ); const [state, actions] = useAsync(async () => await api.getCookie()); diff --git a/plugins/auth-react/src/setupTests.ts b/plugins/auth-react/src/setupTests.ts index 658016ffdd..0ab6a810cf 100644 --- a/plugins/auth-react/src/setupTests.ts +++ b/plugins/auth-react/src/setupTests.ts @@ -14,3 +14,28 @@ * limitations under the License. */ import '@testing-library/jest-dom'; + +type Listener = (event: { data: any }) => void; + +global.BroadcastChannel = jest + .fn() + .mockImplementation((_channelName: string) => { + let listeners: Listener[] = []; + return { + postMessage: jest.fn((message: any) => { + // Simulate message event for all listeners + listeners.forEach(listener => listener({ data: message })); + }), + addEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners.push(listener); + } + }), + removeEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners = listeners.filter(l => l !== listener); + } + }), + close: jest.fn(), + }; + }); From 756ddb637f6c05a2678b435561dc413adcedeb36 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 13 Mar 2024 12:20:47 +0100 Subject: [PATCH 094/219] test: cover use cookie auth provider Signed-off-by: Camila Belo --- plugins/auth-react/package.json | 37 +++--- .../CookieAuthRefreshProvider.test.tsx | 124 ++++++++++++++++++ yarn.lock | 1 + 3 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 089dafd7f6..fbe44d91d4 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,27 +1,30 @@ { "name": "@backstage/plugin-auth-react", - "description": "Web library for the auth plugin", "version": "0.0.0", - "main": "src/index.ts", - "types": "src/index.ts", - "license": "Apache-2.0", + "description": "Web library for the auth plugin", + "backstage": { + "role": "web-library" + }, "publishConfig": { "access": "public", "main": "dist/index.esm.js", "types": "dist/index.d.ts" }, - "backstage": { - "role": "web-library" - }, + "license": "Apache-2.0", "sideEffects": false, + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist" + ], "scripts": { - "start": "backstage-cli package start", "build": "backstage-cli package build", - "lint": "backstage-cli package lint", - "test": "backstage-cli package test", "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack" + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "test": "backstage-cli package test" }, "dependencies": { "@backstage/core-components": "workspace:^", @@ -29,16 +32,14 @@ "@material-ui/core": "^4.9.13", "@react-hookz/web": "^24.0.4" }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^14.0.0" + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0" }, - "files": [ - "dist" - ] + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } } diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx new file mode 100644 index 0000000000..6684fa7856 --- /dev/null +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx @@ -0,0 +1,124 @@ +/* + * 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 React from 'react'; +import { screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { CookieAuthRefreshProvider } from './CookieAuthRefreshProvider'; +import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; +import { createApiRef } from '@backstage/core-plugin-api'; +import { AuthApi } from '../../types'; + +describe('CookieAuthRefreshProvider', () => { + function getExpiresAtInFuture() { + const tenMinutesInMilliseconds = 10 * 60 * 1000; + return new Date(Date.now() + tenMinutesInMilliseconds).toISOString(); + } + + global.BroadcastChannel = jest.fn().mockImplementation(() => ({ + postMessage: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + })); + + it('should render a progress bar', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockReturnValue(new Promise(() => {})), + }; + + await renderInTestApp( + + +
Test Content
+
+
, + ); + + expect(screen.getByTestId('progress')).toBeInTheDocument(); + }); + + it('should render a error panel', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const error = new Error('Failed to get cookie'); + const apiMock = { + getCookie: jest.fn().mockRejectedValue(error), + }; + + await renderInTestApp( + + +
Test Content
+
+
, + ); + + expect(screen.getByText(error.message)).toBeInTheDocument(); + }); + + it('should call the api again when retry is clicked', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const error = new Error('Failed to get cookie'); + const apiMock = { + getCookie: jest.fn().mockRejectedValueOnce(error).mockResolvedValue({ + expiresAt: getExpiresAtInFuture(), + }), + }; + + await renderInTestApp( + + +
Test Content
+
+
, + ); + + expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + + expect(screen.getByText(error.message)).toBeInTheDocument(); + + await userEvent.click(screen.getByText('Retry')); + + expect(apiMock.getCookie).toHaveBeenCalledTimes(2); + + await waitFor(() => + expect(screen.getByText('Test Content')).toBeInTheDocument(), + ); + }); + + it('should render the children', async () => { + const apiRef = createApiRef({ id: 'auth-test' }); + const apiMock = { + getCookie: jest.fn().mockResolvedValue({ + expiresAt: { + expiresAt: getExpiresAtInFuture(), + }, + }), + }; + + await renderInTestApp( + + +
Test Content
+
+
, + ); + + await waitFor(() => + expect(screen.getByText('Test Content')).toBeInTheDocument(), + ); + }); +}); diff --git a/yarn.lock b/yarn.lock index c438e5f39d..3a8010a02c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5122,6 +5122,7 @@ __metadata: "@react-hookz/web": ^24.0.4 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^14.0.0 + "@testing-library/user-event": ^14.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 || ^18.0.0 languageName: unknown From a7db1e651dbb5910ac618362a5c339a372b700c4 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 13 Mar 2024 12:36:23 +0100 Subject: [PATCH 095/219] docs: update api reports Signed-off-by: Camila Belo --- plugins/auth-react/api-report.md | 54 +++++++++++++++++++ .../CookieAuthRefreshProvider.tsx | 5 ++ .../useCookieAuthRefresh.tsx | 6 +++ plugins/auth-react/src/index.ts | 1 + plugins/auth-react/src/types.ts | 4 ++ 5 files changed, 70 insertions(+) create mode 100644 plugins/auth-react/api-report.md diff --git a/plugins/auth-react/api-report.md b/plugins/auth-react/api-report.md new file mode 100644 index 0000000000..f329673996 --- /dev/null +++ b/plugins/auth-react/api-report.md @@ -0,0 +1,54 @@ +## API Report File for "@backstage/plugin-auth-react" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ApiRef } from '@backstage/core-plugin-api'; +import { AsyncState } from '@react-hookz/web'; +import { default as React_2 } from 'react'; +import { ReactNode } from 'react'; +import { UseAsyncActions } from '@react-hookz/web'; + +// @public +export type AuthApi = { + getCookie(): Promise<{ + expiresAt: string; + }>; +}; + +// @public +export function CookieAuthRefreshProvider({ + apiRef, + children, +}: { + apiRef: ApiRef; + children: ReactNode; +}): + | string + | number + | boolean + | Iterable + | React_2.JSX.Element + | null + | undefined; + +// @public +export function useCookieAuthRefresh({ + apiRef, +}: { + apiRef: ApiRef; +}): { + state: AsyncState< + | { + expiresAt: string; + } + | undefined + >; + actions: UseAsyncActions< + { + expiresAt: string; + }, + [] + >; +}; +``` diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx index 941717f1e1..86fa5a3a6f 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx @@ -21,6 +21,11 @@ import { Button } from '@material-ui/core'; import { useCookieAuthRefresh } from '../../hooks'; import { AuthApi } from '../../types'; +/** + * @public + * A provider that will refresh the cookie when it is about to expire. + * It receives an `apiRef` and `children` as props, and expects that apiRef extends the `AuthApi` interface. + */ export function CookieAuthRefreshProvider({ apiRef, children, diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index 7888fa7e81..5c3272d056 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -26,6 +26,12 @@ type CookieAuthRefreshMessage = MessageEvent<{ }; }>; +/** + * @public + * It receives an `apiRef` as options, and expects that apiRef extends the `AuthApi` interface. + * @remarks + * This hook expects a `BroadcastChannel` to be available in the global scope. + */ export function useCookieAuthRefresh({ apiRef, }: { diff --git a/plugins/auth-react/src/index.ts b/plugins/auth-react/src/index.ts index 30ac7cfe72..2569454bf3 100644 --- a/plugins/auth-react/src/index.ts +++ b/plugins/auth-react/src/index.ts @@ -25,3 +25,4 @@ export * from './components'; export * from './hooks'; +export * from './types'; diff --git a/plugins/auth-react/src/types.ts b/plugins/auth-react/src/types.ts index b8c74cec8e..dd5eadfdee 100644 --- a/plugins/auth-react/src/types.ts +++ b/plugins/auth-react/src/types.ts @@ -14,4 +14,8 @@ * limitations under the License. */ +/** + * @public + * Defines a minimal inteface for auth apis. + */ export type AuthApi = { getCookie(): Promise<{ expiresAt: string }> }; From 62bcaf8e4a599a58410ad0d1f496646a2020c6a8 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 13 Mar 2024 12:39:08 +0100 Subject: [PATCH 096/219] docs: add changeset files Signed-off-by: Camila Belo --- .changeset/fair-socks-peel.md | 5 +++++ .changeset/serious-steaks-promise.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/fair-socks-peel.md create mode 100644 .changeset/serious-steaks-promise.md diff --git a/.changeset/fair-socks-peel.md b/.changeset/fair-socks-peel.md new file mode 100644 index 0000000000..88aeb6517c --- /dev/null +++ b/.changeset/fair-socks-peel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-react': patch +--- + +Create a generic React component for refreshing user cookie. diff --git a/.changeset/serious-steaks-promise.md b/.changeset/serious-steaks-promise.md new file mode 100644 index 0000000000..cd37f4ef3e --- /dev/null +++ b/.changeset/serious-steaks-promise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Use the new generic refresh user cookie provider. From 40817356a86adfa428f3ed40cfb72bf2a66b9fbe Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 13 Mar 2024 13:20:30 +0100 Subject: [PATCH 097/219] fix: missing repo in package.json Signed-off-by: Camila Belo --- plugins/auth-react/package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index fbe44d91d4..2bfb842800 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -10,6 +10,11 @@ "main": "dist/index.esm.js", "types": "dist/index.d.ts" }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/auth-react" + }, "license": "Apache-2.0", "sideEffects": false, "main": "src/index.ts", From b806745876268a5cb0f27c33c98b9901c2d76241 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 13 Mar 2024 14:14:34 +0100 Subject: [PATCH 098/219] refactor: apply review suggestions Signed-off-by: Camila Belo --- .changeset/serious-steaks-promise.md | 1 + plugins/auth-react/api-report.md | 45 ++-- plugins/auth-react/package.json | 4 +- .../CookieAuthRefreshProvider.test.tsx | 93 ++++++--- .../CookieAuthRefreshProvider.tsx | 26 ++- .../CookieAuthRefreshProvider/index.ts | 5 +- .../src/hooks/useCookieAuthRefresh/index.ts | 5 +- .../useCookieAuthRefresh.test.tsx | 192 +++++++++++------- .../useCookieAuthRefresh.tsx | 47 ++++- plugins/auth-react/src/index.ts | 1 - plugins/auth-react/src/types.ts | 21 -- .../src/test-utils.tsx | 24 ++- .../TechDocsReaderPage.test.tsx | 26 ++- .../TechDocsReaderPage/TechDocsReaderPage.tsx | 5 +- yarn.lock | 2 + 15 files changed, 315 insertions(+), 182 deletions(-) delete mode 100644 plugins/auth-react/src/types.ts diff --git a/.changeset/serious-steaks-promise.md b/.changeset/serious-steaks-promise.md index cd37f4ef3e..55fee86f60 100644 --- a/.changeset/serious-steaks-promise.md +++ b/.changeset/serious-steaks-promise.md @@ -1,5 +1,6 @@ --- '@backstage/plugin-techdocs': patch +'@backstage/plugin-techdocs-addons-test-utils': patch --- Use the new generic refresh user cookie provider. diff --git a/plugins/auth-react/api-report.md b/plugins/auth-react/api-report.md index f329673996..0e8a7dc8b7 100644 --- a/plugins/auth-react/api-report.md +++ b/plugins/auth-react/api-report.md @@ -3,27 +3,22 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; import { AsyncState } from '@react-hookz/web'; import { default as React_2 } from 'react'; import { ReactNode } from 'react'; import { UseAsyncActions } from '@react-hookz/web'; // @public -export type AuthApi = { - getCookie(): Promise<{ - expiresAt: string; - }>; +export type CookieAuthRefreshOptions = { + pluginId: string; + path?: string; }; // @public -export function CookieAuthRefreshProvider({ - apiRef, +export function CookieAuthRefreshProvider({ children, -}: { - apiRef: ApiRef; - children: ReactNode; -}): + ...rest +}: CookieAuthRefreshProviderProps): | string | number | boolean @@ -33,22 +28,16 @@ export function CookieAuthRefreshProvider({ | undefined; // @public -export function useCookieAuthRefresh({ - apiRef, -}: { - apiRef: ApiRef; -}): { - state: AsyncState< - | { - expiresAt: string; - } - | undefined - >; - actions: UseAsyncActions< - { - expiresAt: string; - }, - [] - >; +export type CookieAuthRefreshProviderProps = CookieAuthRefreshOptions & { + children: ReactNode; +}; + +// @public +export function useCookieAuthRefresh({ + pluginId, + path, +}: CookieAuthRefreshOptions): { + state: AsyncState; + actions: UseAsyncActions; }; ``` diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 2bfb842800..7bc248be67 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -34,8 +34,10 @@ "dependencies": { "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", "@material-ui/core": "^4.9.13", - "@react-hookz/web": "^24.0.4" + "@react-hookz/web": "^24.0.4", + "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx index 6684fa7856..e8e5eea24d 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx @@ -19,10 +19,15 @@ import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { CookieAuthRefreshProvider } from './CookieAuthRefreshProvider'; import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; -import { createApiRef } from '@backstage/core-plugin-api'; -import { AuthApi } from '../../types'; +import { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api'; describe('CookieAuthRefreshProvider', () => { + const discoveryApiMock = { + getBaseUrl: jest + .fn() + .mockResolvedValue('http://localhost:7000/techdocs/api'), + }; + function getExpiresAtInFuture() { const tenMinutesInMilliseconds = 10 * 60 * 1000; return new Date(Date.now() + tenMinutesInMilliseconds).toISOString(); @@ -35,14 +40,18 @@ describe('CookieAuthRefreshProvider', () => { })); it('should render a progress bar', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockReturnValue(new Promise(() => {})), + const fetchApiMock = { + fetch: jest.fn().mockReturnValue(new Promise(() => {})), }; await renderInTestApp( - - + +
Test Content
, @@ -51,16 +60,20 @@ describe('CookieAuthRefreshProvider', () => { expect(screen.getByTestId('progress')).toBeInTheDocument(); }); - it('should render a error panel', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); + it('should render an error panel', async () => { const error = new Error('Failed to get cookie'); - const apiMock = { - getCookie: jest.fn().mockRejectedValue(error), + const fetchApiMock = { + fetch: jest.fn().mockRejectedValue(error), }; await renderInTestApp( - - + +
Test Content
, @@ -70,29 +83,46 @@ describe('CookieAuthRefreshProvider', () => { }); it('should call the api again when retry is clicked', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); const error = new Error('Failed to get cookie'); - const apiMock = { - getCookie: jest.fn().mockRejectedValueOnce(error).mockResolvedValue({ - expiresAt: getExpiresAtInFuture(), - }), + const fetchApiMock = { + fetch: jest + .fn() + .mockRejectedValueOnce(error) + .mockResolvedValue({ + ok: true, + json: jest.fn().mockResolvedValue({ + expiresAt: getExpiresAtInFuture(), + }), + }), }; await renderInTestApp( - - + +
Test Content
, ); - expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + await waitFor(() => + expect(fetchApiMock.fetch).toHaveBeenCalledWith( + 'http://localhost:7000/techdocs/api/cookie', + { credentials: 'include' }, + ), + ); + + expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1); expect(screen.getByText(error.message)).toBeInTheDocument(); await userEvent.click(screen.getByText('Retry')); - expect(apiMock.getCookie).toHaveBeenCalledTimes(2); + expect(fetchApiMock.fetch).toHaveBeenCalledTimes(2); await waitFor(() => expect(screen.getByText('Test Content')).toBeInTheDocument(), @@ -100,18 +130,23 @@ describe('CookieAuthRefreshProvider', () => { }); it('should render the children', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockResolvedValue({ - expiresAt: { + const fetchApiMock = { + fetch: jest.fn().mockResolvedValue({ + ok: true, + json: jest.fn().mockResolvedValue({ expiresAt: getExpiresAtInFuture(), - }, + }), }), }; await renderInTestApp( - - + +
Test Content
, diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx index 86fa5a3a6f..4265b25cf0 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx @@ -16,27 +16,31 @@ import React, { ReactNode } from 'react'; import { ErrorPanel } from '@backstage/core-components'; -import { ApiRef, useApp } from '@backstage/core-plugin-api'; +import { useApp } from '@backstage/core-plugin-api'; import { Button } from '@material-ui/core'; -import { useCookieAuthRefresh } from '../../hooks'; -import { AuthApi } from '../../types'; +import { useCookieAuthRefresh, CookieAuthRefreshOptions } from '../../hooks'; + +/** + * @public + * Props for the {@link CookieAuthRefreshProvider} component. + */ +export type CookieAuthRefreshProviderProps = CookieAuthRefreshOptions & { + // The children to render when the refresh is successful + children: ReactNode; +}; /** * @public * A provider that will refresh the cookie when it is about to expire. - * It receives an `apiRef` and `children` as props, and expects that apiRef extends the `AuthApi` interface. */ -export function CookieAuthRefreshProvider({ - apiRef, +export function CookieAuthRefreshProvider({ children, -}: { - apiRef: ApiRef; - children: ReactNode; -}) { + ...rest +}: CookieAuthRefreshProviderProps) { const app = useApp(); const { Progress } = app.getComponents(); - const { state, actions } = useCookieAuthRefresh({ apiRef }); + const { state, actions } = useCookieAuthRefresh(rest); if (state.status === 'error' && state.error) { return ( diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts b/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts index 968fa5c4b4..2bb172d850 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/index.ts @@ -14,4 +14,7 @@ * limitations under the License. */ -export { CookieAuthRefreshProvider } from './CookieAuthRefreshProvider'; +export { + CookieAuthRefreshProvider, + type CookieAuthRefreshProviderProps, +} from './CookieAuthRefreshProvider'; diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts b/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts index 42b60840f8..43b1882959 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts @@ -14,4 +14,7 @@ * limitations under the License. */ -export { useCookieAuthRefresh } from './useCookieAuthRefresh'; +export { + useCookieAuthRefresh, + type CookieAuthRefreshOptions, +} from './useCookieAuthRefresh'; diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx index 7a3efd5fd0..42fe6f4fca 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx @@ -16,17 +16,29 @@ import React from 'react'; import { renderHook, waitFor } from '@testing-library/react'; -import { createApiRef } from '@backstage/core-plugin-api'; +import { fetchApiRef, discoveryApiRef } from '@backstage/core-plugin-api'; import { TestApiProvider } from '@backstage/test-utils'; import { useCookieAuthRefresh } from './useCookieAuthRefresh'; -import { AuthApi } from '../../types'; describe('useCookieAuthRefresh', () => { + const discoveryApiMock = { + getBaseUrl: jest + .fn() + .mockResolvedValue('http://localhost:7000/techdocs/api'), + }; + const now = 1710316886171; const tenMinutesInMilliseconds = 10 * 60 * 1000; const tenMinutesFromNowInMilliseconds = now + tenMinutesInMilliseconds; const expiresAt = new Date(tenMinutesFromNowInMilliseconds).toISOString(); + const fetchApiMock = { + fetch: jest.fn().mockResolvedValue({ + ok: true, + json: jest.fn().mockResolvedValue({ expiresAt }), + }), + }; + type Listener = (event: { data: any }) => void; let listeners: Listener[]; @@ -34,6 +46,7 @@ describe('useCookieAuthRefresh', () => { beforeEach(() => { jest.useFakeTimers({ now }); + jest.clearAllMocks(); listeners = []; channelMock = { postMessage: jest.fn((message: any) => { @@ -58,32 +71,53 @@ describe('useCookieAuthRefresh', () => { }); it('should return a loading status when the refresh is in progress', () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn(), - }; - - const { result } = renderHook(() => useCookieAuthRefresh({ apiRef }), { - wrapper: ({ children }) => ( - {children} - ), - }); + const { result } = renderHook( + () => useCookieAuthRefresh({ pluginId: 'techdocs' }), + { + wrapper: ({ children }) => ( + + {children} + + ), + }, + ); expect(result.current.state.status).toBe('loading'); }); it('should return an error status when the refresh has failed', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); const error = new Error('Failed to get cookie'); - const apiMock = { - getCookie: jest.fn().mockRejectedValue(error), - }; - const { result } = renderHook(() => useCookieAuthRefresh({ apiRef }), { - wrapper: ({ children }) => ( - {children} - ), - }); + const { result } = renderHook( + () => useCookieAuthRefresh({ pluginId: 'techdocs' }), + { + wrapper: ({ children }) => ( + + {children} + + ), + }, + ); await waitFor(() => expect(result.current.state.status).toBe('error')); @@ -91,38 +125,48 @@ describe('useCookieAuthRefresh', () => { }); it('should call the api to get the cookie and use it', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockResolvedValue({ expiresAt }), - }; - - const { result } = renderHook(() => useCookieAuthRefresh({ apiRef }), { - wrapper: ({ children }) => ( - {children} - ), - }); - - expect(apiMock.getCookie).toHaveBeenCalled(); + const { result } = renderHook( + () => useCookieAuthRefresh({ pluginId: 'techdocs' }), + { + wrapper: ({ children }) => ( + + {children} + + ), + }, + ); await waitFor(() => - expect(result.current.state.result).toMatchObject({ expiresAt }), + expect(fetchApiMock.fetch).toHaveBeenCalledWith( + 'http://localhost:7000/techdocs/api/cookie', + { credentials: 'include' }, + ), ); + + expect(result.current.state.result).toMatchObject({ expiresAt }); }); it('should send a message to other tabs when the cookie is refreshed', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockResolvedValue({ expiresAt }), - }; - - renderHook(() => useCookieAuthRefresh({ apiRef }), { + renderHook(() => useCookieAuthRefresh({ pluginId: 'techdocs' }), { wrapper: ({ children }) => ( - {children} + + {children} + ), }); expect(global.BroadcastChannel).toHaveBeenCalledWith( - 'auth-test-auth-cookie-channel', + 'techdocs-auth-cookie-channel', ); await waitFor(() => @@ -139,14 +183,16 @@ describe('useCookieAuthRefresh', () => { }); it('should cancel the refresh when a message is received from another tab', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockResolvedValue({ expiresAt }), - }; - - renderHook(() => useCookieAuthRefresh({ apiRef }), { + renderHook(() => useCookieAuthRefresh({ pluginId: 'techdocs' }), { wrapper: ({ children }) => ( - {children} + + {children} + ), }); @@ -169,37 +215,35 @@ describe('useCookieAuthRefresh', () => { jest.advanceTimersByTime(tenMinutesInMilliseconds); // should not call the api - expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1); // advance the timers in more 10 minutes to match the new expires at jest.advanceTimersByTime(tenMinutesInMilliseconds); // should call the api - await waitFor(() => expect(apiMock.getCookie).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(2)); }); it('should cancel the refresh when the component is unmounted', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockResolvedValue({ expiresAt }), - }; - const { result, unmount } = renderHook( - () => useCookieAuthRefresh({ apiRef }), + () => useCookieAuthRefresh({ pluginId: 'techdocs' }), { wrapper: ({ children }) => ( - + {children} ), }, ); - expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); - await waitFor(() => - expect(result.current.state.result).toMatchObject({ expiresAt }), - ); + expect(result.current.state.result).toMatchObject({ expiresAt }); unmount(); @@ -213,27 +257,31 @@ describe('useCookieAuthRefresh', () => { jest.advanceTimersByTime(tenMinutesInMilliseconds); // should not call the api after unmount - await waitFor(() => expect(apiMock.getCookie).not.toHaveBeenCalledTimes(2)); + await waitFor(() => + expect(fetchApiMock.fetch).not.toHaveBeenCalledTimes(2), + ); }); it('should refresh the cookie when it is about to expire', async () => { - const apiRef = createApiRef({ id: 'auth-test' }); - const apiMock = { - getCookie: jest.fn().mockResolvedValue({ expiresAt }), - }; - - renderHook(() => useCookieAuthRefresh({ apiRef }), { + renderHook(() => useCookieAuthRefresh({ pluginId: 'techdocs' }), { wrapper: ({ children }) => ( - {children} + + {children} + ), }); - expect(apiMock.getCookie).toHaveBeenCalledTimes(1); + await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); // advance the timers to the expiration date jest.advanceTimersByTime(tenMinutesInMilliseconds); // should call the api - await waitFor(() => expect(apiMock.getCookie).toHaveBeenCalledTimes(2)); + await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(2)); }); }); diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index 5c3272d056..2d495d54c4 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -15,9 +15,13 @@ */ import { useEffect, useState, useCallback } from 'react'; -import { ApiRef, useApi } from '@backstage/core-plugin-api'; +import { + discoveryApiRef, + fetchApiRef, + useApi, +} from '@backstage/core-plugin-api'; import { useAsync, useMountEffect } from '@react-hookz/web'; -import { AuthApi } from '../../types'; +import { ResponseError } from '@backstage/errors'; type CookieAuthRefreshMessage = MessageEvent<{ action: string; @@ -28,22 +32,43 @@ type CookieAuthRefreshMessage = MessageEvent<{ /** * @public - * It receives an `apiRef` as options, and expects that apiRef extends the `AuthApi` interface. + * The options for the {@link useCookieAuthRefresh} hook. + */ +export type CookieAuthRefreshOptions = { + // The plugin ID to used for discovering the API origin + pluginId: string; + // The path to used for calling the refresh cookie endpoint, default to '/cookie' + path?: string; +}; + +/** + * @public + * A hook that will refresh the cookie when it is about to expire. * @remarks * This hook expects a `BroadcastChannel` to be available in the global scope. */ -export function useCookieAuthRefresh({ - apiRef, -}: { - apiRef: ApiRef; -}) { - const api = useApi(apiRef); +export function useCookieAuthRefresh({ + pluginId, + path = '/cookie', +}: CookieAuthRefreshOptions) { + const fetchApi = useApi(fetchApiRef); + const discoveryApi = useApi(discoveryApiRef); const [channel] = useState( - () => new BroadcastChannel(`${apiRef.id}-auth-cookie-channel`), + () => new BroadcastChannel(`${pluginId}-auth-cookie-channel`), ); - const [state, actions] = useAsync(async () => await api.getCookie()); + const [state, actions] = useAsync(async () => { + const apiOrigin = await discoveryApi.getBaseUrl(pluginId); + const requestUrl = `${apiOrigin}${path}`; + const response = await fetchApi.fetch(`${requestUrl}`, { + credentials: 'include', + }); + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + return await response.json(); + }); useMountEffect(actions.execute); diff --git a/plugins/auth-react/src/index.ts b/plugins/auth-react/src/index.ts index 2569454bf3..30ac7cfe72 100644 --- a/plugins/auth-react/src/index.ts +++ b/plugins/auth-react/src/index.ts @@ -25,4 +25,3 @@ export * from './components'; export * from './hooks'; -export * from './types'; diff --git a/plugins/auth-react/src/types.ts b/plugins/auth-react/src/types.ts deleted file mode 100644 index dd5eadfdee..0000000000 --- a/plugins/auth-react/src/types.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @public - * Defines a minimal inteface for auth apis. - */ -export type AuthApi = { getCookie(): Promise<{ expiresAt: string }> }; diff --git a/plugins/techdocs-addons-test-utils/src/test-utils.tsx b/plugins/techdocs-addons-test-utils/src/test-utils.tsx index f26dfea6fd..51a4650f99 100644 --- a/plugins/techdocs-addons-test-utils/src/test-utils.tsx +++ b/plugins/techdocs-addons-test-utils/src/test-utils.tsx @@ -24,7 +24,11 @@ import { act, render } from '@testing-library/react'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { FlatRoutes } from '@backstage/core-app-api'; -import { ApiRef } from '@backstage/core-plugin-api'; +import { + ApiRef, + discoveryApiRef, + fetchApiRef, +} from '@backstage/core-plugin-api'; import { TechDocsAddons, @@ -69,6 +73,22 @@ const scmIntegrationsApi = { fromConfig: jest.fn().mockReturnValue({}), }; +const discoveryApi = { + getBaseUrl: jest + .fn() + .mockResolvedValue('https://backstage.example.com/api/techdocs'), +}; + +const fetchApi = { + fetch: jest.fn().mockResolvedValue({ + ok: true, + json: jest.fn().mockResolvedValue({ + // Expires in 10 minutes + expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(), + }), + }), +}; + /** @ignore */ type TechDocsAddonTesterTestApiPair = TApi extends infer TImpl ? readonly [ApiRef, Partial] @@ -204,6 +224,8 @@ export class TechDocsAddonTester { */ build() { const apis: TechdocsAddonTesterApis = [ + [fetchApiRef, fetchApi], + [discoveryApiRef, discoveryApi], [techdocsApiRef, techdocsApi], [techdocsStorageApiRef, techdocsStorageApi], [searchApiRef, searchApi], diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx index 605decae12..8295ea0688 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx @@ -34,7 +34,11 @@ import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; import { FlatRoutes } from '@backstage/core-app-api'; import { Page } from '@backstage/core-components'; -import { configApiRef } from '@backstage/core-plugin-api'; +import { + configApiRef, + discoveryApiRef, + fetchApiRef, +} from '@backstage/core-plugin-api'; const mockEntityMetadata = { locationMetadata: { @@ -76,6 +80,22 @@ const techdocsStorageApiMock: jest.Mocked = { syncEntityDocs: jest.fn(), }; +const discoveryApiMock = { + getBaseUrl: jest + .fn() + .mockResolvedValue('https://localhost:7000/api/techdocs'), +}; + +const fetchApiMock = { + fetch: jest.fn().mockResolvedValue({ + ok: true, + json: jest.fn().mockResolvedValue({ + // Expires in 10 minutes + expiresAt: new Date(Date.now() + 10 * 60 * 1000).toISOString(), + }), + }), +}; + const PageMock = () => { const { namespace, kind, name } = useParams(); return <>{`PageMock: ${namespace}#${kind}#${name}`}; @@ -96,6 +116,8 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => { return ( ', () => { }); afterEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); beforeEach(() => { diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx index 2a366b7da4..b1b9ecb13b 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx @@ -23,7 +23,6 @@ import { TECHDOCS_ADDONS_WRAPPER_KEY, TECHDOCS_ADDONS_KEY, TechDocsReaderPageProvider, - techdocsApiRef, } from '@backstage/plugin-techdocs-react'; import { TechDocsReaderPageRenderFunction } from '../../../types'; @@ -180,7 +179,7 @@ export const TechDocsReaderPage = (props: TechDocsReaderPageProps) => { // As explained above, "page" is configuration 4 and is 1 return ( - + {(page as JSX.Element) || } @@ -190,7 +189,7 @@ export const TechDocsReaderPage = (props: TechDocsReaderPageProps) => { // As explained above, a render function is configuration 3 and React element is 2 return ( - + {({ metadata, entityMetadata, onReady }) => (
diff --git a/yarn.lock b/yarn.lock index 3a8010a02c..07c751cc3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5117,12 +5117,14 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" + "@backstage/errors": "workspace:^" "@backstage/test-utils": "workspace:^" "@material-ui/core": ^4.9.13 "@react-hookz/web": ^24.0.4 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^14.0.0 "@testing-library/user-event": ^14.0.0 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 || ^18.0.0 languageName: unknown From aaab35ee171447b192be4879209aad70cff949f8 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Thu, 14 Mar 2024 08:42:35 +0100 Subject: [PATCH 099/219] refactor: apply second round of suggestions Signed-off-by: Camila Belo --- plugins/auth-react/api-report.md | 53 ++++----- plugins/auth-react/package.json | 2 +- .../CookieAuthRefreshProvider.test.tsx | 29 +++-- .../CookieAuthRefreshProvider.tsx | 37 +++--- .../src/hooks/useCookieAuthRefresh/index.ts | 5 +- .../useCookieAuthRefresh.test.tsx | 109 +++++------------- .../useCookieAuthRefresh.tsx | 76 +++++------- plugins/auth-react/src/setupTests.ts | 25 ---- .../src/test-utils.tsx | 10 +- .../TechDocsReaderPage.test.tsx | 28 +---- plugins/techdocs/src/setupTests.ts | 25 ---- yarn.lock | 4 +- 12 files changed, 145 insertions(+), 258 deletions(-) diff --git a/plugins/auth-react/api-report.md b/plugins/auth-react/api-report.md index 0e8a7dc8b7..9c2cf4622d 100644 --- a/plugins/auth-react/api-report.md +++ b/plugins/auth-react/api-report.md @@ -3,41 +3,38 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AsyncState } from '@react-hookz/web'; -import { default as React_2 } from 'react'; import { ReactNode } from 'react'; -import { UseAsyncActions } from '@react-hookz/web'; // @public -export type CookieAuthRefreshOptions = { +export function CookieAuthRefreshProvider( + props: CookieAuthRefreshProviderProps, +): JSX.Element; + +// @public +export type CookieAuthRefreshProviderProps = { pluginId: string; - path?: string; -}; - -// @public -export function CookieAuthRefreshProvider({ - children, - ...rest -}: CookieAuthRefreshProviderProps): - | string - | number - | boolean - | Iterable - | React_2.JSX.Element - | null - | undefined; - -// @public -export type CookieAuthRefreshProviderProps = CookieAuthRefreshOptions & { + options?: { + path?: string; + }; children: ReactNode; }; // @public -export function useCookieAuthRefresh({ - pluginId, - path, -}: CookieAuthRefreshOptions): { - state: AsyncState; - actions: UseAsyncActions; +export function useCookieAuthRefresh(params: { + pluginId: string; + options?: { + path?: string; + }; +}): { + loading: boolean; + error: Error | undefined; + value: + | { + expiresAt: string; + } + | undefined; + retry: (...args: unknown[]) => Promise<{ + expiresAt: string; + }>; }; ``` diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 7bc248be67..875cb2f12f 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -36,7 +36,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", "@material-ui/core": "^4.9.13", - "@react-hookz/web": "^24.0.4", + "@react-hookz/web": "^24.0.0", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0" }, "devDependencies": { diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx index e8e5eea24d..786136261c 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.test.tsx @@ -18,10 +18,19 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { CookieAuthRefreshProvider } from './CookieAuthRefreshProvider'; -import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; -import { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api'; +import { + MockStorageApi, + TestApiProvider, + renderInTestApp, +} from '@backstage/test-utils'; +import { + discoveryApiRef, + fetchApiRef, + storageApiRef, +} from '@backstage/core-plugin-api'; describe('CookieAuthRefreshProvider', () => { + const storageApiMock = MockStorageApi.create(); const discoveryApiMock = { getBaseUrl: jest .fn() @@ -33,12 +42,6 @@ describe('CookieAuthRefreshProvider', () => { return new Date(Date.now() + tenMinutesInMilliseconds).toISOString(); } - global.BroadcastChannel = jest.fn().mockImplementation(() => ({ - postMessage: jest.fn(), - addEventListener: jest.fn(), - removeEventListener: jest.fn(), - })); - it('should render a progress bar', async () => { const fetchApiMock = { fetch: jest.fn().mockReturnValue(new Promise(() => {})), @@ -48,6 +51,7 @@ describe('CookieAuthRefreshProvider', () => { @@ -57,7 +61,9 @@ describe('CookieAuthRefreshProvider', () => { , ); - expect(screen.getByTestId('progress')).toBeInTheDocument(); + expect(screen.queryByText('Test Content')).not.toBeInTheDocument(); + + expect(screen.getByTestId('progress')).toBeVisible(); }); it('should render an error panel', async () => { @@ -70,6 +76,7 @@ describe('CookieAuthRefreshProvider', () => { @@ -100,6 +107,7 @@ describe('CookieAuthRefreshProvider', () => { @@ -118,6 +126,8 @@ describe('CookieAuthRefreshProvider', () => { expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1); + expect(screen.queryByText('Test Content')).not.toBeInTheDocument(); + expect(screen.getByText(error.message)).toBeInTheDocument(); await userEvent.click(screen.getByText('Retry')); @@ -143,6 +153,7 @@ describe('CookieAuthRefreshProvider', () => { diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx index 4265b25cf0..2b553f33e8 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx @@ -18,13 +18,20 @@ import React, { ReactNode } from 'react'; import { ErrorPanel } from '@backstage/core-components'; import { useApp } from '@backstage/core-plugin-api'; import { Button } from '@material-ui/core'; -import { useCookieAuthRefresh, CookieAuthRefreshOptions } from '../../hooks'; +import { useCookieAuthRefresh } from '../../hooks'; /** * @public * Props for the {@link CookieAuthRefreshProvider} component. */ -export type CookieAuthRefreshProviderProps = CookieAuthRefreshOptions & { +export type CookieAuthRefreshProviderProps = { + // The plugin ID to used for discovering the API origin + pluginId: string; + // Options for configuring the refresh cookie endpoint + options?: { + // The path to used for calling the refresh cookie endpoint, default to '/cookie' + path?: string; + }; // The children to render when the refresh is successful children: ReactNode; }; @@ -33,28 +40,28 @@ export type CookieAuthRefreshProviderProps = CookieAuthRefreshOptions & { * @public * A provider that will refresh the cookie when it is about to expire. */ -export function CookieAuthRefreshProvider({ - children, - ...rest -}: CookieAuthRefreshProviderProps) { +export function CookieAuthRefreshProvider( + props: CookieAuthRefreshProviderProps, +): JSX.Element { + const { children, ...params } = props; const app = useApp(); const { Progress } = app.getComponents(); - const { state, actions } = useCookieAuthRefresh(rest); + const { loading, error, retry } = useCookieAuthRefresh(params); - if (state.status === 'error' && state.error) { + if (loading) { + return ; + } + + if (error) { return ( - - ); } - if (state.status === 'loading') { - return ; - } - - return children; + return <>{children}; } diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts b/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts index 43b1882959..42b60840f8 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/index.ts @@ -14,7 +14,4 @@ * limitations under the License. */ -export { - useCookieAuthRefresh, - type CookieAuthRefreshOptions, -} from './useCookieAuthRefresh'; +export { useCookieAuthRefresh } from './useCookieAuthRefresh'; diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx index 42fe6f4fca..eee3659c71 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx @@ -16,8 +16,12 @@ import React from 'react'; import { renderHook, waitFor } from '@testing-library/react'; -import { fetchApiRef, discoveryApiRef } from '@backstage/core-plugin-api'; -import { TestApiProvider } from '@backstage/test-utils'; +import { + fetchApiRef, + discoveryApiRef, + storageApiRef, +} from '@backstage/core-plugin-api'; +import { MockStorageApi, TestApiProvider } from '@backstage/test-utils'; import { useCookieAuthRefresh } from './useCookieAuthRefresh'; describe('useCookieAuthRefresh', () => { @@ -39,31 +43,11 @@ describe('useCookieAuthRefresh', () => { }), }; - type Listener = (event: { data: any }) => void; - - let listeners: Listener[]; - let channelMock: any; + const storageApiMock = MockStorageApi.create(); beforeEach(() => { jest.useFakeTimers({ now }); jest.clearAllMocks(); - listeners = []; - channelMock = { - postMessage: jest.fn((message: any) => { - listeners.forEach(listener => listener({ data: message })); - }), - addEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners.push(listener); - } - }), - removeEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners = listeners.filter(l => l !== listener); - } - }), - }; - global.BroadcastChannel = jest.fn().mockImplementation(() => channelMock); }); afterEach(() => { @@ -83,6 +67,7 @@ describe('useCookieAuthRefresh', () => { fetch: jest.fn(), }, ], + [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApiMock], ]} > @@ -92,7 +77,7 @@ describe('useCookieAuthRefresh', () => { }, ); - expect(result.current.state.status).toBe('loading'); + expect(result.current.loading).toBeTruthy(); }); it('should return an error status when the refresh has failed', async () => { @@ -110,6 +95,7 @@ describe('useCookieAuthRefresh', () => { fetch: jest.fn().mockRejectedValue(error), }, ], + [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApiMock], ]} > @@ -119,9 +105,7 @@ describe('useCookieAuthRefresh', () => { }, ); - await waitFor(() => expect(result.current.state.status).toBe('error')); - - expect(result.current.state.error).toStrictEqual(error); + await waitFor(() => expect(result.current.error).toStrictEqual(error)); }); it('should call the api to get the cookie and use it', async () => { @@ -132,6 +116,7 @@ describe('useCookieAuthRefresh', () => { @@ -148,46 +133,18 @@ describe('useCookieAuthRefresh', () => { ), ); - expect(result.current.state.result).toMatchObject({ expiresAt }); - }); - - it('should send a message to other tabs when the cookie is refreshed', async () => { - renderHook(() => useCookieAuthRefresh({ pluginId: 'techdocs' }), { - wrapper: ({ children }) => ( - - {children} - - ), - }); - - expect(global.BroadcastChannel).toHaveBeenCalledWith( - 'techdocs-auth-cookie-channel', - ); - - await waitFor(() => - expect(channelMock.postMessage).toHaveBeenCalledTimes(1), - ); - - // posting the message to other tabs when the cookie is requested in the first time - await waitFor(() => - expect(channelMock.postMessage).toHaveBeenCalledWith({ - action: 'COOKIE_REFRESHED', - payload: { expiresAt }, - }), - ); + expect(result.current.value).toMatchObject({ expiresAt }); }); it('should cancel the refresh when a message is received from another tab', async () => { - renderHook(() => useCookieAuthRefresh({ pluginId: 'techdocs' }), { + const pluginId = 'techdocs'; + + renderHook(() => useCookieAuthRefresh({ pluginId }), { wrapper: ({ children }) => ( @@ -196,29 +153,25 @@ describe('useCookieAuthRefresh', () => { ), }); - await waitFor(() => - expect(channelMock.addEventListener).toHaveBeenCalledTimes(1), - ); - const twentyMinutesFromNowInMilliseconds = now + 2 * tenMinutesInMilliseconds; // simulating other tab refreshing the cookie - channelMock.postMessage({ - action: 'COOKIE_REFRESHED', - payload: { - expiresAt: new Date(twentyMinutesFromNowInMilliseconds).toISOString(), - }, - }); + storageApiMock + .forBucket(`${pluginId}-auth-cookie-storage`) + .set( + 'expiresAt', + new Date(twentyMinutesFromNowInMilliseconds).toISOString(), + ); // advance the timers in 10 minutes to match the old expires at jest.advanceTimersByTime(tenMinutesInMilliseconds); // should not call the api - expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1); + await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); // advance the timers in more 10 minutes to match the new expires at - jest.advanceTimersByTime(tenMinutesInMilliseconds); + jest.advanceTimersByTime(tenMinutesInMilliseconds - 1000); // should call the api await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(2)); @@ -232,6 +185,7 @@ describe('useCookieAuthRefresh', () => { @@ -243,16 +197,10 @@ describe('useCookieAuthRefresh', () => { await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); - expect(result.current.state.result).toMatchObject({ expiresAt }); + expect(result.current.value).toMatchObject({ expiresAt }); unmount(); - expect(channelMock.removeEventListener).toHaveBeenCalledTimes(1); - expect(channelMock.removeEventListener).toHaveBeenCalledWith( - 'message', - expect.any(Function), - ); - // advance the timers to ensure that the refresh is not called jest.advanceTimersByTime(tenMinutesInMilliseconds); @@ -268,6 +216,7 @@ describe('useCookieAuthRefresh', () => { @@ -279,7 +228,7 @@ describe('useCookieAuthRefresh', () => { await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); // advance the timers to the expiration date - jest.advanceTimersByTime(tenMinutesInMilliseconds); + jest.advanceTimersByTime(tenMinutesInMilliseconds - 1000); // should call the api await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(2)); diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index 2d495d54c4..8bf43f3e0c 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -14,51 +14,38 @@ * limitations under the License. */ -import { useEffect, useState, useCallback } from 'react'; +import { useEffect, useCallback } from 'react'; import { discoveryApiRef, fetchApiRef, + storageApiRef, useApi, } from '@backstage/core-plugin-api'; import { useAsync, useMountEffect } from '@react-hookz/web'; import { ResponseError } from '@backstage/errors'; -type CookieAuthRefreshMessage = MessageEvent<{ - action: string; - payload: { - expiresAt: string; - }; -}>; - -/** - * @public - * The options for the {@link useCookieAuthRefresh} hook. - */ -export type CookieAuthRefreshOptions = { - // The plugin ID to used for discovering the API origin - pluginId: string; - // The path to used for calling the refresh cookie endpoint, default to '/cookie' - path?: string; -}; - /** * @public * A hook that will refresh the cookie when it is about to expire. - * @remarks - * This hook expects a `BroadcastChannel` to be available in the global scope. */ -export function useCookieAuthRefresh({ - pluginId, - path = '/cookie', -}: CookieAuthRefreshOptions) { +export function useCookieAuthRefresh(params: { + // The plugin ID to used for discovering the API origin + pluginId: string; + // Options for configuring the refresh cookie endpoint + options?: { + // The path to used for calling the refresh cookie endpoint, default to '/cookie' + path?: string; + }; +}) { + const { pluginId, options: { path = '/cookie' } = {} } = params; + const fetchApi = useApi(fetchApiRef); + const storageApi = useApi(storageApiRef); const discoveryApi = useApi(discoveryApiRef); - const [channel] = useState( - () => new BroadcastChannel(`${pluginId}-auth-cookie-channel`), - ); + const store = storageApi.forBucket(`${pluginId}-auth-cookie-storage`); - const [state, actions] = useAsync(async () => { + const [state, actions] = useAsync<{ expiresAt: string }>(async () => { const apiOrigin = await discoveryApi.getBaseUrl(pluginId); const requestUrl = `${apiOrigin}${path}`; const response = await fetchApi.fetch(`${requestUrl}`, { @@ -86,28 +73,27 @@ export function useCookieAuthRefresh({ useEffect(() => { if (!state.result) return () => {}; - channel.postMessage({ - action: 'COOKIE_REFRESHED', - payload: state.result, - }); + store.set('expiresAt', state.result.expiresAt); let cancel = refresh(state.result); - const handleMessage = (event: CookieAuthRefreshMessage): void => { - const { action, payload } = event.data; - if (action === 'COOKIE_REFRESHED') { - cancel(); - cancel = refresh(payload); - } - }; - - channel.addEventListener('message', handleMessage); + const observable = store.observe$('expiresAt'); + const subscription = observable.subscribe(({ value }) => { + if (!value) return; + cancel(); + cancel = refresh({ expiresAt: value }); + }); return () => { cancel(); - channel.removeEventListener('message', handleMessage); + subscription.unsubscribe(); }; - }, [state, refresh, channel]); + }, [state, refresh, store]); - return { state, actions }; + return { + loading: state.status === 'loading', + error: state.error, + value: state.result, + retry: actions.execute, + }; } diff --git a/plugins/auth-react/src/setupTests.ts b/plugins/auth-react/src/setupTests.ts index 0ab6a810cf..658016ffdd 100644 --- a/plugins/auth-react/src/setupTests.ts +++ b/plugins/auth-react/src/setupTests.ts @@ -14,28 +14,3 @@ * limitations under the License. */ import '@testing-library/jest-dom'; - -type Listener = (event: { data: any }) => void; - -global.BroadcastChannel = jest - .fn() - .mockImplementation((_channelName: string) => { - let listeners: Listener[] = []; - return { - postMessage: jest.fn((message: any) => { - // Simulate message event for all listeners - listeners.forEach(listener => listener({ data: message })); - }), - addEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners.push(listener); - } - }), - removeEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners = listeners.filter(l => l !== listener); - } - }), - close: jest.fn(), - }; - }); diff --git a/plugins/techdocs-addons-test-utils/src/test-utils.tsx b/plugins/techdocs-addons-test-utils/src/test-utils.tsx index 51a4650f99..c3e7281116 100644 --- a/plugins/techdocs-addons-test-utils/src/test-utils.tsx +++ b/plugins/techdocs-addons-test-utils/src/test-utils.tsx @@ -22,12 +22,17 @@ import { screen } from 'testing-library__dom'; import { Route } from 'react-router-dom'; import { act, render } from '@testing-library/react'; -import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { + wrapInTestApp, + TestApiProvider, + MockStorageApi, +} from '@backstage/test-utils'; import { FlatRoutes } from '@backstage/core-app-api'; import { ApiRef, discoveryApiRef, fetchApiRef, + storageApiRef, } from '@backstage/core-plugin-api'; import { @@ -73,6 +78,8 @@ const scmIntegrationsApi = { fromConfig: jest.fn().mockReturnValue({}), }; +const storageApiMock = MockStorageApi.create(); + const discoveryApi = { getBaseUrl: jest .fn() @@ -225,6 +232,7 @@ export class TechDocsAddonTester { build() { const apis: TechdocsAddonTesterApis = [ [fetchApiRef, fetchApi], + [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApi], [techdocsApiRef, techdocsApi], [techdocsStorageApiRef, techdocsStorageApi], diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx index 8295ea0688..abea660b62 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx @@ -19,6 +19,7 @@ import { scmIntegrationsApiRef } from '@backstage/integration-react'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { MockConfigApi, + MockStorageApi, renderInTestApp, TestApiProvider, } from '@backstage/test-utils'; @@ -38,6 +39,7 @@ import { configApiRef, discoveryApiRef, fetchApiRef, + storageApiRef, } from '@backstage/core-plugin-api'; const mockEntityMetadata = { @@ -80,6 +82,8 @@ const techdocsStorageApiMock: jest.Mocked = { syncEntityDocs: jest.fn(), }; +const storageApiMock = MockStorageApi.create(); + const discoveryApiMock = { getBaseUrl: jest .fn() @@ -117,6 +121,7 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => { ', () => { beforeEach(() => { - type Listener = (event: { data: any }) => void; - - global.BroadcastChannel = jest - .fn() - .mockImplementation((_channelName: string) => { - let listeners: Listener[] = []; - return { - postMessage: jest.fn((message: any) => { - listeners.forEach(listener => listener({ data: message })); - }), - addEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners.push(listener); - } - }), - removeEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners = listeners.filter(l => l !== listener); - } - }), - }; - }); - getEntityMetadata.mockResolvedValue(mockEntityMetadata); getTechDocsMetadata.mockResolvedValue(mockTechDocsMetadata); getCookie.mockResolvedValue({ diff --git a/plugins/techdocs/src/setupTests.ts b/plugins/techdocs/src/setupTests.ts index 0bdcc73ccb..6c7fc2d3e3 100644 --- a/plugins/techdocs/src/setupTests.ts +++ b/plugins/techdocs/src/setupTests.ts @@ -17,28 +17,3 @@ import '@testing-library/jest-dom'; Element.prototype.scrollIntoView = jest.fn(); - -type Listener = (event: { data: any }) => void; - -global.BroadcastChannel = jest - .fn() - .mockImplementation((_channelName: string) => { - let listeners: Listener[] = []; - return { - postMessage: jest.fn((message: any) => { - // Simulate message event for all listeners - listeners.forEach(listener => listener({ data: message })); - }), - addEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners.push(listener); - } - }), - removeEventListener: jest.fn((event: string, listener: Listener) => { - if (event === 'message') { - listeners = listeners.filter(l => l !== listener); - } - }), - close: jest.fn(), - }; - }); diff --git a/yarn.lock b/yarn.lock index 07c751cc3b..d432f7a958 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5120,7 +5120,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/test-utils": "workspace:^" "@material-ui/core": ^4.9.13 - "@react-hookz/web": ^24.0.4 + "@react-hookz/web": ^24.0.0 "@testing-library/jest-dom": ^6.0.0 "@testing-library/react": ^14.0.0 "@testing-library/user-event": ^14.0.0 @@ -15728,7 +15728,7 @@ __metadata: languageName: node linkType: hard -"@react-hookz/web@npm:^24.0.0, @react-hookz/web@npm:^24.0.4": +"@react-hookz/web@npm:^24.0.0": version: 24.0.4 resolution: "@react-hookz/web@npm:24.0.4" dependencies: From 700dcec4650b98db8b5014c3408012f3cb321b0d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:55:12 +0000 Subject: [PATCH 100/219] chore(deps): update dependency msw to v1.3.3 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 63e46381d6..d6a88483e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35781,8 +35781,8 @@ __metadata: linkType: hard "msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1, msw@npm:^1.2.3, msw@npm:^1.3.0, msw@npm:^1.3.1": - version: 1.3.2 - resolution: "msw@npm:1.3.2" + version: 1.3.3 + resolution: "msw@npm:1.3.3" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.10 @@ -35804,19 +35804,19 @@ __metadata: type-fest: ^2.19.0 yargs: ^17.3.1 peerDependencies: - typescript: ">= 4.4.x <= 5.2.x" + typescript: ">= 4.4.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: c2d4f7747f5806f0fd8d8cc3ca250ee1c2a7a6cd608de43f95bd072ba1fb13cdce0b52932ce9bf8f4a21b194d2815db535501e224ec8f7052593447fe1c0cb70 + checksum: cb3fda1519485f219d36c4e5ac1e1190ffe77dab66121c88cb9db0bace1ecb5a45c83db49e68e7c688b330ce43eed17d00939e09812dc710c0d4b3e59925730c languageName: node linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.2.1 - resolution: "msw@npm:2.2.1" + version: 2.2.3 + resolution: "msw@npm:2.2.3" dependencies: "@bundled-es-modules/cookie": ^2.0.0 "@bundled-es-modules/statuses": ^1.0.1 @@ -35836,13 +35836,13 @@ __metadata: type-fest: ^4.9.0 yargs: ^17.7.2 peerDependencies: - typescript: ">= 4.7.x <= 5.3.x" + typescript: ">= 4.7.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: 4ff02f095a2ec373cef18b71ba4a07d0b744a64199bd81b104128f3617c1d64fd46359e7b820b8d37887881022435c2f9ebe203ac0faeea62322aff4d36c1aa8 + checksum: 0a58d5c78d7926a0226bd151ed81b2d4f3b9bda4aa8820669ea2b1462eda131b724515e714551f6ab257c113e1e3bf1c0f07a7bc8a17620b993186760cfc167a languageName: node linkType: hard From 869e02c5974643eb5d9caa02fa0af1e72098f839 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:56:02 +0000 Subject: [PATCH 101/219] chore(deps): update dependency msw to v2.2.3 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 63e46381d6..d6a88483e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35781,8 +35781,8 @@ __metadata: linkType: hard "msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1, msw@npm:^1.2.3, msw@npm:^1.3.0, msw@npm:^1.3.1": - version: 1.3.2 - resolution: "msw@npm:1.3.2" + version: 1.3.3 + resolution: "msw@npm:1.3.3" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.10 @@ -35804,19 +35804,19 @@ __metadata: type-fest: ^2.19.0 yargs: ^17.3.1 peerDependencies: - typescript: ">= 4.4.x <= 5.2.x" + typescript: ">= 4.4.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: c2d4f7747f5806f0fd8d8cc3ca250ee1c2a7a6cd608de43f95bd072ba1fb13cdce0b52932ce9bf8f4a21b194d2815db535501e224ec8f7052593447fe1c0cb70 + checksum: cb3fda1519485f219d36c4e5ac1e1190ffe77dab66121c88cb9db0bace1ecb5a45c83db49e68e7c688b330ce43eed17d00939e09812dc710c0d4b3e59925730c languageName: node linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.2.1 - resolution: "msw@npm:2.2.1" + version: 2.2.3 + resolution: "msw@npm:2.2.3" dependencies: "@bundled-es-modules/cookie": ^2.0.0 "@bundled-es-modules/statuses": ^1.0.1 @@ -35836,13 +35836,13 @@ __metadata: type-fest: ^4.9.0 yargs: ^17.7.2 peerDependencies: - typescript: ">= 4.7.x <= 5.3.x" + typescript: ">= 4.7.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: 4ff02f095a2ec373cef18b71ba4a07d0b744a64199bd81b104128f3617c1d64fd46359e7b820b8d37887881022435c2f9ebe203ac0faeea62322aff4d36c1aa8 + checksum: 0a58d5c78d7926a0226bd151ed81b2d4f3b9bda4aa8820669ea2b1462eda131b724515e714551f6ab257c113e1e3bf1c0f07a7bc8a17620b993186760cfc167a languageName: node linkType: hard From 621642e891d955b3f2bfea7b9d45eafd0dc5c2bc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:12:35 +0000 Subject: [PATCH 102/219] Update dependency jose to v5.2.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Lin Sun --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7f610b8f48..63e46381d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32490,16 +32490,16 @@ __metadata: linkType: hard "jose@npm:^4.15.4": - version: 4.15.4 - resolution: "jose@npm:4.15.4" - checksum: dccad91cb3357f36423774a0b89ad830dd84b31090de65cd139b85488439f16a00f8c59c0773825e8a1adb0dd9d13ad725ad66e6ea33880ecb3959bb99e1ea5b + version: 4.15.5 + resolution: "jose@npm:4.15.5" + checksum: 7dde76447c7707bd4b448f914b216f3858e701aa83f00447434252461af5b9e159dcbffb88badea3f9616739526763581267c9560622f0a058df8d68c86d7f79 languageName: node linkType: hard "jose@npm:^5.0.0": - version: 5.2.2 - resolution: "jose@npm:5.2.2" - checksum: d23def3c1df8aae1ae59d1c027a073804034fe8b971dafe51f0452ca8f6eb7e5cd3e3c90b6e544776443e01e58c8f8eefbd1984dbcde378e693e0ebbd176584d + version: 5.2.3 + resolution: "jose@npm:5.2.3" + checksum: 7c41025d3e449f654a4cbf0e18e3a4a3bcb74b242d716e2e665a20be5c93b3f68421032a4531fd984d4bad6aa225c7c517da18da6e0cf778b104cd7e30bde5de languageName: node linkType: hard From eb57804341f40b1b683babb807acae5c7bf2bc8d Mon Sep 17 00:00:00 2001 From: Lin Sun Date: Fri, 15 Mar 2024 10:57:54 -0400 Subject: [PATCH 103/219] add back/white logo Signed-off-by: Lin Sun --- microsite/static/img/partner-logo-solo.png | Bin 46993 -> 46674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/microsite/static/img/partner-logo-solo.png b/microsite/static/img/partner-logo-solo.png index 7d26b976f414c95c101cd871a180828804e5ad84..f4d36ec61a702c83d020451c60ab5dc2cc65a30b 100644 GIT binary patch literal 46674 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 N(%f$MEi;$M{{i}nxL^PP literal 46993 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

hMdPW(RuJ3NhN+ z*Y?r-K5Sx$dI@IsDS}sksVp5^JYRKxf2?sr$s# z^QakQ*$^bWLlGwp=?qYm)WZa&3`1#Ox(0Lfxp2XEXzpYzIKjjAzn#?72fsSv1Q3xC zQhH3pcFpUQP?G(zv**p@FxNClAm-55o^J zG1hyioB$TkMN!J65(Mu9{H5v(*_Yi))y6WY9nBJPB7(3{df2JGhzL79tn27||64u#`#f&2U3d@uK;XM^c@dNGrr59%AjXNSy@ zvM5cN6Z&#@0eu9U2r#qlhP0RJw^_51k8PM#v5a^9-a6qr6Ce>)3P_aJt4s{V<@P;w z+?HxpG0giW|FR{Q;Gqa~P@Qmt32@_L= zsAGV);MH*iJL%pFDk#Z>D#5I%zG&RuUzmM;%^12U^+EZB`Z#^{g9n$>zP9__pgdmF NXkRx_FITgE^glA78+HHy From dfa6f05210736ef861e119de8f9a324be97a2fb2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 15:33:17 +0000 Subject: [PATCH 104/219] chore(deps): update github/codeql-action action to v3.24.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- .github/workflows/sync_snyk-monitor.yml | 2 +- .github/workflows/verify_codeql.yml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index d94373e9d1..86577f0bbf 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@47b3d888fe66b639e431abf22ebca059152f1eea # v3.24.5 + uses: github/codeql-action/upload-sarif@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index 1ffc8d2c26..aa467c737c 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -58,6 +58,6 @@ jobs: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} NODE_OPTIONS: --max-old-space-size=7168 - name: Upload Snyk report - uses: github/codeql-action/upload-sarif@47b3d888fe66b639e431abf22ebca059152f1eea # v3.24.5 + uses: github/codeql-action/upload-sarif@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: sarif_file: snyk.sarif diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index dabbff24db..501759254d 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@47b3d888fe66b639e431abf22ebca059152f1eea # v3.24.5 + uses: github/codeql-action/init@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -66,7 +66,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@47b3d888fe66b639e431abf22ebca059152f1eea # v3.24.5 + uses: github/codeql-action/autobuild@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -80,4 +80,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@47b3d888fe66b639e431abf22ebca059152f1eea # v3.24.5 + uses: github/codeql-action/analyze@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 From eb8d3798b2feb67fbffd97aba5f8835879ed04d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 16:22:07 +0000 Subject: [PATCH 105/219] fix(deps): update dependency json-schema-to-ts to v3.0.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index d6a88483e2..f130f28a89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32841,13 +32841,12 @@ __metadata: linkType: hard "json-schema-to-ts@npm:^3.0.0": - version: 3.0.0 - resolution: "json-schema-to-ts@npm:3.0.0" + version: 3.0.1 + resolution: "json-schema-to-ts@npm:3.0.1" dependencies: "@babel/runtime": ^7.18.3 - "@types/json-schema": ^7.0.9 ts-algebra: ^1.2.2 - checksum: 4f33a0fee49cc058b16b4e4effd83cfb0c6000c6916990fda61b3622fa7967c9edbad59e34991eb869ebcd4989383d4c72f99a51a77163ac47f80da2c57d2aa8 + checksum: 32013ac5cc28b55d056d3241e50360f69fe86d7a6efeeed097e3b6c30c17d30e655b2565ff27d2e7cc232dcbcf9180f77556c154482b30a8d32bc428a0692c62 languageName: node linkType: hard From 1a557c14397d4a0de1a17ef4cf4bb95408eae543 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 15 Mar 2024 17:25:30 +0100 Subject: [PATCH 106/219] fix: refreshing statuses Signed-off-by: Camila Belo --- plugins/auth-react/api-report.md | 24 ++-- .../CookieAuthRefreshProvider.tsx | 15 +-- .../useCookieAuthRefresh.test.tsx | 110 +++++++++++++++++- .../useCookieAuthRefresh.tsx | 72 +++++++++--- 4 files changed, 175 insertions(+), 46 deletions(-) diff --git a/plugins/auth-react/api-report.md b/plugins/auth-react/api-report.md index 9c2cf4622d..660154271c 100644 --- a/plugins/auth-react/api-report.md +++ b/plugins/auth-react/api-report.md @@ -13,28 +13,20 @@ export function CookieAuthRefreshProvider( // @public export type CookieAuthRefreshProviderProps = { pluginId: string; - options?: { - path?: string; - }; + path?: string; children: ReactNode; }; // @public -export function useCookieAuthRefresh(params: { +export function useCookieAuthRefresh(options: { pluginId: string; - options?: { - path?: string; - }; + path?: string; }): { - loading: boolean; - error: Error | undefined; - value: - | { - expiresAt: string; - } - | undefined; - retry: (...args: unknown[]) => Promise<{ + status: 'loading' | 'error' | 'success'; + error?: Error; + result?: { expiresAt: string; - }>; + }; + retry: () => void; }; ``` diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx index 2b553f33e8..8f6f38e225 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx @@ -27,11 +27,8 @@ import { useCookieAuthRefresh } from '../../hooks'; export type CookieAuthRefreshProviderProps = { // The plugin ID to used for discovering the API origin pluginId: string; - // Options for configuring the refresh cookie endpoint - options?: { - // The path to used for calling the refresh cookie endpoint, default to '/cookie' - path?: string; - }; + // The path to used for calling the refresh cookie endpoint, default to '/cookie' + path?: string; // The children to render when the refresh is successful children: ReactNode; }; @@ -43,17 +40,17 @@ export type CookieAuthRefreshProviderProps = { export function CookieAuthRefreshProvider( props: CookieAuthRefreshProviderProps, ): JSX.Element { - const { children, ...params } = props; + const { children, ...options } = props; const app = useApp(); const { Progress } = app.getComponents(); - const { loading, error, retry } = useCookieAuthRefresh(params); + const { status, error, retry } = useCookieAuthRefresh(options); - if (loading) { + if (status === 'loading') { return ; } - if (error) { + if (status === 'error' && error) { return ( diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx index 2d5d738348..5c754b584c 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx @@ -80,8 +80,6 @@ describe('useCookieAuthRefresh', () => { ); expect(result.current.status).toBe('loading'); - expect(result.current.error).toBeUndefined(); - expect(result.current.result).toBeUndefined(); }); it('should return a loading status when retrying without previous success', async () => { @@ -112,19 +110,25 @@ describe('useCookieAuthRefresh', () => { }, ); - expect(result.current.status).toBe('loading'); - expect(result.current.error).toBeUndefined(); - expect(result.current.result).toBeUndefined(); + expect(result.current).toStrictEqual({ status: 'loading' }); - await waitFor(() => expect(result.current.status).toBe('error')); - expect(result.current.result).toBeUndefined(); - expect(result.current.error).toStrictEqual(error); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'error', + error, + retry: expect.any(Function), + }), + ); - result.current.retry(); + if (result.current.status === 'error') { + result.current.retry(); + } - await waitFor(() => expect(result.current.status).toBe('loading')); - expect(result.current.result).toBeUndefined(); - expect(result.current.error).toStrictEqual(error); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'loading', + }), + ); }); it('should return a loading status when retrying with previous success', async () => { @@ -159,25 +163,34 @@ describe('useCookieAuthRefresh', () => { }, ); - expect(result.current.status).toBe('loading'); - expect(result.current.error).toBeUndefined(); - expect(result.current.result).toBeUndefined(); + expect(result.current).toStrictEqual({ status: 'loading' }); - await waitFor(() => expect(result.current.status).toBe('success')); - expect(result.current.result).toMatchObject({ expiresAt }); - expect(result.current.error).toBeUndefined(); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'success', + data: { expiresAt }, + }), + ); - result.current.retry(); + jest.advanceTimersByTime(tenMinutesInMilliseconds); - await waitFor(() => expect(result.current.status).toBe('error')); - expect(result.current.result).toMatchObject({ expiresAt }); - expect(result.current.error).toStrictEqual(error); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'error', + error, + retry: expect.any(Function), + }), + ); - result.current.retry(); + if (result.current.status === 'error') { + result.current.retry(); + } - await waitFor(() => expect(result.current.status).toBe('loading')); - expect(result.current.result).toMatchObject({ expiresAt }); - expect(result.current.error).toStrictEqual(error); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'loading', + }), + ); }); it('should return an error status when the refresh has failed', async () => { @@ -205,7 +218,13 @@ describe('useCookieAuthRefresh', () => { }, ); - await waitFor(() => expect(result.current.error).toStrictEqual(error)); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'error', + error, + retry: expect.any(Function), + }), + ); }); it('should call the api to get the cookie and use it', async () => { @@ -233,7 +252,12 @@ describe('useCookieAuthRefresh', () => { ), ); - expect(result.current.result).toMatchObject({ expiresAt }); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'success', + data: { expiresAt }, + }), + ); }); it('should cancel the refresh when a message is received from another tab', async () => { @@ -295,9 +319,14 @@ describe('useCookieAuthRefresh', () => { }, ); - await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); + await waitFor(() => + expect(result.current).toStrictEqual({ + status: 'success', + data: { expiresAt }, + }), + ); - expect(result.current.result).toMatchObject({ expiresAt }); + await waitFor(() => expect(fetchApiMock.fetch).toHaveBeenCalledTimes(1)); unmount(); diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index c7b4984928..79e80c3954 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { useEffect, useCallback, useMemo } from 'react'; +import { useEffect, useCallback } from 'react'; import { discoveryApiRef, fetchApiRef, @@ -34,14 +34,10 @@ export function useCookieAuthRefresh(options: { pluginId: string; // The path to used for calling the refresh cookie endpoint, default to '/cookie' path?: string; -}): { - status: 'loading' | 'error' | 'success'; - error?: Error; - result?: { - expiresAt: string; - }; - retry: () => void; -} { +}): + | { status: 'loading' } + | { status: 'error'; error: Error; retry: () => void } + | { status: 'success'; data: { expiresAt: string } } { const { pluginId, path = '/cookie' } = options ?? {}; const fetchApi = useApi(fetchApiRef); const storageApi = useApi(storageApiRef); @@ -58,14 +54,19 @@ export function useCookieAuthRefresh(options: { if (!response.ok) { throw await ResponseError.fromResponse(response); } - return await response.json(); + const data = await response.json(); + if (!data.expiresAt) { + throw new Error('No expiration date found in response'); + } + return data; }); useMountEffect(actions.execute); const refresh = useCallback( (params: { expiresAt: string }) => { - // Randomize the refreshing margin to avoid all tabs refreshing at the same time + // Randomize the refreshing margin with a margin of 1-4 minutes to avoid all tabs refreshing at the same time + // It cannot be less than 5 minutes otherwise the backend will return the same expiration date const margin = (1 + 3 * Math.random()) * 60000; const delay = Date.parse(params.expiresAt) - Date.now() - margin; const timeout = setTimeout(actions.execute, delay); @@ -97,43 +98,35 @@ export function useCookieAuthRefresh(options: { }; }, [state, refresh, store]); - const status = useMemo(() => { - // Initialising - if (state.status === 'not-executed') { - return 'loading'; - } - - // First refresh or retrying without any success before - // Possible states transitions: - // e.g. not-executed -> loading (first-refresh) - // e.g. not-executed -> loading (first-refresh) -> error -> loading (manual-retry) - if (state.status === 'loading' && !state.result) { - return 'loading'; - } - - // Retrying after having succeeding at least once - // Current states is: { status: 'loading', result: {...}, error: undefined | Error } - // e.g. not-executed -> loading (first-refresh) -> success -> loading (scheduled-refresh) -> error -> loading (manual-retry) - if (state.status === 'loading' && state.error) { - return 'loading'; - } - - // Something went wrong during the any situation of a refresh - if (state.status === 'error' && state.error) { - return 'error'; - } - - return 'success'; - }, [state]); - const retry = useCallback(() => { actions.execute(); }, [actions]); - return { - retry, - status, - result: state.result, - error: state.error, - }; + // Initialising + if (state.status === 'not-executed') { + return { status: 'loading' }; + } + + // First refresh or retrying without any success before + // Possible state transitions: + // e.g. not-executed -> loading (first-refresh) + // e.g. not-executed -> loading (first-refresh) -> error -> loading (manual-retry) + if (state.status === 'loading' && !state.result) { + return { status: 'loading' }; + } + + // Retrying after having succeeding at least once + // Current state is: { status: 'loading', result: {...}, error: undefined | Error } + // e.g. not-executed -> loading (first-refresh) -> success -> loading (scheduled-refresh) -> error -> loading (manual-retry) + if (state.status === 'loading' && state.error) { + return { status: 'loading' }; + } + + // Something went wrong during any situation of a refresh + if (state.status === 'error' && state.error) { + return { status: 'error', error: state.error, retry }; + } + + // At this point it should be safe to assume that we have a successful refresh + return { status: 'success', data: state.result! }; } From c2bcbb8bdf9802d0b9219b5effdd02005a09ef0c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 08:38:50 +0000 Subject: [PATCH 129/219] chore(deps): update dependency knip to v5.1.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 67 +++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7d98821972..9ff52c5547 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14929,12 +14929,12 @@ __metadata: languageName: node linkType: hard -"@pnpm/error@npm:5.0.2": - version: 5.0.2 - resolution: "@pnpm/error@npm:5.0.2" +"@pnpm/error@npm:5.0.3": + version: 5.0.3 + resolution: "@pnpm/error@npm:5.0.3" dependencies: "@pnpm/constants": 7.1.1 - checksum: 490e90b3a6fa6527a5a2b07dfd46982e005d8834036871a30cf03fcb389497b9828ed01c0d39e88b6352a340556de316eae9dbefcb3246f368815a03241576e6 + checksum: b0c5b8b18c4302aeef59554b07107046679189d24eac6b34df59a28f6567f999bd589d7f64c75fcfee2e25f4175f5c0b1089fb2c5b633257836ced185e531726 languageName: node linkType: hard @@ -14978,12 +14978,12 @@ __metadata: languageName: node linkType: hard -"@pnpm/npm-resolver@npm:18.1.0": - version: 18.1.0 - resolution: "@pnpm/npm-resolver@npm:18.1.0" +"@pnpm/npm-resolver@npm:18.1.1": + version: 18.1.1 + resolution: "@pnpm/npm-resolver@npm:18.1.1" dependencies: "@pnpm/core-loggers": 9.0.6 - "@pnpm/error": 5.0.2 + "@pnpm/error": 5.0.3 "@pnpm/fetching-types": 5.0.0 "@pnpm/graceful-fs": 3.2.0 "@pnpm/resolve-workspace-range": 5.0.1 @@ -15005,7 +15005,7 @@ __metadata: version-selector-type: ^3.0.0 peerDependencies: "@pnpm/logger": ^5.0.0 - checksum: 81b0dd97a0062374db7aecd68a94e7e52dd19c9675bd052c7fa7a2b5edb6219dc525e71dccb70bf4bae90faf44f6e1cd0d4f155606bc754ffcec4f9ab6852c08 + checksum: 6157882e654c088b2a4b4948e911fd0e8e9e1eca8cf54637757b17ac13330d3a22f429b0183cb7dbbd1015830acdd476e4b719d038ebe0c020f34e33f2b823d5 languageName: node linkType: hard @@ -15034,15 +15034,15 @@ __metadata: languageName: node linkType: hard -"@pnpm/workspace.pkgs-graph@npm:^2.0.14": - version: 2.0.14 - resolution: "@pnpm/workspace.pkgs-graph@npm:2.0.14" +"@pnpm/workspace.pkgs-graph@npm:^2.0.15": + version: 2.0.15 + resolution: "@pnpm/workspace.pkgs-graph@npm:2.0.15" dependencies: "@pnpm/npm-package-arg": ^1.0.0 - "@pnpm/npm-resolver": 18.1.0 + "@pnpm/npm-resolver": 18.1.1 "@pnpm/resolve-workspace-range": 5.0.1 ramda: "npm:@pnpm/ramda@0.28.1" - checksum: ff3b5234611da1ec4b636616554abcb4720c4fcd3db33bcb7b4b1e4ed5ebd091a854163876c1b1f7d56d2ec6e4f344c22eaf02054f2963d9a50a49462412793d + checksum: f16cebedb0aed369ffe744792859e8cca016069013e4a0e0317f9e4dec72fd0f44042999b30d490f37ed29aaa64fcb92e0ff715069b1854a3c96926f417d3255 languageName: node linkType: hard @@ -33397,15 +33397,15 @@ __metadata: linkType: hard "knip@npm:^5.0.0": - version: 5.0.2 - resolution: "knip@npm:5.0.2" + version: 5.1.1 + resolution: "knip@npm:5.1.1" dependencies: "@ericcornelissen/bash-parser": 0.5.2 "@nodelib/fs.walk": 2.0.0 "@npmcli/map-workspaces": 3.0.4 "@npmcli/package-json": 5.0.0 "@pnpm/logger": 5.0.0 - "@pnpm/workspace.pkgs-graph": ^2.0.14 + "@pnpm/workspace.pkgs-graph": ^2.0.15 "@snyk/github-codeowners": 1.1.0 "@types/picomatch": 2.3.3 easy-table: 1.2.0 @@ -33417,18 +33417,17 @@ __metadata: picocolors: 1.0.0 picomatch: 4.0.1 pretty-ms: 9.0.0 - semver: 7.6.0 smol-toml: 1.1.4 strip-json-comments: 5.0.1 summary: 2.1.0 zod: 3.22.4 - zod-validation-error: 3.0.2 + zod-validation-error: 3.0.3 peerDependencies: "@types/node": ">=18" typescript: ">=5.0.4" bin: knip: bin/knip.js - checksum: af0e395ab1f8a9974fa0e83711d13b252017cc7aacd92293d13b8a0219c9f4d98a04f0ea074202c9adf5af3aa3fd22a1b5bbbbe3f00effc143656961b92c6512 + checksum: 33fd81860f9dc5b3ad58ca13c4874443c68d4dc4f07061bfd3d0fb2336b68271362d92e4a739a8d422d7de78fdd0beed470e4fa94c2a2e84c54ab1deac4f5f8f languageName: node linkType: hard @@ -41672,7 +41671,16 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.0, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.6.0 resolution: "semver@npm:7.6.0" dependencies: @@ -41683,15 +41691,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -46746,12 +46745,12 @@ __metadata: languageName: node linkType: hard -"zod-validation-error@npm:3.0.2": - version: 3.0.2 - resolution: "zod-validation-error@npm:3.0.2" +"zod-validation-error@npm:3.0.3": + version: 3.0.3 + resolution: "zod-validation-error@npm:3.0.3" peerDependencies: zod: ^3.18.0 - checksum: 5127ff75f50db2f195d739142d4e56b1d8f7294b82c08d1b308978bc546afc7c3b2958f677d00eca1e3254342704d48a34ba93f8e88ae5799feefda6b6dc911e + checksum: 08ff4ccb2eb27bc1dd24dbf5cbd3196a21304cac05e554e4ef3e65ca7269fc4311fad2d0047878ed745077b8990b4f274c69f8ef79a29d13d255736889b87df3 languageName: node linkType: hard From bd9a1a6453d7ad0dddd06b4e13cc9c054b0d180b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 09:20:55 +0000 Subject: [PATCH 130/219] chore(deps): update docker/build-push-action action to v5.3.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/uffizzi-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index f6cd52b284..48691689fd 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -61,7 +61,7 @@ jobs: uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - name: Build and push - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 + uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 with: context: './example-app' file: ./example-app/packages/backend/Dockerfile diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index b4e7d4b904..c86ca8dc4c 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -67,7 +67,7 @@ jobs: tags: type=raw,value=60d - name: Build Image - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 + uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 with: context: . file: packages/backend/Dockerfile From 1f8c4e28f09924939716f46404bc75ede3482d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 16 Mar 2024 11:50:58 +0100 Subject: [PATCH 131/219] fix test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../backend-common/src/reading/tree/ZipArchiveResponse.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts index a80f688436..444cbf60b1 100644 --- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts @@ -246,7 +246,7 @@ describe('ZipArchiveResponse', () => { const filesPromise = res.files(); await expect(filesPromise).rejects.toThrow( - 'invalid comment length. expected: 55. found: 0', + /Invalid comment length. Expected: 55. Found: 0/, ); }); From 4e42bc41b3e0467dfdf669c16419e589680df108 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 10:52:54 +0000 Subject: [PATCH 132/219] chore(deps): update docker/login-action action to v3.1.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/deploy_docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 48691689fd..09944dd26e 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -51,7 +51,7 @@ jobs: working-directory: ./example-app - name: Login to GitHub Container Registry - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 with: registry: ghcr.io username: ${{ github.actor }} From 584ba056f739b353858ff8838a003af938a8c089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 10:53:02 +0000 Subject: [PATCH 133/219] chore(deps): Bump follow-redirects from 1.15.4 to 1.15.6 in /microsite Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 60a81db3a0..2b02b93f39 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -5770,12 +5770,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.4 - resolution: "follow-redirects@npm:1.15.4" + version: 1.15.6 + resolution: "follow-redirects@npm:1.15.6" peerDependenciesMeta: debug: optional: true - checksum: e178d1deff8b23d5d24ec3f7a94cde6e47d74d0dc649c35fc9857041267c12ec5d44650a0c5597ef83056ada9ea6ca0c30e7c4f97dbf07d035086be9e6a5b7b6 + checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 languageName: node linkType: hard From 406858e1c6b4e2aab2bcd0f6d6bbcbc6066acbc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 10:57:44 +0000 Subject: [PATCH 134/219] chore(deps): update docker/setup-buildx-action action to v3.2.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/uffizzi-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 48691689fd..3b66673c78 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -58,7 +58,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 - name: Build and push uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index c86ca8dc4c..29165d3c86 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -53,7 +53,7 @@ jobs: yarn workspace example-backend build - name: Set up Docker Buildx - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 - name: Generate UUID image name id: uuid From 7998e94bf5b899f4ee873142ad76bf6862192840 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 11:28:29 +0000 Subject: [PATCH 135/219] fix(deps): update aws-sdk-js-v3 monorepo to v3.535.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 2086 ++++++++++++++++++++++++++--------------------------- 1 file changed, 1043 insertions(+), 1043 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5c42feef7e..a8c0e0fe47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -363,569 +363,568 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.521.0" +"@aws-sdk/client-cognito-identity@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/credential-provider-node": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: e664da040d7688b97603dc49310c40acaae95c87dd2b32786664d5ee553a5e4079677b5ebcf5e85137434eafebe20c1d9f6f49b05926394d5b82cac2bcc2bbb8 + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 146eecad358a7aa88fb7301b708441d30a51adb649a0e36575d3e2af08b9063455b0e4027bd801fa93728eb14b5112e87d132821414a9aa4b3d1eaa85092643c languageName: node linkType: hard "@aws-sdk/client-eks@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/client-eks@npm:3.521.0" + version: 3.535.0 + resolution: "@aws-sdk/client-eks@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/credential-provider-node": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - "@smithy/util-waiter": ^2.1.2 - tslib: ^2.5.0 + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + "@smithy/util-waiter": ^2.2.0 + tslib: ^2.6.2 uuid: ^9.0.1 - checksum: c31d933e4f64173276e6c3a9cba1e699fc25d8b43daff15cc52e23c4bbfdbac63f7e6cc8c55910bde551b568c6c7f928b432d518fe6251c5d1fad65854d44861 + checksum: 2f4096b60ae4000191e167eec512d0571ff2532959e8ddc52332ea277bca787c791e2cab35fb9c313a3753d5d928aa78c0b760a73b43fcde45fb5732161ec9b2 languageName: node linkType: hard "@aws-sdk/client-organizations@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/client-organizations@npm:3.521.0" + version: 3.535.0 + resolution: "@aws-sdk/client-organizations@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/credential-provider-node": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 1191e702f2123f2316f175dc81e3c00df05c79a53be709f166834c8425a600cff4d61bb0db7befc1fa3fc801dcccc05faab87f74adf0100b8428b4ee26c0a963 + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: a8983d8b9af5075174335c0c37867b1b9377feb5f10b31e3af70b8fd212a418ed1390b0a82d2af06ed4106d023a84344611d308109c6e0a2615874c21314134e languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/client-s3@npm:3.521.0" + version: 3.535.0 + resolution: "@aws-sdk/client-s3@npm:3.535.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/credential-provider-node": 3.521.0 - "@aws-sdk/middleware-bucket-endpoint": 3.521.0 - "@aws-sdk/middleware-expect-continue": 3.521.0 - "@aws-sdk/middleware-flexible-checksums": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-location-constraint": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-sdk-s3": 3.521.0 - "@aws-sdk/middleware-signing": 3.521.0 - "@aws-sdk/middleware-ssec": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/signature-v4-multi-region": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@aws-sdk/xml-builder": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/eventstream-serde-browser": ^2.1.2 - "@smithy/eventstream-serde-config-resolver": ^2.1.2 - "@smithy/eventstream-serde-node": ^2.1.2 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-blob-browser": ^2.1.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/hash-stream-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/md5-js": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-stream": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - "@smithy/util-waiter": ^2.1.2 - fast-xml-parser: 4.2.5 - tslib: ^2.5.0 - checksum: bf3c5d6a42df6812f5645751bdbbb6cd69f8b28c3f0dd5ba7697a631e7573494e7cdc2bdc8081e49e5159a73c5a32259575a9d79f170753e8fbc53613e3ecc9c + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/middleware-bucket-endpoint": 3.535.0 + "@aws-sdk/middleware-expect-continue": 3.535.0 + "@aws-sdk/middleware-flexible-checksums": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-location-constraint": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-sdk-s3": 3.535.0 + "@aws-sdk/middleware-signing": 3.535.0 + "@aws-sdk/middleware-ssec": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/signature-v4-multi-region": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@aws-sdk/xml-builder": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/eventstream-serde-browser": ^2.2.0 + "@smithy/eventstream-serde-config-resolver": ^2.2.0 + "@smithy/eventstream-serde-node": ^2.2.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-blob-browser": ^2.2.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/hash-stream-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/md5-js": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-stream": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + "@smithy/util-waiter": ^2.2.0 + tslib: ^2.6.2 + checksum: e2cfbcf91c65a0ee111d1c6f9b7c42f1464384d4ab7afe401a2dc584b1f0faab86593ad5c9b2d49a353cf1df2288adab95de2959d5fc70a2df3eefd71aa2d536 languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/client-sqs@npm:3.521.0" + version: 3.535.0 + resolution: "@aws-sdk/client-sqs@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/credential-provider-node": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-sdk-sqs": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/md5-js": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 9f65ffa57f0da1279f00754234e504b9f2250085a2bc843605f591b54a67929b73ee4402a40a291a5f9ce9e9936ad1d31676e37a12bb30c4c24f2bcb17483c5b + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-sdk-sqs": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/md5-js": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 83ba35e18a4ed40a0d39b51d80cab9021705f176bbebac83fc917997cc685b903d57d483fd83ea873bfe211a4bba76a664533ddc0158b4da3246475d52d680e0 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.521.0" +"@aws-sdk/client-sso-oidc@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 peerDependencies: - "@aws-sdk/credential-provider-node": ^3.521.0 - checksum: da6b724cd91f128192eba0bbf0827c7e6fccb30f899240eb908eb62d0a57437e1ac7e28097d31b8af1d616a35a37af97f8dcf9137230cb98e1b6cc33a9f38d36 + "@aws-sdk/credential-provider-node": ^3.535.0 + checksum: fb532eeda1294bcaacefbfe0dc6674189c68a530d491d4cf6685d46d7fa5115184ba0b16c9a1f15014709a78f49d3e04d7f1caaf78fe21a4f9a47b6d67f29db6 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/client-sso@npm:3.521.0" +"@aws-sdk/client-sso@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/client-sso@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 1035c3beb9d090d6f3858be022c66127d246e2b6c88336c808300814628acd18666cb76f6f6dfcf622b3b67dd195a29230602608bea9b40dde54b98079331359 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: baed386827455e43160d4dfccacc382e348729e3b78b01f2a6fb9989c790ac8f9264513a3c963ace39ba5c3e0ffbaf3bf57ea8824ba537c4c1d5486b186d0596 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.521.0, @aws-sdk/client-sts@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/client-sts@npm:3.521.0" +"@aws-sdk/client-sts@npm:3.535.0, @aws-sdk/client-sts@npm:^3.350.0": + version: 3.535.0 + resolution: "@aws-sdk/client-sts@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.521.0 - "@aws-sdk/middleware-host-header": 3.521.0 - "@aws-sdk/middleware-logger": 3.521.0 - "@aws-sdk/middleware-recursion-detection": 3.521.0 - "@aws-sdk/middleware-user-agent": 3.521.0 - "@aws-sdk/region-config-resolver": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@aws-sdk/util-user-agent-browser": 3.521.0 - "@aws-sdk/util-user-agent-node": 3.521.0 - "@smithy/config-resolver": ^2.1.2 - "@smithy/core": ^1.3.3 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/hash-node": ^2.1.2 - "@smithy/invalid-dependency": ^2.1.2 - "@smithy/middleware-content-length": ^2.1.2 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.2 - "@smithy/util-defaults-mode-node": ^2.2.1 - "@smithy/util-endpoints": ^1.1.2 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - "@smithy/util-utf8": ^2.1.1 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.535.0 + checksum: c4be32eb99dbf332a38c3d5ffa02abb3c1cd83b736e29277c309deff981e95895efb124825a44a24e8de3f34711fd018db5f984eedc92e1dc902cf29073f777a + languageName: node + linkType: hard + +"@aws-sdk/core@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/core@npm:3.535.0" + dependencies: + "@smithy/core": ^1.4.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 fast-xml-parser: 4.2.5 - tslib: ^2.5.0 - peerDependencies: - "@aws-sdk/credential-provider-node": ^3.521.0 - checksum: 1ca480532746fa6d81bf84bebf6e38ab3d2565789654465ec22bd8c34daf2c64165a90d70e29da8170da7ba9a18041c3da4a037f37689939798bf39c03348a50 + tslib: ^2.6.2 + checksum: bc14b1db2bdc743c1ab16b48e5df7423d6eeef5a69400c84ea7ce6a6d01a17b940fab199bf84b7d63bbbc252969be79439b67676cccd5fc59ce0a9f89b62b376 languageName: node linkType: hard -"@aws-sdk/core@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/core@npm:3.521.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.535.0" dependencies: - "@smithy/core": ^1.3.3 - "@smithy/protocol-http": ^3.2.0 - "@smithy/signature-v4": ^2.1.1 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 43d02d64563b6fc5c55be1fd62dc67a95b862e8355d9c8d574c09fdc3668f7524723aec7a23ce29a40188d56479cba705dd8470787bebfd30b98c046f3b29606 + "@aws-sdk/client-cognito-identity": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a4a2fff27b24a837af656ade92f75018e263aadd5e3756c8b1d1ced7b1603aae9e124782b38cc4a2a82595381efa1dcf3462c72e4e2a306b92669cd578558f4f languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.521.0" +"@aws-sdk/credential-provider-env@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.535.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: fce4a6b934839cb347fa603eb2c50f70e96e939528d3747492658de98e27d4f412256a40d3b63bb8d983ba81b695c7fff718632bd311c3d74e14194ea4553d95 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: ec7d011051d69643efd26fe7f3767b1301c6e6bdba12640dad542b60efb2b5fe31df01f8137703d814cf857a69485cc928d0de49ab56c5d05f79815dce19bdbf languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.521.0" +"@aws-sdk/credential-provider-http@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 5b217fa1fc86f1d553bab39ac30942e06dddbffe3061cfcafb978f61740749eec9155271ba241df8889c49e73b498a2e4036b384b8b6de8c63da8f5682228d41 + "@aws-sdk/types": 3.535.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-stream": ^2.2.0 + tslib: ^2.6.2 + checksum: a0ddcdf0538aa6a80e8705e21ef0c469d3756c762a3772e8d45b8bea173d5aa0aaf14e7a0c4e963a0530687a5dbd0777dcdaa4a363861de30620c68e752cdad9 languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.521.0" +"@aws-sdk/credential-provider-ini@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/util-stream": ^2.1.2 - tslib: ^2.5.0 - checksum: b953861a460c2c871a390036e6ed5acdfd545e23204c56d2ae7835c46a43a598103175b9071107f9e817b9c386edc98a3b5e677ecc42b313b2d48cea2d11ca8e + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.535.0 + "@aws-sdk/credential-provider-web-identity": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b35d5bfe064ca24a73443976521ac1176fda534d73aea9ffba6fb5a8e879c561e0b95b4b968191ad64976738e8b1f45c9a70072af3c4ba0beff490104f14d6cc languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.521.0" +"@aws-sdk/credential-provider-node@npm:3.535.0, @aws-sdk/credential-provider-node@npm:^3.350.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.535.0" dependencies: - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/credential-provider-env": 3.521.0 - "@aws-sdk/credential-provider-process": 3.521.0 - "@aws-sdk/credential-provider-sso": 3.521.0 - "@aws-sdk/credential-provider-web-identity": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/credential-provider-imds": ^2.2.1 - "@smithy/property-provider": ^2.1.1 - "@smithy/shared-ini-file-loader": ^2.3.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 41c9eda9ec49927999aab9137c46392576b84611c434c369c004eb99fcad212188dcf8dbc3bb9388a65b0077b52835b5219c0f68cfd640c2119772678608fad1 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-http": 3.535.0 + "@aws-sdk/credential-provider-ini": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.535.0 + "@aws-sdk/credential-provider-web-identity": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 79d4cea828e69ce38b7ebc987eae9292aec33520205093289ba0d8166464fb2c7c31a4c76b4c724e100150fd23c71020dda27c6a3a794b2644dcfdc1243e8dc4 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.521.0, @aws-sdk/credential-provider-node@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.521.0" +"@aws-sdk/credential-provider-process@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.535.0" dependencies: - "@aws-sdk/credential-provider-env": 3.521.0 - "@aws-sdk/credential-provider-http": 3.521.0 - "@aws-sdk/credential-provider-ini": 3.521.0 - "@aws-sdk/credential-provider-process": 3.521.0 - "@aws-sdk/credential-provider-sso": 3.521.0 - "@aws-sdk/credential-provider-web-identity": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/credential-provider-imds": ^2.2.1 - "@smithy/property-provider": ^2.1.1 - "@smithy/shared-ini-file-loader": ^2.3.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: eaa75f81151113f84ccd7e26964a139fd598645f93074431ec5979a5ebf926df1da8659ecb46b4d79e4b83de30f7136954ea72fadc60a4e8bc5e828f193b7556 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: af5fad70513e8d0bc10013f220588e45e83d488e0780873d7e76bf5b7099e70c9b4e49b6409d16add64ae212c53a472b12a2178e8bafd7878fdf121d6e2fd112 languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.521.0" +"@aws-sdk/credential-provider-sso@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/shared-ini-file-loader": ^2.3.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 7770461063e9c330331f48401a16d0f792c97c5392b2f393e09f1be6c5ec0f97316c7fa11c2ebfc7392984acced03d5205558b264ed6417697993a9a466185b2 + "@aws-sdk/client-sso": 3.535.0 + "@aws-sdk/token-providers": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 255d1575127b1acc1c4c4281c878a48160ac506d34cd7ff0a3b4a250684a98e1f3637f679368a4171fdf73fd0e29f95f5df21043b7d6f7d64a9f673178949e47 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.521.0" +"@aws-sdk/credential-provider-web-identity@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.535.0" dependencies: - "@aws-sdk/client-sso": 3.521.0 - "@aws-sdk/token-providers": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/shared-ini-file-loader": ^2.3.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 76fbed5935eb4f7cd244f9d90bb5b9f1069226ecaaf03d69f16b4f607864541cc6b8e6d038a07eef27acff75df8f539c3c61d6b672f5bda4db1a1a3966815566 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.521.0" - dependencies: - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 4e9360d0e6a55b7f60d837addb87dbd5d804e4202c2fadc75d11196a54dbb6099fa977fb0a51191d8c62373f17279c379a304b697ddd15abe5508a30c2a34556 + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9aa0c7c14efcdf3238a53237942b40d91a3b1064e4d64ceffb988dd019f7fc94b49f8d5e0ca4271c592e5adfa92be9e54befee57a9dd5476763f174d376628ee languageName: node linkType: hard "@aws-sdk/credential-providers@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/credential-providers@npm:3.521.0" + version: 3.535.0 + resolution: "@aws-sdk/credential-providers@npm:3.535.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.521.0 - "@aws-sdk/client-sso": 3.521.0 - "@aws-sdk/client-sts": 3.521.0 - "@aws-sdk/credential-provider-cognito-identity": 3.521.0 - "@aws-sdk/credential-provider-env": 3.521.0 - "@aws-sdk/credential-provider-http": 3.521.0 - "@aws-sdk/credential-provider-ini": 3.521.0 - "@aws-sdk/credential-provider-node": 3.521.0 - "@aws-sdk/credential-provider-process": 3.521.0 - "@aws-sdk/credential-provider-sso": 3.521.0 - "@aws-sdk/credential-provider-web-identity": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/credential-provider-imds": ^2.2.1 - "@smithy/property-provider": ^2.1.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: c4b3ca40a4e7a9843847f81f0a3f3ac568986e87054e44df8cad8ddf3f8df6314c4e67ca27b150b05cdfe6e96ccca32457654a121b09a9ba017819b9000d534b + "@aws-sdk/client-cognito-identity": 3.535.0 + "@aws-sdk/client-sso": 3.535.0 + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/credential-provider-cognito-identity": 3.535.0 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-http": 3.535.0 + "@aws-sdk/credential-provider-ini": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.535.0 + "@aws-sdk/credential-provider-web-identity": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 4ad4c8fafe621d42125dbac81841986e4e2c88cf065f925d26c5703c4354d9aee2afbb3fa6fb46984fc2d5ebd02783005354fbf53d525bd1389e306897ed0ea4 languageName: node linkType: hard @@ -951,34 +950,34 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.350.0": - version: 3.521.0 - resolution: "@aws-sdk/lib-storage@npm:3.521.0" + version: 3.535.0 + resolution: "@aws-sdk/lib-storage@npm:3.535.0" dependencies: - "@smithy/abort-controller": ^2.1.1 - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/smithy-client": ^2.4.0 + "@smithy/abort-controller": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/smithy-client": ^2.5.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 - tslib: ^2.5.0 + tslib: ^2.6.2 peerDependencies: "@aws-sdk/client-s3": ^3.0.0 - checksum: b55cdbe2744970f863f30e84ba39dc25d123032cf5e7b11a3fb8d6dc0aff7f3311f00112c72b686f4833ff6494c3b1c346cdb03cc5727652933ebd98dc1f8cf7 + checksum: 35fc2db9860acdb4b3e3000c07a2adf7a4e5d3c16ad852f430a9648794d57db2eea12f13fcec834df76e8752013fa971842dfe9633ba626b3abe4f8fb1360af7 languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.521.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-arn-parser": 3.495.0 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - "@smithy/util-config-provider": ^2.2.1 - tslib: ^2.5.0 - checksum: 407ea1c7d64159fa86ccc002333c646b841fa7cbec70400798af3b688418a1f44bea31dac4e462383f9221144b113c9ee33c5e585e1ef9d7d207cb91a2439cc7 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-arn-parser": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + tslib: ^2.6.2 + checksum: d72dfd197dc9aa1ed8ea3de6fb0a18363688fa8e18f6a9d01cb2f425087c5b72aa4bfd0955715c84da86adf9a46029755cff55a02a6ffbf4459009982a5a5415 languageName: node linkType: hard @@ -995,108 +994,108 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.521.0" +"@aws-sdk/middleware-expect-continue@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 28ed930f9e4d9d90d705c371c2ac3055fa1fdb8c6de44d1db899f6ade1231cbe3de7d4f6e7fa7dae41fe0d79d5ee5b068ba8ecaa885dc6a2a6100cc230b0847a + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: fdac9bc59833ca9688155f115f85c31f690df5ef690e9a8921b94b87c4faac3eb3ff10641699822faaaf9a6cc4ce4c67e693a7b4befe8baf8138a9d276d6714d languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.521.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.535.0" dependencies: "@aws-crypto/crc32": 3.0.0 "@aws-crypto/crc32c": 3.0.0 - "@aws-sdk/types": 3.521.0 - "@smithy/is-array-buffer": ^2.1.1 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 60a77546090174ca7cfd8d6894c6d4583ae5ad311f85dc407c1d98128fa16322850a7284a4f75260d4ab5529296110b0952997c1726c325813988c14e2aba792 + "@aws-sdk/types": 3.535.0 + "@smithy/is-array-buffer": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 14c04cd932bdb9029466079b248c1fa8222183de4c288bf12ad661cdc7717938485fdb973b7948da729e5be218573cfd2cbe74b51a1bc2bd27131ca7d67909c1 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.521.0" +"@aws-sdk/middleware-host-header@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: e0e0597f436bce61c9fc2598d65db68610d8a4a8576e2d9073d8ffa0fe3099a76570c997fc9ab46ef18b1530102ef73101db04d28ce0a40f40ca76bf502d8db9 + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 13a22a5b19912a86fe872c9c0f6ba9ab758ba9483ce9a2e73fa68acae498b68404e38e7fc1e3962639a6c3f80ebe19ea5c5340e1024e11ab417998696c8a5dca languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.521.0" +"@aws-sdk/middleware-location-constraint@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 62b8ac417945c826a3042369116250e17b31df2f7f949494320de695985db0801986968503b366965dd0e1beaf25bd37890261dbc2e5fdbf2b0f3cf581ace603 + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 4e89b6c5d4253568e599f0e8be37e80cf12a755ba89b89d9c9ae2ced75213850c41922fa1871a9c92345057e15d5db956a353841eb63353d8f2bb69a61d4a10d languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-logger@npm:3.521.0" +"@aws-sdk/middleware-logger@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-logger@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 9ff749309bd457be1356d3efea53d9067c15baa631d4ba7d874172f087030d4ccbb7df38ccdecb6823944af2732b01caa3cd495a245fa5a4975a5442e2059532 + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: e264d05aa88fadd94d17000b1df79bf1931c5fbc2c871616de9b836bab7254d8c21e0fc2ac509a07af578bd823b795efafaf48daca805bc4493986288ed0c4ab languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.521.0" +"@aws-sdk/middleware-recursion-detection@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: a097d83c411944d30105a997520791d9a16800a4d5b5b8a77ef5dd8edb3616ecf358a669a4c116314bf60d2ab1c23d54f0c1d79a2e2bcfa38b84a5ec3b418b86 + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b6b518243a10dcdcea7c1fd4790cf2e1e0e3d4363ebce51ac364c9b15631a6f3d1db44d00e7c75cbdf1d558a0d868583d6e1853e571e15e23d0d2901f168e2e4 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.521.0" +"@aws-sdk/middleware-sdk-s3@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-arn-parser": 3.495.0 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/protocol-http": ^3.2.0 - "@smithy/signature-v4": ^2.1.1 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/util-config-provider": ^2.2.1 - tslib: ^2.5.0 - checksum: f29d1eed5f3f4de2bb0e85bd572d31f41f494f83f3903edaa45bb79024b6e7cca4bc404a57bb2d69dad58ea1ab92942016a7cd9a5295a54e96851e44a9ce649f + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-arn-parser": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + tslib: ^2.6.2 + checksum: 8a43f4a9b2bd502b377cc1635aa928b2d75b3b326c24168956d73c2cd794b0834578fa514d2148dcb01753909f06b7161f0143db584e995b1ce0b81eb261cc4d languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sqs@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.521.0" +"@aws-sdk/middleware-sdk-sqs@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/util-hex-encoding": ^2.1.1 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 4fcb19c74ce0a667b78fb053b25a4c6c57d84f8eb2167045922a6310d7ecc9def78abe6f2f310ac78327dc41f54347df0497098db00b571cf26029bee7eff1f7 + "@aws-sdk/types": 3.535.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 9822ffdf3d1795de297f7c17f8824f8b2dd5b5319c64c4b6c179a516332e13f43e3b469bc33f324bb33fdfd7e14c5ec4921549916402ed391fd8b2c299060895 languageName: node linkType: hard @@ -1110,42 +1109,42 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-signing@npm:3.521.0" +"@aws-sdk/middleware-signing@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-signing@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/protocol-http": ^3.2.0 - "@smithy/signature-v4": ^2.1.1 - "@smithy/types": ^2.10.0 - "@smithy/util-middleware": ^2.1.2 - tslib: ^2.5.0 - checksum: 545225d39d0e6133f14ca6ac721b78293b7ae2b522d9229f3c4afa00efe5ccd38c2b11a508bbec050f2b91a68f51fe6260db57853e8c28f7f80d09b93ef6120f + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 2070122081660b0be7337feed61f17d93177cff3362f813c32d66080f2f05f5da1b0f6d7a32889a32b1bf1ee4301dd6311028ffb84fed8c7f9b70699880a6058 languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.521.0" +"@aws-sdk/middleware-ssec@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 86b31dcc825d194898dbcc72e9a7590e9693bfbe8d3e0707f7b82814f735dfb73c06f77d68785b061faf173b8a1da6f47f98564602437532c75f8da77f820aca + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 4634dabe8c98c3f625b27b1f9ab50d0c04e72924746f59d8d4037a1e7c1597e484150b3216c5a32b47dc2f4166d9e0242de7daf7895f6446d6200d765e9ab60a languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.521.0" +"@aws-sdk/middleware-user-agent@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@aws-sdk/util-endpoints": 3.521.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 5d1461de4d6d6c7cfd6f7bca9753f3c8340b3bb27638940000d14811ff9a3e63ffecc9c9e4b8784e53a834815d58f902ae9e4a07b60b62d56629359de80fbe6c + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a6ea7871977143aa1ba25e59d7e2b8346c0b2a5cff44d1e6f615513ef6a2da0181044278f4345b34e7ac2c00f4d8a6dc00e7b4512730701bc27db7f2bc5e3597 languageName: node linkType: hard @@ -1193,31 +1192,31 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.521.0" +"@aws-sdk/region-config-resolver@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/types": ^2.10.0 - "@smithy/util-config-provider": ^2.2.1 - "@smithy/util-middleware": ^2.1.2 - tslib: ^2.5.0 - checksum: ce0ec289d6ca59747c1e96dd3b45f11fe690fc2b0407beacadfd07e04258474c2be51a265851ef7bca0feb5f0e7ba6520ee2c5de2b112dff1fbd5c37901e2e72 + "@aws-sdk/types": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 7b556e47c721c0829ae635203a1dbcab7040e2885d2bdc37898eb3139dabb5f6da580b860202e3b7737330bfc02de5084a98ff8f8b5c36adcfe8e076b82d3487 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.521.0" +"@aws-sdk/signature-v4-multi-region@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.535.0" dependencies: - "@aws-sdk/middleware-sdk-s3": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/protocol-http": ^3.2.0 - "@smithy/signature-v4": ^2.1.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 312334438f12927e842d0a5c1d3fd837bedb54bc96caa7a7c0f1168a87532ee1b2e90090a2e1369c28cc0dc4b24c79ae7bf9aca66cbb811b61c8fdda775c4581 + "@aws-sdk/middleware-sdk-s3": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 7ed94a61a4ae29c76ab4ba556c05be26309c33f7f3966ca9a6e0e218f49c32ef6ee5b30d34ca24206605d86f27092bea928aa5435f8aecf1255dd5fc75716dbe languageName: node linkType: hard @@ -1237,17 +1236,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/token-providers@npm:3.521.0" +"@aws-sdk/token-providers@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/token-providers@npm:3.535.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.521.0 - "@aws-sdk/types": 3.521.0 - "@smithy/property-provider": ^2.1.1 - "@smithy/shared-ini-file-loader": ^2.3.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: e34671eaab24dac569d0a98a87b21e2a6ff0960cdc931276f446a31310bff343af33dcf742738a02c9eb8e01226981ab64abd8e59e7758ed695f0045bb524af6 + "@aws-sdk/client-sso-oidc": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 79548a8cd1f2aa0f44104a46d979d215f5422f851e5858e01405500c2aa923bbdddbe8467a41e38fbcef5c587bd9b3fff32587f652e4857bdc9fbf07be52291e languageName: node linkType: hard @@ -1261,13 +1260,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.521.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": - version: 3.521.0 - resolution: "@aws-sdk/types@npm:3.521.0" +"@aws-sdk/types@npm:3.535.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": + version: 3.535.0 + resolution: "@aws-sdk/types@npm:3.535.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 28d9ab39ad19e74ca721100131152bec975cea3c78e5013e70e9684b051c5115623430a923f0e92426b298033be94ebd554925ec4a5fb64273c48df90ea6c6eb + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 3f735c78ea3a6f37d05387286f6d18b0e5deb41442095bd2f7c27b000659962872d1c801fa8484a6ac4b7d2725b2e176dc628c3fa2a903a3141d4be76488d48f languageName: node linkType: hard @@ -1282,12 +1281,12 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.495.0, @aws-sdk/util-arn-parser@npm:^3.310.0": - version: 3.495.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.495.0" +"@aws-sdk/util-arn-parser@npm:3.535.0, @aws-sdk/util-arn-parser@npm:^3.310.0": + version: 3.535.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.535.0" dependencies: - tslib: ^2.5.0 - checksum: 130f1b1c0d2b9917782049693aa4ab6aec98858d6e2b46c14a3a6c4979e65073f731aec96aa0e1c04e927d0b32ad2d4a6a701e2a6d5d416c6ea35e670e4eb987 + tslib: ^2.6.2 + checksum: 0e4c4ea080c7c6da00d359c337a1f9d961eac20c35cebad9cb6bb9b618f981955643990de7bfd6b53c29367a6d33550fe27b2a7539efdff08e01bdd303f0c5c2 languageName: node linkType: hard @@ -1301,15 +1300,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/util-endpoints@npm:3.521.0" +"@aws-sdk/util-endpoints@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-endpoints@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/types": ^2.10.0 - "@smithy/util-endpoints": ^1.1.2 - tslib: ^2.5.0 - checksum: a8f01159d4114a7893200a3a782ccec091da7a46b4de5bb1c4db253ad836de123fbb314c376798044119b49f21b9d3bfd61eecb4328da9a73279719079baba48 + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + "@smithy/util-endpoints": ^1.2.0 + tslib: ^2.6.2 + checksum: 26d70c540cdf2ac29148a1ce06d67511751f356f88d21422ed73a47e8bb1e75571252441e13b3f956351d837788f8ba0fe57cc0d0d0ed0fd04c4636bd3d184eb languageName: node linkType: hard @@ -1361,32 +1360,32 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.521.0" +"@aws-sdk/util-user-agent-browser@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/types": ^2.10.0 + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 bowser: ^2.11.0 - tslib: ^2.5.0 - checksum: 1938f4e00873a3d0ba55988d562fe987352abf6c57fef7c27dc28f561a7752af73d34883eb89eba1173b42b8d31ed0d0a4fc2592b46c28e775545bdb27b0bc80 + tslib: ^2.6.2 + checksum: 148b82900e4b9efd24f5fc4152a8d6010c90eb019517fa3c00c3ac42205055f7611ef3834fb63397def40e600ea20f901177a7dd5b6aefa2aef4208e994f7d90 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.521.0" +"@aws-sdk/util-user-agent-node@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.521.0 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 + "@aws-sdk/types": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: d78a47e32fef990da97635af88484649636bf452320ce80ed6376302d18014f7b191f5da3c096e44aa4f9054639c31c3b2e62d06e7708f747ef7847bad019aa7 + checksum: f214c406fccde14591d1df25fed662e573510cdf1d5829d22e7a93e517ea4a3905acd123eaaeafdb8b217400e8c8e159231d37be02b67307922023996b398f42 languageName: node linkType: hard @@ -1409,13 +1408,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.521.0": - version: 3.521.0 - resolution: "@aws-sdk/xml-builder@npm:3.521.0" +"@aws-sdk/xml-builder@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/xml-builder@npm:3.535.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 33a86fdcf93029706725f829b9cea1846c8c51d0170410e19c75564256cb5825fb4c9e65ecbb7930c5ee14855bb63425b596fc2660978c5724197fee1b09c8f5 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9320f6600c7852b681ed4171f1521eda166321ef7ffea5a6b99a1d328835bb12f7423431ea23a696c678ec4fc8e6dbb2f979d941289f6e0cb55c3da7d5eee140 languageName: node linkType: hard @@ -16259,385 +16258,385 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^2.1.1, @smithy/abort-controller@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/abort-controller@npm:2.1.2" +"@smithy/abort-controller@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/abort-controller@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 0646908e0afce70bc15484bdddff2b862ebdc9566f96e6ff4e0dd7bc430b3c71a503f822786d2fc0f67b109e5c14d58cf29468d43dc2356662f03069c6d41508 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: d0d7fcaa7b67b04c9ad825017110cc294ff06af07f8054ac3b75d8de88ff5fbef1d08f5c1ae672db1839d14ce25f277c459d2b7b7263cbe9e6c3d4518a19230e languageName: node linkType: hard -"@smithy/chunked-blob-reader-native@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/chunked-blob-reader-native@npm:2.1.1" +"@smithy/chunked-blob-reader-native@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/chunked-blob-reader-native@npm:2.2.0" dependencies: - "@smithy/util-base64": ^2.1.1 - tslib: ^2.5.0 - checksum: 82f475b9090e12306292d46b27cca841691a251db5c9b5520830f7e5c947bbe69b497619773b25754dcdd8580620fd3677f478e1325501549f6182d78e95c583 + "@smithy/util-base64": ^2.3.0 + tslib: ^2.6.2 + checksum: ac619f18844e8a8288672c40b8967a82b78f5398119638b3e4fcadf451a3356139307c2d9f24c8c041530238f1ce6e0f90ce82adfcb050d08afefa2f0541c2d0 languageName: node linkType: hard -"@smithy/chunked-blob-reader@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/chunked-blob-reader@npm:2.1.1" +"@smithy/chunked-blob-reader@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/chunked-blob-reader@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: e9d7f6f80fffccb5b615aa4eecf0e48849e625a70a79acc371b74b3d5e6dffed3b0d21d8beafe2e1cc1ebc235b8c24ed7d7e31e8c3565d97efe1238dda82c813 + tslib: ^2.6.2 + checksum: f5acb1e812f97d7c233ccf955557ac10c7e94c8c9610d2fad715d1010fe30ee686a93a5d6e589ce8ae4eb7cf201d5eab61cee5e8646bbebdfa8a5f23693d7a5a languageName: node linkType: hard -"@smithy/config-resolver@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/config-resolver@npm:2.1.2" +"@smithy/config-resolver@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/config-resolver@npm:2.2.0" dependencies: - "@smithy/node-config-provider": ^2.2.2 - "@smithy/types": ^2.10.0 - "@smithy/util-config-provider": ^2.2.1 - "@smithy/util-middleware": ^2.1.2 - tslib: ^2.5.0 - checksum: 20ac9423e416bbb486d1bca247d7a37a2cbffe30c2e292b15c25e411c6cc5af438362ba2aa8e2218e93ef10c7d7fa04873646c4dd82bbcb4df6203efd1f1d3c9 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: dcb15d40faf46c370cd83dfbf1e632fae29c64c500b33b53850a520cfb02c9fa6f7e239c07824793b47645462567d51cb1554c02f9ec4531bd51bc759aede2ed languageName: node linkType: hard -"@smithy/core@npm:^1.3.3": - version: 1.3.3 - resolution: "@smithy/core@npm:1.3.3" +"@smithy/core@npm:^1.4.0": + version: 1.4.0 + resolution: "@smithy/core@npm:1.4.0" dependencies: - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-retry": ^2.1.2 - "@smithy/middleware-serde": ^2.1.2 - "@smithy/protocol-http": ^3.2.0 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/util-middleware": ^2.1.2 - tslib: ^2.5.0 - checksum: bb8a79f51517049064f1b5fb2233b9410d8c6dfeafa2ecda31b9d5326f05ffa4773c38ec72d90b380366e8a9b4c21b93231aaadce262c0d87989904950358cd3 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 3fbec263e4b40af33be38a7555167e30f0e1f2bec27635ae75ace8f80c53cd9c474fc9b73f856b308f7da08db9281d7d31b2b51781611278bfe4164512882a7e languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^2.2.1, @smithy/credential-provider-imds@npm:^2.2.2": - version: 2.2.2 - resolution: "@smithy/credential-provider-imds@npm:2.2.2" +"@smithy/credential-provider-imds@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/credential-provider-imds@npm:2.3.0" dependencies: - "@smithy/node-config-provider": ^2.2.2 - "@smithy/property-provider": ^2.1.2 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - tslib: ^2.5.0 - checksum: 85cc9a6e2c52a8f47c0db3dd11c31ff550e5ddd0f6d1917169e22fbf242bb5a5c05bc426da5d04bce79cf0633d0c645e83ca02d42e243f3b40c2ace07aeb1b56 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + tslib: ^2.6.2 + checksum: dd57e09e60bd51ed103f7a5363a43e1373470ea3cee04ace66f5bbaafab005355ffbfa3e137e2ecac34aa28911fb5b6ecac60845846c6a4a5432f3e57a74b837 languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^2.1.1, @smithy/eventstream-codec@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/eventstream-codec@npm:2.1.2" +"@smithy/eventstream-codec@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-codec@npm:2.2.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@smithy/types": ^2.10.0 - "@smithy/util-hex-encoding": ^2.1.1 - tslib: ^2.5.0 - checksum: ea455826916906a480c7abc517ceb043b578a95994842f802f71e409c45a5575a4f337c376c0c371055371bebafb81119a044cdb4c7de057304e6b1c0527d1d9 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + tslib: ^2.6.2 + checksum: ae59067964e19c6728b1be74a6e19793e4d3decdcbcea546bd40f77c3cc1eacc48c30272ef68927ba477c2b6450d023474f2dec516dfd93e204150ba18cab697 languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/eventstream-serde-browser@npm:2.1.2" +"@smithy/eventstream-serde-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-browser@npm:2.2.0" dependencies: - "@smithy/eventstream-serde-universal": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 855118cd6ffc99a05d4950a01af23f727599e7fb127323d508b935617005e3d0e45cf1025fe7ba5079d9def82c73dc8d3e703c36f4b71288fd945c1433b41777 + "@smithy/eventstream-serde-universal": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: c00bd592365f42ddafcad83f06d3c85ce8ee21bd806de903043ef132de9acca8bf1592ed811b11daba1742332928fc73a66c9032b06df2f6526da0339918f8d5 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/eventstream-serde-config-resolver@npm:2.1.2" +"@smithy/eventstream-serde-config-resolver@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-config-resolver@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 397d91a492948bced849c5a90422ff6a2d49d4d300ec9fff09eea7256931402966d0285e8fd33a2df3745c10ff5dc88bbfafbf0ce53f0858371d02e7057fd033 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a35dbcbc14ad1825ce22a9e7daac93067d8ade6173a3ce33b819eed61390f8d93ea63b70945f6d1bced175fad58def3d09a14ee3043c63a798ecef407b2d1701 languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/eventstream-serde-node@npm:2.1.2" +"@smithy/eventstream-serde-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-node@npm:2.2.0" dependencies: - "@smithy/eventstream-serde-universal": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 56a65908d8ac07fd72dfa06a4709972c997a10696c0850de398804590fcc33144afbe1aa70b80ce7d98f6003dffa2b0f5d29228586fb2cb0f076b3d4c03ed20a + "@smithy/eventstream-serde-universal": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1d4971b99654c4672716608a63e668ccefd78cc1806c0ea4df5c3cc0ca0208b7647f7914d2c77a37d0a29b31b66cff660ce2ab2f46f56d997c9a58ea6b6241b2 languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/eventstream-serde-universal@npm:2.1.2" +"@smithy/eventstream-serde-universal@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-universal@npm:2.2.0" dependencies: - "@smithy/eventstream-codec": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 693be21ef300c26f638fd7f9b9b36652aff319d7316893a661f32a5f1f29369bc216eb6f1d9c80d5e42473ccdd83e332163a8c9fce012c08df4305a52dea09c7 + "@smithy/eventstream-codec": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: c28038c2f57deed7b5e0e5f8ab8150d4a7947f2971241da96ef1d53b45d83dfa661717065f059099c420ee66ae2455818ae124bb8601b609558040d4a7509227 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^2.4.2": - version: 2.4.2 - resolution: "@smithy/fetch-http-handler@npm:2.4.2" +"@smithy/fetch-http-handler@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/fetch-http-handler@npm:2.5.0" dependencies: - "@smithy/protocol-http": ^3.2.0 - "@smithy/querystring-builder": ^2.1.2 - "@smithy/types": ^2.10.0 - "@smithy/util-base64": ^2.1.1 - tslib: ^2.5.0 - checksum: 7d87d5c6674623250972ac673a3317eeaeeba0647d8095c92e63ec9a002e96bb56dd7aa75172e474e226a4971f2abbd2506025cb1bf131d3b45698dbff27220d + "@smithy/protocol-http": ^3.3.0 + "@smithy/querystring-builder": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-base64": ^2.3.0 + tslib: ^2.6.2 + checksum: 91a58ac32c6b4afc6d7fb2b9ac3e3b817171f76e09b013a6506308b044455054444a92e1acbd8f98bdd159b15fdd44b1e3fb52c21cbb2e69be8e3698d2206021 languageName: node linkType: hard -"@smithy/hash-blob-browser@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/hash-blob-browser@npm:2.1.2" +"@smithy/hash-blob-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-blob-browser@npm:2.2.0" dependencies: - "@smithy/chunked-blob-reader": ^2.1.1 - "@smithy/chunked-blob-reader-native": ^2.1.1 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: e8d9fcedcfd03d03603753d6e4aafd7ad7c26e9ed629bf54a8dbb2ecd14b9e29cd267209453479eab698cb19329bfc80632823b40f49cb6d8b949aa4cb6db7c4 + "@smithy/chunked-blob-reader": ^2.2.0 + "@smithy/chunked-blob-reader-native": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1b748b4449ccee723c8b47a412491283fa7b5a2a6c27b0b73e03d905c2af70b56b74d63a658d8ef0bd330cc4617bc11431c86e24a4932b4722aad08e1b25e576 languageName: node linkType: hard -"@smithy/hash-node@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/hash-node@npm:2.1.2" +"@smithy/hash-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-node@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - "@smithy/util-buffer-from": ^2.1.1 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 2f4fe6120a177afbc540c0ba904a3285a0b81de576a57bb28dbee94186635ab585034e7f48eeff0950d3a6442f5fd932cd66c366199c42f4314a540d02261eba + "@smithy/types": ^2.12.0 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 3305b5778fa99558375b16629ad98fd00a1fb33ea905037977b0a7c93d92c8de1481756ef7dbc004e45210b23f983dec04bcd13d43c98f36a5f47291cbed9d89 languageName: node linkType: hard -"@smithy/hash-stream-node@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/hash-stream-node@npm:2.1.2" +"@smithy/hash-stream-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-stream-node@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 5a1a4d4fff29a4ba048900c606c98baeac0daabbaeba77c0c5b603d5896eff7f1eba2b012d41344638ce3d7fe10cb7d8d88551d34f1c637e807adb61efe3f43e + "@smithy/types": ^2.12.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 191d76fd1df705c32d24463794f8b8b391061c7ca7265591cd4f070259fa80395c2f115fd3d37f6bb3a4a2303b3811a31509ea767d0c3d0a9644789ae8283118 languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/invalid-dependency@npm:2.1.2" +"@smithy/invalid-dependency@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/invalid-dependency@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 5f5ce3d408c67c3e8b80c7dbc3504662c437ded360c360f072ed731c0bae6b57386ba37dc059883dfe7d23711680a5119a68e05b3ea6ccc7fc124cf0e6f90024 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: ed17980ccdf4c564cfcb517f3959dfeb7c7dbddd76eaf2c9e10031ebd19e78e56609df3377626215e51a6c4b98db03cfa88ad46f15ba26bb55c34351f3182a98 languageName: node linkType: hard -"@smithy/is-array-buffer@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/is-array-buffer@npm:2.1.1" +"@smithy/is-array-buffer@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/is-array-buffer@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: 5dbf9ed59715c871321d0624e3842340c1d662d2e8b78313d1658d39eb793b3ac5c379d573eba0a2ca3add9b313848d4d93fd04bb8565c75fbab749928b239a6 + tslib: ^2.6.2 + checksum: cd12c2e27884fec89ca8966d33c9dc34d3234efe89b33a9b309c61ebcde463e6f15f6a02d31d4fddbfd6e5904743524ca5b95021b517b98fe10957c2da0cd5fc languageName: node linkType: hard -"@smithy/md5-js@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/md5-js@npm:2.1.2" +"@smithy/md5-js@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/md5-js@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: c6e4bdb779e9af5146e502d1e0d757e09a991b70e39fdb089efbcb8e511761942330034b215b66814c3627b0b0bb7bd028d0f26e8558b0ec5b2ea07c46b5f4e5 + "@smithy/types": ^2.12.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: ae343c198a8d8c6689bcb1d7f766e29578d370e8d79180db9b6183b5c74ac091829e8abe3053df0589f53324c01a79c7f9e889e5cd92094e3b5c4be96fb7b970 languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/middleware-content-length@npm:2.1.2" +"@smithy/middleware-content-length@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-content-length@npm:2.2.0" dependencies: - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: ddea93b236e5f916da8e1574317967d5aa449e78b0c7153c60c821d117f1648b00effad5301095919de9225810cd8f90f8ee76e7b95c346fc616d8598ad54447 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1eae8d2b6f432ce9a849e741d4f2426baee8a51f22a5262c11802e125078ee33d9d8f4183fb142043ba9d1371adad9c835c784333a394d865fb248339f7482e6 languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^2.4.2": - version: 2.4.2 - resolution: "@smithy/middleware-endpoint@npm:2.4.2" +"@smithy/middleware-endpoint@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/middleware-endpoint@npm:2.5.0" dependencies: - "@smithy/middleware-serde": ^2.1.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/shared-ini-file-loader": ^2.3.2 - "@smithy/types": ^2.10.0 - "@smithy/url-parser": ^2.1.2 - "@smithy/util-middleware": ^2.1.2 - tslib: ^2.5.0 - checksum: 3e989123fc608c9a32abf30c4033718b3da665a63bd84e8e2869d4aecb0545d461506e75f82b91bbc35a07915ddadf1432643e4c937c11447847a9a45b3de9fa + "@smithy/middleware-serde": ^2.3.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 1243567c611d33995dcfb48b5468fbe636db7c2303abafd6a311e6350926f6960c08b58cd5d2133e58b3e13b21f765b281b78b78d14b21092b8bb7cf12de0e76 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/middleware-retry@npm:2.1.2" +"@smithy/middleware-retry@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-retry@npm:2.2.0" dependencies: - "@smithy/node-config-provider": ^2.2.2 - "@smithy/protocol-http": ^3.2.0 - "@smithy/service-error-classification": ^2.1.2 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/util-middleware": ^2.1.2 - "@smithy/util-retry": ^2.1.2 - tslib: ^2.5.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/service-error-classification": ^2.1.5 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + tslib: ^2.6.2 uuid: ^8.3.2 - checksum: ec04fd0c362070529ecd52f2dadd6fd4d638a4e35c62a67309791f1a288550ee8fcd6406ec27fea78d3c89b08a9c6d29ce63bf7cb5a1b0269f86a759b233dac4 + checksum: f0f0ec06b798a0323168b151caf6b1b54078a0e71da6115dfe1b6465873dcde2689216a3aa12d7eea19f651f2883a2e4ed2ee529f7fcc18979ac378b10f8b3ac languageName: node linkType: hard -"@smithy/middleware-serde@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/middleware-serde@npm:2.1.2" +"@smithy/middleware-serde@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/middleware-serde@npm:2.3.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 4f5bd5ee173cf20cd1c12838b0802f96df5a14c3bdab2d50a6009965c128596863c095633958f0c74d82bca3cc9343f8a4c659c033b9a75e614e3a85e34e0665 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5393370c0f8a820d8ca36eccecff5b6434c4f81fbaad8800088fb4c8dad5312bf3eb47f67533784de959807bbb3379c23d81a1bcbaf8824254034dd2b83fd76b languageName: node linkType: hard -"@smithy/middleware-stack@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/middleware-stack@npm:2.1.2" +"@smithy/middleware-stack@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-stack@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: f93dda40f08051a6391e213cc3b90f30ebb31399b000bba882cbf37f942786030822e10ccfe576005361ef6341b571460ce791fbdc7dad971c99a33a92e400dd + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 293d76764e327a5ada4ea7de268f451e62a6a56983ba7dcdbc63fdbb0427c01071a9a81d7807b16586977df829ce5d9587facbd9367b089841bbc9fc329ce6af languageName: node linkType: hard -"@smithy/node-config-provider@npm:^2.2.2": - version: 2.2.2 - resolution: "@smithy/node-config-provider@npm:2.2.2" +"@smithy/node-config-provider@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/node-config-provider@npm:2.3.0" dependencies: - "@smithy/property-provider": ^2.1.2 - "@smithy/shared-ini-file-loader": ^2.3.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 666d80d893985e6af5aa88a2f3ed07bd68c6873805974331fd148ec5a5d331e5116e2dca8656ef57c60e22cec03aee0717061a03ce703a691765bf94d809f2eb + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9c1dc6d97e0379d947498e7d64e593ea183d5f2c89dace4561c1c613850bf264581b597105c15d64ceabdea954e57ad8e6bf9e42642ddc3f737464f350ffbb5b languageName: node linkType: hard -"@smithy/node-http-handler@npm:^2.1.7, @smithy/node-http-handler@npm:^2.4.0": +"@smithy/node-http-handler@npm:^2.1.7, @smithy/node-http-handler@npm:^2.5.0": + 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/property-provider@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/property-provider@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 8d257cbc5222baf6706e288c3b51196588f135878141f8af76fcb3f0abafc027ed46cf4bb938266d1906111175082ee85f73806d5a2b1c929aee16ec8b5283e6 + 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/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-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/querystring-parser@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9b27751c329fecc84bdfe7f128ab766c7e5f1d4bdda6184699a0df8999e95aef21fafc6179d6c693e519c78874e738fd9afb5ac4679901cb68d092a86a612419 + languageName: node + linkType: hard + +"@smithy/service-error-classification@npm:^2.1.5": + version: 2.1.5 + resolution: "@smithy/service-error-classification@npm:2.1.5" + dependencies: + "@smithy/types": ^2.12.0 + checksum: 00ac54110a258c7a47c62d4f655d4998bd40e5adb47e10281b28df7a585f2f1e960dc35325eac006636280e7fb2b81dbeb32b89e08bac87acc136c4d29a4dc53 + languageName: node + linkType: hard + +"@smithy/shared-ini-file-loader@npm:^2.4.0": version: 2.4.0 - resolution: "@smithy/node-http-handler@npm:2.4.0" + resolution: "@smithy/shared-ini-file-loader@npm:2.4.0" dependencies: - "@smithy/abort-controller": ^2.1.2 - "@smithy/protocol-http": ^3.2.0 - "@smithy/querystring-builder": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: f4f4171b9b527d142752e2bcf2fc2cc86924bf4f807c435dd8decfdeef88667fd2bba5bb2ed8459f94f0373793aeecfa57960527ffc2ac1a4c71d424f7e7a64b + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b0c9e045bfe2150e07f4b31ae7d69d3646679337df9fec1e1201b845cc64ea2250c37db8e8d0e7573fc3c11188164adba43bbaf32275fa8a9f70e8bbc77146bf languageName: node linkType: hard -"@smithy/property-provider@npm:^2.1.1, @smithy/property-provider@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/property-provider@npm:2.1.2" +"@smithy/signature-v4@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/signature-v4@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: df2b72912ede1843a75220a458e3ff8ec70e5544c990c0915e615507380cea4c28bb39b425b7ee600f5c3c90d53b5c82ceaf14d641348f465c14640c556ac9bd + "@smithy/eventstream-codec": ^2.2.0 + "@smithy/is-array-buffer": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-uri-escape": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: c25b35545978f507d28df6742ac6e8c703cf7c45938fd3304ce29fee11f05b05a9cf2693eeda44ba4ce1b9deaeb995c41da9dfb752f55a1ae04f247336477fdd languageName: node linkType: hard -"@smithy/protocol-http@npm:^3.2.0": - version: 3.2.0 - resolution: "@smithy/protocol-http@npm:3.2.0" +"@smithy/smithy-client@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/smithy-client@npm:2.5.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: a2082228ea933734795db27b3d5c893f31fa6c80154ddb3b8cce46494fb429088f636db202a482fb67686908fd829d20adc04c1786f09e8c67b9835c6eb1a918 - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/querystring-builder@npm:2.1.2" - dependencies: - "@smithy/types": ^2.10.0 - "@smithy/util-uri-escape": ^2.1.1 - tslib: ^2.5.0 - checksum: 480bfc64d5beb6da9c0ecdcd6cb0961cf5afa30c5188b32e3a70608e8f5205d6dc56b13e854b5f541dfdb78b9d9e88a349ec6fc5db8f8d00f11ad137e0b81085 - languageName: node - linkType: hard - -"@smithy/querystring-parser@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/querystring-parser@npm:2.1.2" - dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 02a1e3a31b37b59adb162d3a2cb084852c2ea01dec948b0669939e77241b05fd7f5b00734418b925248f0b6c164bc483e897438cb2b1a750829f6b4aab0fa8d1 - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/service-error-classification@npm:2.1.2" - dependencies: - "@smithy/types": ^2.10.0 - checksum: 8a26f553fd2a823179b701f87c0952e58580c9297166e608a036c7b313d5cc1399bc8b4b056b038003aedc0145643c6c6323e7f683b1a2d1140d9a7982e6bf7c - languageName: node - linkType: hard - -"@smithy/shared-ini-file-loader@npm:^2.3.1, @smithy/shared-ini-file-loader@npm:^2.3.2": - version: 2.3.2 - resolution: "@smithy/shared-ini-file-loader@npm:2.3.2" - dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 6db5ac83a76a15f3bf49496747ef4d20343e87a4de35b87892c5ac5c69a7046ffe7276230a4e9cbc075183d8b0584f1530a878f58324279cf936103c578aa70a - languageName: node - linkType: hard - -"@smithy/signature-v4@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/signature-v4@npm:2.1.1" - dependencies: - "@smithy/eventstream-codec": ^2.1.1 - "@smithy/is-array-buffer": ^2.1.1 - "@smithy/types": ^2.9.1 - "@smithy/util-hex-encoding": ^2.1.1 - "@smithy/util-middleware": ^2.1.1 - "@smithy/util-uri-escape": ^2.1.1 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: fa3d4728b0bcf98e606a6e13a47f91efc6eb9edb6925ba48c3b9cecdf8170adf27e28a0684dabe385e8a7379d0743f52b19cd9a1a01884cd0f75c048c4324fd2 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^2.4.0": - version: 2.4.0 - resolution: "@smithy/smithy-client@npm:2.4.0" - dependencies: - "@smithy/middleware-endpoint": ^2.4.2 - "@smithy/middleware-stack": ^2.1.2 - "@smithy/protocol-http": ^3.2.0 - "@smithy/types": ^2.10.0 - "@smithy/util-stream": ^2.1.2 - tslib: ^2.5.0 - checksum: af17a6334e0b19323145482d829b664fcc3102cfbea9682753b9bc328840b9bc1968cd3cf64677cdc23c824194061f8fdf3a905d6f71431547a4ec413d557f92 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-stream": ^2.2.0 + tslib: ^2.6.2 + checksum: 37a26dd19bc413cd8132c8585588031a25984c24c475db47bae02476e05f698f17511947fc47b89c4ed4f10a29046ba3542d6d338428aeff35e1178a9ecc7a47 languageName: node linkType: hard @@ -16650,185 +16649,186 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^2.10.0, @smithy/types@npm:^2.9.1": - version: 2.10.0 - resolution: "@smithy/types@npm:2.10.0" +"@smithy/types@npm:^2.12.0": + version: 2.12.0 + resolution: "@smithy/types@npm:2.12.0" dependencies: - tslib: ^2.5.0 - checksum: f353ff0d8f91454288585c7e03485c698af70d46490856abe21d1e2f2154f704a68599328297a1151c1585cd5b0f80a83c759f6d8e02ab168ce616e33cba18c4 + tslib: ^2.6.2 + checksum: 2dd93746624d87afbf51c22116fc69f82e95004b78cf681c4a283d908155c22a2b7a3afbd64a3aff7deefb6619276f186e212422ad200df3b42c32ef5330374e languageName: node linkType: hard -"@smithy/url-parser@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/url-parser@npm:2.1.2" +"@smithy/url-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/url-parser@npm:2.2.0" dependencies: - "@smithy/querystring-parser": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 83aca5a6474e85d835958caed5b486d5e6438682e6c17a5817ebda48ec9936c68b7b39c35a050f7eb4bd3902e83d8008b26d9fc5df7a168502d6ed93848005c6 + "@smithy/querystring-parser": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: f21f1e44bc2a4634220465990651f5ee0708cb6759b3685b8a8c00cc2cd64bbbc7807f66cd79ec6e654f7245867d4fb4ced406ad5c14612ebc47eae3f34e63c5 languageName: node linkType: hard -"@smithy/util-base64@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-base64@npm:2.1.1" +"@smithy/util-base64@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-base64@npm:2.3.0" dependencies: - "@smithy/util-buffer-from": ^2.1.1 - tslib: ^2.5.0 - checksum: 6dbb93b8745798d56476d37c99dc9f53fe5fc29329b8161fc9e5c55c5a3062916b3e5e4dd596541b248979eefa550d8da7fbb6ab254bf069cb4c920aea6c3590 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 2ce995c5d12037e9518bb2732f24090bc493d48118dfd6519faa41e19cd91863895bc0b5958b790d2cdeb919a8c410790dcffa3a452d560f0eeab73dc0c92cbd languageName: node linkType: hard -"@smithy/util-body-length-browser@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-body-length-browser@npm:2.1.1" +"@smithy/util-body-length-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-body-length-browser@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: 6f7808a41b57a5ab1334f0d036ecec6809a959bcfe6a200f985f35e0c96e72f34fdcb6154873f795835d1d927098055e2dec31ebfb5e5382d1c4c612c80a37c0 + tslib: ^2.6.2 + checksum: e9c1d16b3b95d529011476e6154eaf282d3a983204b29dcf1e7ef04a9f5c2deae30167e06190f315771c813c768f19f486d3139fe9fcaf34d12c2333350f3412 languageName: node linkType: hard -"@smithy/util-body-length-node@npm:^2.2.1": - version: 2.2.1 - resolution: "@smithy/util-body-length-node@npm:2.2.1" +"@smithy/util-body-length-node@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-body-length-node@npm:2.3.0" dependencies: - tslib: ^2.5.0 - checksum: 6bddc6fac7c9875ae7baaf6088d91192fbe4405bc5c1b69100d52aa1bfebabcc194f5f1b159d8f6f3ade3b54e416f185781970c30a97d4b0a7cec6d02fc490c4 + tslib: ^2.6.2 + checksum: 5d5c31b071e0b3222dcfe863ea2d179253f0dfaa30d03f40ebfa352ed292e00a451053cc523e27527e61094d5ed475069d2287ef19a857c6da0364ca71cfdf3c languageName: node linkType: hard -"@smithy/util-buffer-from@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-buffer-from@npm:2.1.1" +"@smithy/util-buffer-from@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-buffer-from@npm:2.2.0" dependencies: - "@smithy/is-array-buffer": ^2.1.1 - tslib: ^2.5.0 - checksum: 8dc7f9afaa356696f14a80cd983a750cbad8eba7c46498ed74fb8ec0cb307f14df64fb10ceb30b2d4792395bb8b216c89155a93dee0f2b3e5cab94fef459a195 + "@smithy/is-array-buffer": ^2.2.0 + tslib: ^2.6.2 + checksum: 424c5b7368ae5880a8f2732e298d17879a19ca925f24ca45e1c6c005f717bb15b76eb28174d308d81631ad457ea0088aab0fd3255dd42f45a535c81944ad64d3 languageName: node linkType: hard -"@smithy/util-config-provider@npm:^2.2.1": - version: 2.2.1 - resolution: "@smithy/util-config-provider@npm:2.2.1" +"@smithy/util-config-provider@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-config-provider@npm:2.3.0" dependencies: - tslib: ^2.5.0 - checksum: f5b34bcf6ef944779f20d7639070e87a521e1a5620e5a91f2d2dbd764824985930a68b71b0b2bde12e1eaac947155789b73a8c09c1aa7ab923f08e42a4173ef4 + tslib: ^2.6.2 + checksum: 0f3f113c2658bd5a79f98dc28d53ca9c0adf8ec3c8c86c7dd91d2cd37149b4cf83d85cc89d5fe67ffe5cd319ec85f139ef229844eb039017193b307a4c315399 languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/util-defaults-mode-browser@npm:2.1.2" +"@smithy/util-defaults-mode-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-defaults-mode-browser@npm:2.2.0" dependencies: - "@smithy/property-provider": ^2.1.2 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 bowser: ^2.11.0 - tslib: ^2.5.0 - checksum: bc0621f1d5ca46830a4b525def4b829e23336707af28e305758de7f97170024f387a9f3d73e2e29b033ea4963466373df644a304a87291c980159b31cf5ffbcf + tslib: ^2.6.2 + checksum: 4e9d40de4badac66bf786ff3e5bd795e6ccd99f078da5b74881570b0d1401df07441fb9c5abc04dd0735e3efd4f30ee3355f034d42939c1d16015bd7ec65e9b7 languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^2.2.1": - version: 2.2.1 - resolution: "@smithy/util-defaults-mode-node@npm:2.2.1" +"@smithy/util-defaults-mode-node@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-defaults-mode-node@npm:2.3.0" dependencies: - "@smithy/config-resolver": ^2.1.2 - "@smithy/credential-provider-imds": ^2.2.2 - "@smithy/node-config-provider": ^2.2.2 - "@smithy/property-provider": ^2.1.2 - "@smithy/smithy-client": ^2.4.0 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 672c13329e37d61170fb6c997b416fe9216efb6308b2e15560f5a96089bd839018d4705fb541aed0717dd1e1574e3dfc835f37a9608679713ee679d1d7c17642 + "@smithy/config-resolver": ^2.2.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: d7dc243ec364b2b246dbeb096b305c4aaa8b95950c7cd716a5dcf69b70255ae06595009f944924589ae798fb4cb2638a814252daf0d843980cb3facf99086836 languageName: node linkType: hard -"@smithy/util-endpoints@npm:^1.1.2": - version: 1.1.2 - resolution: "@smithy/util-endpoints@npm:1.1.2" +"@smithy/util-endpoints@npm:^1.2.0": + version: 1.2.0 + resolution: "@smithy/util-endpoints@npm:1.2.0" dependencies: - "@smithy/node-config-provider": ^2.2.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 261f383e64116f767cc8e304a647c47261fee8425c43e517511e1bf8ec5e72652b8a12c65259ca4557f3fba477662606253d4cf89ccab5af184a05c59d2d735f + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 19a59b1c9b214457371d4d7109b190c237de5ebd06f5b4f3665dddc5fe0879dbb19bcdc5dec23d1825cd04388b7f9bf7fddf354e1a23e84d9c690ad21e71cb86 languageName: node linkType: hard -"@smithy/util-hex-encoding@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-hex-encoding@npm:2.1.1" +"@smithy/util-hex-encoding@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-hex-encoding@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: eae5c94fd4d57dccbae5ad4d7684787b1e9b1df944cf9fcb497cbefaed6aec49c0a777cc1ea4d10fa7002b82f0b73b8830ae2efe98ed35a62dcf3c4f7d08a4cd + tslib: ^2.6.2 + checksum: 7d14589bc4a44eebf878595290c53ee4d90cc6b5445b5fe130608d6dea477c292730b85e4e08190a1555ef7664214f0f00dc478ba725516787a49fff658e725e languageName: node linkType: hard -"@smithy/util-middleware@npm:^2.1.1, @smithy/util-middleware@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/util-middleware@npm:2.1.2" +"@smithy/util-middleware@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-middleware@npm:2.2.0" dependencies: - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 8a05c05ba1358515aa6881189cd4a6a57701e8cd9e036c8d7219662fd12bce1695a4970c247314e0020f13bb506a558545ab5c519373647be89d79af08d5bcdf + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 312dc86e5415a12e2580a02311750b350aec8fb9da5a60c3010c10694990ded869b7ca5b87aa20e5facbacdd233e928e418b7765d7797019cd48177052aedd03 languageName: node linkType: hard -"@smithy/util-retry@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/util-retry@npm:2.1.2" +"@smithy/util-retry@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-retry@npm:2.2.0" dependencies: - "@smithy/service-error-classification": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 3be4b984b0f1daa54948fe158568a41003f725464ef32f0ccf32e02b566545364bd6f89a380a218397742edd1ad1d214906fab27debce531c137bfceca0c9c6d + "@smithy/service-error-classification": ^2.1.5 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1a8071c8ac5a2646b3d3894e3bd9c36a9db045f52eadb194f32b02d2fdedd69fb267a2b02bcef9f91d0f8f3fe061754ac075d07ac166d90894acb27d68c62a41 languageName: node linkType: hard -"@smithy/util-stream@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/util-stream@npm:2.1.2" +"@smithy/util-stream@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-stream@npm:2.2.0" dependencies: - "@smithy/fetch-http-handler": ^2.4.2 - "@smithy/node-http-handler": ^2.4.0 - "@smithy/types": ^2.10.0 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-buffer-from": ^2.1.1 - "@smithy/util-hex-encoding": ^2.1.1 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 8b95535323fcf3ce86cbb070791405afd4de1513a38fef209bfc4d5b2ed91ae16ae40393dd8a5f8b127194ec023cc264808f87beef0678219f56b2bcb580eb65 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: f0febd1a7558201d9178c0018478f89729800e9b8962dc735ec99f41ce01d1128373e3bd6008f0b4ff79b25ee4476db4fd5fa18d6feeb8b5b715d416da7027c3 languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-uri-escape@npm:2.1.1" +"@smithy/util-uri-escape@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-uri-escape@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: 822ed7390e28d5c7b8dab5e5c5a8de998e0778220137962a71b47b2d8900289d48a3a2c9945e68e1cac921d43f61660045e7fdffe8df9e63004575fcf2aa99b2 + tslib: ^2.6.2 + checksum: bade35312d75d1c84226f2a81b70dfef91766c02ecb6c6854b6f920cddb423e01963f7d0c183d523b5991f8e7ca93bcf73f8b3c6923979152b8350c9f3c24fd6 languageName: node linkType: hard -"@smithy/util-utf8@npm:^2.0.0, @smithy/util-utf8@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-utf8@npm:2.1.1" +"@smithy/util-utf8@npm:^2.0.0, @smithy/util-utf8@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-utf8@npm:2.3.0" dependencies: - "@smithy/util-buffer-from": ^2.1.1 - tslib: ^2.5.0 - checksum: 286ce5cba3f45a8abd3d6c28e40b3204dd64300340818d77e42c1cbb0c2f6ad0c42f0e47ffaf38d74d0895b0dfd1750c5b55222ab4d205a3b39da4325971d303 + "@smithy/util-buffer-from": ^2.2.0 + tslib: ^2.6.2 + checksum: 00e55d4b4e37d48be0eef3599082402b933c52a1407fed7e8e8ad76d94d81a0b30b8bfaf2047c59d9c3af31e5f20e7a8c959cb7ae270f894255e05a2229964f0 languageName: node linkType: hard -"@smithy/util-waiter@npm:^2.1.2": - version: 2.1.2 - resolution: "@smithy/util-waiter@npm:2.1.2" +"@smithy/util-waiter@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-waiter@npm:2.2.0" dependencies: - "@smithy/abort-controller": ^2.1.2 - "@smithy/types": ^2.10.0 - tslib: ^2.5.0 - checksum: 089e777701ff2d6d8910f843c73de0d504221064401a02e56f104b5a50c66abfe8c8fa41c9e9ec62c8b6088f234cd995afccd9e2220fa7b7c8fcbf67fe343062 + "@smithy/abort-controller": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 303f56beb9ba4afada862eff4950a17d904a4fdfc01bd8acb932b0457e457730981162777004414252e700014c554d894a1ce9d32e0bad75e1a4a2ca6492429e languageName: node linkType: hard From 2302031125c9104033e4c914fe6288b3f0bdb253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 16 Mar 2024 12:57:01 +0100 Subject: [PATCH 136/219] add vite to the dev deps of the cli to make it build standalone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/cli/package.json | 6 +++++- yarn.lock | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 1af0ef03b7..1b86bd9a75 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -168,10 +168,14 @@ "@types/tar": "^6.1.1", "@types/terser-webpack-plugin": "^5.0.4", "@types/yarnpkg__lockfile": "^1.1.4", + "@vitejs/plugin-react": "^4.0.4", "del": "^7.0.0", "msw": "^1.0.0", "nodemon": "^3.0.1", - "ts-node": "^10.0.0" + "ts-node": "^10.0.0", + "vite": "^4.4.9", + "vite-plugin-html": "^3.2.0", + "vite-plugin-node-polyfills": "^0.21.0" }, "peerDependencies": { "@vitejs/plugin-react": "^4.0.4", diff --git a/yarn.lock b/yarn.lock index 5c42feef7e..33bbe2965a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3642,6 +3642,7 @@ __metadata: "@types/yarnpkg__lockfile": ^1.1.4 "@typescript-eslint/eslint-plugin": ^6.12.0 "@typescript-eslint/parser": ^6.7.2 + "@vitejs/plugin-react": ^4.0.4 "@yarnpkg/lockfile": ^1.1.0 "@yarnpkg/parsers": ^3.0.0-rc.4 bfj: ^8.0.0 @@ -3713,6 +3714,9 @@ __metadata: ts-node: ^10.0.0 tsx: ^4.0.0 util: ^0.12.3 + vite: ^4.4.9 + vite-plugin-html: ^3.2.0 + vite-plugin-node-polyfills: ^0.21.0 webpack: ^5.70.0 webpack-dev-server: ^4.7.3 webpack-node-externals: ^3.0.0 From 9853d254e4c26986a9f1b360bfa5a2616a50d043 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 12:15:22 +0000 Subject: [PATCH 137/219] fix(deps): update dependency @codemirror/view to v6.26.0 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 a8c0e0fe47..93c28ddc1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10639,13 +10639,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.23.0": - version: 6.24.1 - resolution: "@codemirror/view@npm:6.24.1" + version: 6.26.0 + resolution: "@codemirror/view@npm:6.26.0" dependencies: "@codemirror/state": ^6.4.0 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 376a9dd6ba3d626373f06a241defa7b61dfa80dda021e8dac8aa05261873b5e8bdf2f7d378f844c8bea2b644659020729bbf43330a272a76143e9995d77a452c + checksum: 93c824334228d0ed81c0db8f58a627b69dad1300f4b64df6e19b487aa36cbd8bf624121092119fc09d49c290cd4e1c88680de62bd138a15f89570832f7addd80 languageName: node linkType: hard From c4ea7851dd50d56000c0864f1428cc66d403a2e8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 13:44:58 +0000 Subject: [PATCH 138/219] fix(deps): update dependency @google-cloud/container to v5.10.0 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 93c28ddc1d..eb0f76cdbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11661,11 +11661,11 @@ __metadata: linkType: hard "@google-cloud/container@npm:^5.0.0": - version: 5.8.0 - resolution: "@google-cloud/container@npm:5.8.0" + version: 5.10.0 + resolution: "@google-cloud/container@npm:5.10.0" dependencies: google-gax: ^4.0.3 - checksum: 6d82c417d7819fee322397f482785f3dfec28a82f0f1cf1a3f5059a7822f2b438b893eb068bb7ac9909011a63b22e6f1115e7c1386adf3fbfa93980b2657cfc1 + checksum: 068ed2afb6b59a597ea2abfdbb9cf6152e729fd447ae52e5c16da5a2ef95d70e7774438fdaefce8275a37bca3658c1db326915e09429ea42327cb6da8cd05a36 languageName: node linkType: hard From 4d7cdcb8d2300d970a61c724b26c9a6bacaf2b38 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 13:46:30 +0000 Subject: [PATCH 139/219] fix(deps): update dependency @google-cloud/firestore to v7.4.0 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 93c28ddc1d..ceb24fd019 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11670,14 +11670,14 @@ __metadata: linkType: hard "@google-cloud/firestore@npm:^7.0.0": - version: 7.3.1 - resolution: "@google-cloud/firestore@npm:7.3.1" + version: 7.4.0 + resolution: "@google-cloud/firestore@npm:7.4.0" dependencies: fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 google-gax: ^4.0.4 protobufjs: ^7.2.5 - checksum: 635f1dbe17091cff6b822e83ca8b9931def442779a0cec5b80b9387cc7ec6c052ae3d658561df2e021421d4869f57b92bb610086d05a8698be8376a3c2b3e98a + checksum: df0094c3be5473a96f925d7bcd4234f376e4928065bdd96bdc2debc73b4c976df160c2553dfc8ed3d73f859778996159e69770983fa0224a53afbe4e77754db3 languageName: node linkType: hard From b0b62d565d08db2a70d11d97799c49a7d51a24f6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 14:31:51 +0000 Subject: [PATCH 140/219] fix(deps): update dependency @google-cloud/storage to v7.8.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9e5e853acb..1b073b5151 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11706,8 +11706,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^7.0.0": - version: 7.7.0 - resolution: "@google-cloud/storage@npm:7.7.0" + version: 7.8.0 + resolution: "@google-cloud/storage@npm:7.8.0" dependencies: "@google-cloud/paginator": ^5.0.0 "@google-cloud/projectify": ^4.0.0 @@ -11715,18 +11715,18 @@ __metadata: abort-controller: ^3.0.0 async-retry: ^1.3.3 compressible: ^2.0.12 - duplexify: ^4.0.0 + duplexify: ^4.1.3 ent: ^2.2.0 fast-xml-parser: ^4.3.0 gaxios: ^6.0.2 - google-auth-library: ^9.0.0 + google-auth-library: ^9.6.3 mime: ^3.0.0 mime-types: ^2.0.8 p-limit: ^3.0.1 retry-request: ^7.0.0 teeny-request: ^9.0.0 uuid: ^8.0.0 - checksum: b63069b7e591e55f9132aab9e8f9cd03b72a5b6e531c1f37fc44c4cd34eb02dd50e8007739dad6f0ac2ddb216eb5a80bc3b062d1d8c42aad7351e6cc6008d27f + checksum: 2f72d5c6f6d88ddd69c7df1a1eed05a9fe422d11b1885382c11265a0695d1b6ecae6b1e24c739ca619116536c5ae7262564a99a7256774f405b224f906ab2e90 languageName: node linkType: hard @@ -26108,15 +26108,15 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^4.0.0": - version: 4.1.1 - resolution: "duplexify@npm:4.1.1" +"duplexify@npm:^4.0.0, duplexify@npm:^4.1.3": + version: 4.1.3 + resolution: "duplexify@npm:4.1.3" dependencies: end-of-stream: ^1.4.1 inherits: ^2.0.3 readable-stream: ^3.1.1 - stream-shift: ^1.0.0 - checksum: 1cf800f1dc1647d6e0272b811421d4ce78b7d9b12dd85c7ecd78b9e4bfba374d309ac9e3440c66461fc62adb69db49aebf49da15962c98a84d8fd33c7e9c5c5a + stream-shift: ^1.0.2 + checksum: 9636a027345de3dd3c801594d01a7c73d9ce260019538beb1ee650bba7544e72f40a4d4902b52e1ab283dc32a06f210d42748773af02ff15e3064a9659deab7f languageName: node linkType: hard @@ -29483,9 +29483,9 @@ __metadata: languageName: node linkType: hard -"google-auth-library@npm:^9.0.0": - version: 9.6.3 - resolution: "google-auth-library@npm:9.6.3" +"google-auth-library@npm:^9.0.0, google-auth-library@npm:^9.6.3": + version: 9.7.0 + resolution: "google-auth-library@npm:9.7.0" dependencies: base64-js: ^1.3.0 ecdsa-sig-formatter: ^1.0.11 @@ -29493,7 +29493,7 @@ __metadata: gcp-metadata: ^6.1.0 gtoken: ^7.0.0 jws: ^4.0.0 - checksum: 46174191de15ec56110ac0394ae9d1c56fb6aa293809d45170b2ff570130d7e3f3e82fa78d413908862a2d0da3fa946b72f1074000f4d52579eb17367e49e44d + checksum: b0f273fa08ac69cf38f037c195c137ef9d1f3d197c31fd57db957bd5c38c4a110e1c029504f09574a59fa6c9c85fc6fb9d7748c2ed75f30ecae0c71daa369c23 languageName: node linkType: hard @@ -42738,10 +42738,10 @@ __metadata: languageName: node linkType: hard -"stream-shift@npm:^1.0.0": - version: 1.0.1 - resolution: "stream-shift@npm:1.0.1" - checksum: 59b82b44b29ec3699b5519a49b3cedcc6db58c72fb40c04e005525dfdcab1c75c4e0c180b923c380f204bed78211b9bad8faecc7b93dece4d004c3f6ec75737b +"stream-shift@npm:^1.0.0, stream-shift@npm:^1.0.2": + version: 1.0.3 + resolution: "stream-shift@npm:1.0.3" + checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 languageName: node linkType: hard From 0063f9ece559b7443ff854f67f20cccb2b49e41c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 14:32:54 +0000 Subject: [PATCH 141/219] fix(deps): update dependency @material-table/core to v3.2.5 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9e5e853acb..e87e8c8b2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12855,8 +12855,8 @@ __metadata: linkType: hard "@material-table/core@npm:^3.1.0": - version: 3.1.0 - resolution: "@material-table/core@npm:3.1.0" + version: 3.2.5 + resolution: "@material-table/core@npm:3.2.5" dependencies: "@babel/runtime": ^7.12.5 "@date-io/date-fns": ^1.3.13 @@ -12869,12 +12869,13 @@ __metadata: prop-types: ^15.7.2 react-beautiful-dnd: ^13.0.0 react-double-scrollbar: 0.0.15 + uuid: ^3.4.0 peerDependencies: "@date-io/core": ^1.3.13 "@material-ui/core": ^4.11.2 react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: c54114733c061d99424859465c25fdd0c51314f533d37269ee41062195bb34b5bd7eabae8e7b14532b90baee9363d00333b00d1619c01b821a7ee974053c4947 + checksum: 707e85cfcb8c1cfc8eb78ea6991509879f774081d7a54ad428f702fe00478b6d3707d0fd85f4ad443ebcfac0c0cab79c046c4d5083adcbc767615445667b50cf languageName: node linkType: hard @@ -45200,7 +45201,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.3.2": +"uuid@npm:^3.3.2, uuid@npm:^3.4.0": version: 3.4.0 resolution: "uuid@npm:3.4.0" bin: From fce2cfe2371613cdc96ddfc8cc71fc63b386f56c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:19:02 +0000 Subject: [PATCH 142/219] fix(deps): update dependency @opensearch-project/opensearch to v2.6.0 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 9629dff51d..ca1007947d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14753,15 +14753,15 @@ __metadata: linkType: hard "@opensearch-project/opensearch@npm:^2.2.1": - version: 2.5.0 - resolution: "@opensearch-project/opensearch@npm:2.5.0" + version: 2.6.0 + resolution: "@opensearch-project/opensearch@npm:2.6.0" dependencies: aws4: ^1.11.0 debug: ^4.3.1 hpagent: ^1.2.0 ms: ^2.1.3 secure-json-parse: ^2.4.0 - checksum: f9a4afa06c2917ffb76baac1ee1df9b8cf4594af6aded451b7c4838a4a0320101a432c0cbd3586d3533a4eb662fc414d4f1b315b73fac5b7a0c1d5f0ff0ac6ed + checksum: d958bb83bdf4975f342da9d355aa39f3daaed322fa72fae715501cf760101e3ef50e3e216cab5b008df5f7d7976d5feee7541a6dd9d1f6791ffb01134fafa227 languageName: node linkType: hard From 9110d613696db7418e670e678e6e586547041615 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 16 Mar 2024 16:32:50 +0100 Subject: [PATCH 143/219] beps/0004: fix frontmatter Signed-off-by: Patrik Oldsberg --- beps/0004-scaffolder-task-idempotency/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beps/0004-scaffolder-task-idempotency/README.md b/beps/0004-scaffolder-task-idempotency/README.md index 03569de3d6..f857594034 100644 --- a/beps/0004-scaffolder-task-idempotency/README.md +++ b/beps/0004-scaffolder-task-idempotency/README.md @@ -5,7 +5,7 @@ authors: - 'bnechyporenko@bol.com' - 'benjaminl@spotify.com' owners: - - @backstage/scaffolder-maintainers + - '@backstage/scaffolder-maintainers' project-areas: - scaffolder creation-date: 2024-01-31 From fe77498f2fc577bc8bc3dd27d535a5c2d507defb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sun, 17 Mar 2024 14:38:53 +0100 Subject: [PATCH 144/219] fix the prettier error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- beps/0004-scaffolder-task-idempotency/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beps/0004-scaffolder-task-idempotency/README.md b/beps/0004-scaffolder-task-idempotency/README.md index f857594034..8cdf8504fe 100644 --- a/beps/0004-scaffolder-task-idempotency/README.md +++ b/beps/0004-scaffolder-task-idempotency/README.md @@ -4,7 +4,7 @@ status: provisional authors: - 'bnechyporenko@bol.com' - 'benjaminl@spotify.com' -owners: +owners: - '@backstage/scaffolder-maintainers' project-areas: - scaffolder From b5cdcfea3fa97fcaaa7d51ab5a2a33c9ceed22f6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:06:01 +0000 Subject: [PATCH 145/219] fix(deps): update dependency azure-devops-node-api to v12.5.0 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 5082ec4368..96d93c05e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21963,12 +21963,12 @@ __metadata: linkType: hard "azure-devops-node-api@npm:^12.0.0": - version: 12.4.0 - resolution: "azure-devops-node-api@npm:12.4.0" + version: 12.5.0 + resolution: "azure-devops-node-api@npm:12.5.0" dependencies: tunnel: 0.0.6 typed-rest-client: ^1.8.4 - checksum: d7207c2bb0e021a25e11d1f6e4b4ac02efdbe4467b0c28bfb19260b2a1a799393978e6ff0b916cf81e309ba8b9a80015d8638751bed253695ef779a3a904efd2 + checksum: 7c2c3ae21eaf1bc3627ba4ea87bdac1085a3594eacf40eb6d7b11292f057988db38f718f4597733c6861d854c28bfe146bcf3964a13adddebe1085270bb63097 languageName: node linkType: hard From cf37ebb550e34aa79e62a89a593c3f300431398d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:07:08 +0000 Subject: [PATCH 146/219] fix(deps): update dependency date-fns to v3.5.0 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 5082ec4368..baae893ea1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25244,9 +25244,9 @@ __metadata: linkType: hard "date-fns@npm:^3.0.0": - version: 3.3.1 - resolution: "date-fns@npm:3.3.1" - checksum: 6245e93a47de28ac96dffd4d62877f86e6b64854860ae1e00a4f83174d80bc8e59bd1259cf265223fb2ddce5c8e586dc9cc210f0d052faba2f7660e265877283 + version: 3.5.0 + resolution: "date-fns@npm:3.5.0" + checksum: 0f326b72aff0a10b5a7a253d7790462263ee3c79b4283fdbb423c3159017f7ddb7cfd8e509ce94c652825232e9aa84278143f333ddb357bc6b03bd39eebd6f5d languageName: node linkType: hard From f5082b53c81415dca86941d0540d9271d7708224 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:08:59 +0000 Subject: [PATCH 147/219] fix(deps): update dependency esbuild-loader to v4.1.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 168 +++++++++++++++++++++++++++--------------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5082ec4368..b30bf255e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26654,16 +26654,16 @@ __metadata: linkType: hard "esbuild-loader@npm:^4.0.0": - version: 4.0.3 - resolution: "esbuild-loader@npm:4.0.3" + version: 4.1.0 + resolution: "esbuild-loader@npm:4.1.0" dependencies: - esbuild: ^0.19.0 + esbuild: ^0.20.0 get-tsconfig: ^4.7.0 loader-utils: ^2.0.4 webpack-sources: ^1.4.3 peerDependencies: webpack: ^4.40.0 || ^5.0.0 - checksum: 8303a106ec9e74fb4ad2c10f5e23fb082d742cfa7bc42b1476886a9f49ef1bff99cb39c1a569827195865d2d179a09a54bedfd34fae82841ce1f02beebfd9127 + checksum: 51e76c36dd1fb70545889b07e3c4b4a437aaf1a2acc836e83141f06bcb8fbf96af778cf21b37355ea724c30504ad288ba76b0554ff94af260bb12ece647de861 languageName: node linkType: hard @@ -26744,86 +26744,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.19.0, esbuild@npm:~0.19.10": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f - languageName: node - linkType: hard - "esbuild@npm:^0.20.0": version: 0.20.2 resolution: "esbuild@npm:0.20.2" @@ -26904,6 +26824,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.19.10": + version: 0.19.12 + resolution: "esbuild@npm:0.19.12" + dependencies: + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" From d7a50bf55557dbe7fc5723da05003bcc943b57b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:10:07 +0000 Subject: [PATCH 148/219] fix(deps): update dependency eslint-plugin-react to v7.34.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 659 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 382 insertions(+), 277 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5082ec4368..fd58b1fcce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21483,13 +21483,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: - call-bind: ^1.0.2 - is-array-buffer: ^3.0.1 - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + call-bind: ^1.0.5 + is-array-buffer: ^3.0.4 + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e languageName: node linkType: hard @@ -21543,6 +21543,19 @@ __metadata: languageName: node linkType: hard +"array.prototype.findlast@npm:^1.2.4": + version: 1.2.4 + resolution: "array.prototype.findlast@npm:1.2.4" + dependencies: + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.3.0 + es-shim-unscopables: ^1.0.2 + checksum: b4c76571adf6c3cffbbbb8acd7ac39d94af6b120dd388dcf44637c22d77ba3ae13dd43d1be25d90956848fae5a01191fbdebe48ce4c0aa0989d7ee269a94a5a4 + languageName: node + linkType: hard + "array.prototype.findlastindex@npm:^1.2.3": version: 1.2.3 resolution: "array.prototype.findlastindex@npm:1.2.3" @@ -21568,7 +21581,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": +"array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -21580,31 +21593,44 @@ __metadata: languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.1": - version: 1.1.1 - resolution: "array.prototype.tosorted@npm:1.1.1" +"array.prototype.toreversed@npm:^1.1.2": + version: 1.1.2 + resolution: "array.prototype.toreversed@npm:1.1.2" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.1.3 - checksum: 7923324a67e70a2fc0a6e40237405d92395e45ebd76f5cb89c2a5cf1e66b47aca6baacd0cd628ffd88830b90d47fff268071493d09c9ae123645613dac2c2ca3 - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" - dependencies: - array-buffer-byte-length: ^1.0.0 call-bind: ^1.0.2 define-properties: ^1.2.0 es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-array-buffer: ^3.0.2 + es-shim-unscopables: ^1.0.0 + checksum: 58598193426282155297bedf950dc8d464624a0d81659822fb73124286688644cb7e0e4927a07f3ab2daaeb6617b647736cc3a5e6ca7ade5bb8e573b284e6240 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.3": + version: 1.1.3 + resolution: "array.prototype.tosorted@npm:1.1.3" + dependencies: + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.1.0 + es-shim-unscopables: ^1.0.2 + checksum: 555e8808086bbde9e634c5dc5a8c0a2f1773075447b43b2fa76ab4f94f4e90f416d2a4f881024e1ce1a2931614caf76cd6b408af901c9d7cd13061d0d268f5af + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.2.1 + get-intrinsic: ^1.2.3 + is-array-buffer: ^3.0.4 is-shared-array-buffer: ^1.0.2 - checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 + checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e languageName: node linkType: hard @@ -21768,15 +21794,6 @@ __metadata: languageName: node linkType: hard -"asynciterator.prototype@npm:^1.0.0": - version: 1.0.0 - resolution: "asynciterator.prototype@npm:1.0.0" - dependencies: - has-symbols: ^1.0.3 - checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -21824,10 +21841,12 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 languageName: node linkType: hard @@ -22996,14 +23015,16 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 function-bind: ^1.1.2 - get-intrinsic: ^1.2.1 - set-function-length: ^1.1.1 - checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 languageName: node linkType: hard @@ -25227,6 +25248,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + "dataloader@npm:^2.0.0, dataloader@npm:^2.2.2": version: 2.2.2 resolution: "dataloader@npm:2.2.2" @@ -25495,14 +25549,14 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - get-intrinsic: ^1.2.1 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b languageName: node linkType: hard @@ -26449,50 +26503,57 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1": - version: 1.22.3 - resolution: "es-abstract@npm:1.22.3" +"es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0": + version: 1.23.1 + resolution: "es-abstract@npm:1.23.1" dependencies: - array-buffer-byte-length: ^1.0.0 - arraybuffer.prototype.slice: ^1.0.2 - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.5 - es-set-tostringtag: ^2.0.1 + array-buffer-byte-length: ^1.0.1 + arraybuffer.prototype.slice: ^1.0.3 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + data-view-buffer: ^1.0.1 + data-view-byte-length: ^1.0.1 + data-view-byte-offset: ^1.0.0 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-set-tostringtag: ^2.0.3 es-to-primitive: ^1.2.1 function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.2 - get-symbol-description: ^1.0.0 + get-intrinsic: ^1.2.4 + get-symbol-description: ^1.0.2 globalthis: ^1.0.3 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 has-symbols: ^1.0.3 - hasown: ^2.0.0 - internal-slot: ^1.0.5 - is-array-buffer: ^3.0.2 + hasown: ^2.0.2 + internal-slot: ^1.0.7 + is-array-buffer: ^3.0.4 is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 + is-data-view: ^1.0.1 + is-negative-zero: ^2.0.3 is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 + is-shared-array-buffer: ^1.0.3 is-string: ^1.0.7 - is-typed-array: ^1.1.12 + is-typed-array: ^1.1.13 is-weakref: ^1.0.2 object-inspect: ^1.13.1 object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.5.1 - safe-array-concat: ^1.0.1 - safe-regex-test: ^1.0.0 + object.assign: ^4.1.5 + regexp.prototype.flags: ^1.5.2 + safe-array-concat: ^1.1.2 + safe-regex-test: ^1.0.3 string.prototype.trim: ^1.2.8 string.prototype.trimend: ^1.0.7 string.prototype.trimstart: ^1.0.7 - typed-array-buffer: ^1.0.0 - typed-array-byte-length: ^1.0.0 - typed-array-byte-offset: ^1.0.0 - typed-array-length: ^1.0.4 + typed-array-buffer: ^1.0.2 + typed-array-byte-length: ^1.0.1 + typed-array-byte-offset: ^1.0.2 + typed-array-length: ^1.0.5 unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.13 - checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a + which-typed-array: ^1.1.15 + checksum: a55b01af616898bfb1167fc567f3a6e22bb2800811a7f41f1c037f10bdc653894fc4c7000cce3a01e852628fd85044dff51d6d41f65f356a2ea847de3178b6ec languageName: node linkType: hard @@ -26511,6 +26572,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + "es-get-iterator@npm:^1.1.2": version: 1.1.2 resolution: "es-get-iterator@npm:1.1.2" @@ -26527,25 +26604,25 @@ __metadata: languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": - version: 1.0.15 - resolution: "es-iterator-helpers@npm:1.0.15" +"es-iterator-helpers@npm:^1.0.15, es-iterator-helpers@npm:^1.0.17": + version: 1.0.18 + resolution: "es-iterator-helpers@npm:1.0.18" dependencies: - asynciterator.prototype: ^1.0.0 - call-bind: ^1.0.2 + call-bind: ^1.0.7 define-properties: ^1.2.1 - es-abstract: ^1.22.1 - es-set-tostringtag: ^2.0.1 - function-bind: ^1.1.1 - get-intrinsic: ^1.2.1 + es-abstract: ^1.23.0 + es-errors: ^1.3.0 + es-set-tostringtag: ^2.0.3 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 globalthis: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 has-symbols: ^1.0.3 - internal-slot: ^1.0.5 + internal-slot: ^1.0.7 iterator.prototype: ^1.1.2 - safe-array-concat: ^1.0.1 - checksum: 50081ae5c549efe62e5c1d244df0194b40b075f7897fc2116b7e1aa437eb3c41f946d2afda18c33f9b31266ec544765932542765af839f76fa6d7b7855d1e0e1 + safe-array-concat: ^1.1.2 + checksum: 1594324ff3ca8890fe30c98b2419d3007d2b14b35f9773f188114408ff973e13c526f6045d88209e932f58dc0c55fc9a4ae1554636f8938ed7d926ffc27d3e1a languageName: node linkType: hard @@ -26563,23 +26640,32 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - has-tostringtag: ^1.0.0 - checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + get-intrinsic: ^1.2.4 + has-tostringtag: ^1.0.2 + hasown: ^2.0.1 + checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" + dependencies: + hasown: ^2.0.0 + checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 languageName: node linkType: hard @@ -27145,28 +27231,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.28.0": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" + version: 7.34.1 + resolution: "eslint-plugin-react@npm:7.34.1" dependencies: - array-includes: ^3.1.6 - array.prototype.flatmap: ^1.3.1 - array.prototype.tosorted: ^1.1.1 + array-includes: ^3.1.7 + array.prototype.findlast: ^1.2.4 + array.prototype.flatmap: ^1.3.2 + array.prototype.toreversed: ^1.1.2 + array.prototype.tosorted: ^1.1.3 doctrine: ^2.1.0 - es-iterator-helpers: ^1.0.12 + es-iterator-helpers: ^1.0.17 estraverse: ^5.3.0 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 - object.entries: ^1.1.6 - object.fromentries: ^2.0.6 - object.hasown: ^1.1.2 - object.values: ^1.1.6 + object.entries: ^1.1.7 + object.fromentries: ^2.0.7 + object.hasown: ^1.1.3 + object.values: ^1.1.7 prop-types: ^15.8.1 - resolve: ^2.0.0-next.4 + resolve: ^2.0.0-next.5 semver: ^6.3.1 - string.prototype.matchall: ^4.0.8 + string.prototype.matchall: ^4.0.10 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b4c3d76390b0ae6b6f9fed78170604cc2c04b48e6778a637db339e8e3911ec9ef22510b0ae77c429698151d0f1b245f282177f384105b6830e7b29b9c9b26610 + checksum: 82f391c5a093235c3bc2f664c54e009c49460778ee7d1b86c1536df9ac4d2a80d1dedc9241ac797df4a9dced936e955d9c89042fb3ac8d017b5359d1320d3c0f languageName: node linkType: hard @@ -29145,15 +29233,16 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: + es-errors: ^1.3.0 function-bind: ^1.1.2 has-proto: ^1.0.1 has-symbols: ^1.0.3 hasown: ^2.0.0 - checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 languageName: node linkType: hard @@ -29224,13 +29313,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bind: ^1.0.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 languageName: node linkType: hard @@ -29865,19 +29955,19 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 languageName: node linkType: hard @@ -29888,12 +29978,12 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d languageName: node linkType: hard @@ -29911,15 +30001,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - "hash-base@npm:^3.0.0": version: 3.0.4 resolution: "hash-base@npm:3.0.4" @@ -29947,12 +30028,12 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard @@ -30767,14 +30848,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.5": - version: 1.0.5 - resolution: "internal-slot@npm:1.0.5" +"internal-slot@npm:^1.0.5, internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" dependencies: - get-intrinsic: ^1.2.0 - has: ^1.0.3 + es-errors: ^1.3.0 + hasown: ^2.0.0 side-channel: ^1.0.4 - checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a + checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb languageName: node linkType: hard @@ -30923,14 +31004,13 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" dependencies: call-bind: ^1.0.2 - get-intrinsic: ^1.2.0 - is-typed-array: ^1.1.10 - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + get-intrinsic: ^1.2.1 + checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 languageName: node linkType: hard @@ -31026,7 +31106,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.8.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -31035,6 +31115,15 @@ __metadata: languageName: node linkType: hard +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: ^1.1.13 + checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -31217,10 +31306,10 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd languageName: node linkType: hard @@ -31417,12 +31506,12 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + call-bind: ^1.0.7 + checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 languageName: node linkType: hard @@ -31483,12 +31572,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" dependencies: - which-typed-array: ^1.1.11 - checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 + which-typed-array: ^1.1.14 + checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 languageName: node linkType: hard @@ -36790,19 +36879,19 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 + call-bind: ^1.0.5 + define-properties: ^1.2.1 has-symbols: ^1.0.3 object-keys: ^1.1.1 - checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 languageName: node linkType: hard -"object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": +"object.entries@npm:^1.1.7": version: 1.1.7 resolution: "object.entries@npm:1.1.7" dependencies: @@ -36813,7 +36902,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": +"object.fromentries@npm:^2.0.7": version: 2.0.7 resolution: "object.fromentries@npm:2.0.7" dependencies: @@ -36836,13 +36925,13 @@ __metadata: languageName: node linkType: hard -"object.hasown@npm:^1.1.2": - version: 1.1.2 - resolution: "object.hasown@npm:1.1.2" +"object.hasown@npm:^1.1.3": + version: 1.1.3 + resolution: "object.hasown@npm:1.1.3" dependencies: - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: b936572536db0cdf38eb30afd2f1026a8b6f2cc5d2c4497c9d9bbb01eaf3e980dead4fd07580cfdd098e6383e5a9db8212d3ea0c6bdd2b5e68c60aa7e3b45566 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 languageName: node linkType: hard @@ -38295,6 +38384,13 @@ __metadata: languageName: node linkType: hard +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae + languageName: node + linkType: hard + "postcss-calc@npm:^8.0.0": version: 8.0.0 resolution: "postcss-calc@npm:8.0.0" @@ -40606,14 +40702,15 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.2": + version: 1.5.2 + resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - set-function-name: ^2.0.0 - checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 + call-bind: ^1.0.6 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + set-function-name: ^2.0.1 + checksum: d7f333667d5c564e2d7a97c56c3075d64c722c9bb51b2b4df6822b2e8096d623a5e63088fb4c83df919b6951ef8113841de8b47de7224872fa6838bc5d8a7d64 languageName: node linkType: hard @@ -40899,16 +40996,16 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.4": - version: 2.0.0-next.4 - resolution: "resolve@npm:2.0.0-next.4" +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 + checksum: a73ac69a1c4bd34c56b213d91f5b17ce390688fdb4a1a96ed3025cc7e08e7bfb90b3a06fcce461780cb0b589c958afcb0080ab802c71c01a7ecc8c64feafc89f languageName: node linkType: hard @@ -40935,16 +41032,16 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.4#~builtin": - version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b" +"resolve@patch:resolve@^2.0.0-next.5#~builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=07638b" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 + checksum: 064d09c1808d0c51b3d90b5d27e198e6d0c5dad0eb57065fd40803d6a20553e5398b07f76739d69cbabc12547058bec6b32106ea66622375fb0d7e8fca6a846c languageName: node linkType: hard @@ -41407,15 +41504,15 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 has-symbols: ^1.0.3 isarray: ^2.0.5 - checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 + checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 languageName: node linkType: hard @@ -41440,14 +41537,14 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 + call-bind: ^1.0.6 + es-errors: ^1.3.0 is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 languageName: node linkType: hard @@ -41788,15 +41885,17 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.1.1": - version: 1.1.1 - resolution: "set-function-length@npm:1.1.1" +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - define-data-property: ^1.1.1 - get-intrinsic: ^1.2.1 + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 languageName: node linkType: hard @@ -42877,19 +42976,20 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.8": - version: 4.0.8 - resolution: "string.prototype.matchall@npm:4.0.8" +"string.prototype.matchall@npm:^4.0.10": + version: 4.0.10 + resolution: "string.prototype.matchall@npm:4.0.10" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - regexp.prototype.flags: ^1.4.3 + internal-slot: ^1.0.5 + regexp.prototype.flags: ^1.5.0 + set-function-name: ^2.0.0 side-channel: ^1.0.4 - checksum: 952da3a818de42ad1c10b576140a5e05b4de7b34b8d9dbf00c3ac8c1293e9c0f533613a39c5cda53e0a8221f2e710bc2150e730b1c2278d60004a8a35726efb6 + checksum: 3c78bdeff39360c8e435d7c4c6ea19f454aa7a63eda95fa6fadc3a5b984446a2f9f2c02d5c94171ce22268a573524263fbd0c8edbe3ce2e9890d7cc036cdc3ed languageName: node linkType: hard @@ -44396,50 +44496,55 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - is-typed-array: ^1.1.10 - checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-typed-array: ^1.1.13 + checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" dependencies: - call-bind: ^1.0.2 + call-bind: ^1.0.7 for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" +"typed-array-length@npm:^1.0.5": + version: 1.0.5 + resolution: "typed-array-length@npm:1.0.5" dependencies: - call-bind: ^1.0.2 + call-bind: ^1.0.7 for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + checksum: 82f5b666155cff1b345a1f3ab018d3f7667990f525435e4c8448cc094ab0f8ea283bb7cbde4d7bc82ea0b9b1072523bf31e86620d72615951d7fa9ccb4f42dfa languageName: node linkType: hard @@ -46003,16 +46108,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.4 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 for-each: ^0.3.3 gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: 3828a0d5d72c800e369d447e54c7620742a4cc0c9baf1b5e8c17e9b6ff90d8d861a3a6dd4800f1953dbf80e5e5cec954a289e5b4a223e3bee4aeb1f8c5f33309 + has-tostringtag: ^1.0.2 + checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 languageName: node linkType: hard From f3e0876c8acab24ebb3ba019601c0a9cfcc97aca Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:11:13 +0000 Subject: [PATCH 149/219] fix(deps): update dependency eslint-webpack-plugin to v4.1.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5082ec4368..0e0aa0d3da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18774,13 +18774,13 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:*, @types/eslint@npm:^8.37.0": - version: 8.56.2 - resolution: "@types/eslint@npm:8.56.2" +"@types/eslint@npm:*, @types/eslint@npm:^8.56.5": + version: 8.56.5 + resolution: "@types/eslint@npm:8.56.5" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 38e054971596f5c0413f66a62dc26b10e0a21ac46ceacb06fbf8cfb838d20820787209b17218b3916e4c23d990ff77cfdb482d655cac0e0d2b837d430fcc5db8 + checksum: 95a7a23ca38c78e5c27a2ed36ef60f094d5e6589e3473c320b6ff69eb3ca6333d5b7f0d5053416369f5ab2fb86874df19562d4d67a98237c17def6e30abff540 languageName: node linkType: hard @@ -21114,7 +21114,7 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^5.0.0": +"ajv-keywords@npm:^5.1.0": version: 5.1.0 resolution: "ajv-keywords@npm:5.1.0" dependencies: @@ -21137,7 +21137,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.11.2, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.6.3, ajv@npm:^8.8.0, ajv@npm:^8.8.2": +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.11.2, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.6.3, ajv@npm:^8.8.2, ajv@npm:^8.9.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -27231,18 +27231,18 @@ __metadata: linkType: hard "eslint-webpack-plugin@npm:^4.0.0": - version: 4.0.1 - resolution: "eslint-webpack-plugin@npm:4.0.1" + version: 4.1.0 + resolution: "eslint-webpack-plugin@npm:4.1.0" dependencies: - "@types/eslint": ^8.37.0 - jest-worker: ^29.5.0 + "@types/eslint": ^8.56.5 + jest-worker: ^29.7.0 micromatch: ^4.0.5 normalize-path: ^3.0.0 - schema-utils: ^4.0.0 + schema-utils: ^4.2.0 peerDependencies: eslint: ^8.0.0 webpack: ^5.0.0 - checksum: 94fe0817fc580729dc6edc4a31c9f7dbeb97ad134c6c4192feab66aae711ed5afe35c5bc8d5e99b39626b469300196df72e631f5e53c55723adbf850765924e5 + checksum: 1676ff08b0424e4656aa638a0c2a7b2f3f6a504651689a2d86b237c9a52ad65e17aeb5abbe13663e25353d8a706dcf45f49dbe4795dad27b6b0650db8aa21b16 languageName: node linkType: hard @@ -32413,7 +32413,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.5.0, jest-worker@npm:^29.7.0": +"jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" dependencies: @@ -41547,15 +41547,15 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0": - version: 4.0.0 - resolution: "schema-utils@npm:4.0.0" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" dependencies: "@types/json-schema": ^7.0.9 - ajv: ^8.8.0 + ajv: ^8.9.0 ajv-formats: ^2.1.1 - ajv-keywords: ^5.0.0 - checksum: c843e92fdd1a5c145dbb6ffdae33e501867f9703afac67bdf35a685e49f85b1dcc10ea250033175a64bd9d31f0555bc6785b8359da0c90bcea30cf6dfbb55a8f + ajv-keywords: ^5.1.0 + checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde languageName: node linkType: hard From 8f0a4d8683921d614f78e27629a58ca09d558e3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:49:49 +0000 Subject: [PATCH 150/219] chore(deps): update dependency msw to v2.2.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 669e37bbdc..536b7a1efc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35887,8 +35887,8 @@ __metadata: linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.2.4 - resolution: "msw@npm:2.2.4" + version: 2.2.6 + resolution: "msw@npm:2.2.6" dependencies: "@bundled-es-modules/cookie": ^2.0.0 "@bundled-es-modules/statuses": ^1.0.1 @@ -35914,7 +35914,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: ce446caec9a95feb08a8ff6082e344c993a22aabdf378a91c5ba3b3a7848aa0bb67a9a65ffd2b3fe2cccd4217ce10690866ae6cf37222e4a8566f6f89b8b143d + checksum: b33867107f2603195b9825bcd79027895a9d72e72d0863e60d31a5d28ddd0398604bd7360d5102cfbe5438242c636820797274ce8d0bb992774e05547918d0cd languageName: node linkType: hard From 4086062a91a5cedd93a56ab1422026446e575f3a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:50:23 +0000 Subject: [PATCH 151/219] fix(deps): update dependency qs to v6.12.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index 669e37bbdc..860cc69262 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29233,7 +29233,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -36841,7 +36841,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.13.1": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f @@ -39366,11 +39366,11 @@ __metadata: linkType: hard "qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.9.1, qs@npm:^6.9.4, qs@npm:^6.9.6": - version: 6.11.2 - resolution: "qs@npm:6.11.2" + version: 6.12.0 + resolution: "qs@npm:6.12.0" dependencies: - side-channel: ^1.0.4 - checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b + side-channel: ^1.0.6 + checksum: ba007fb2488880b9c6c3df356fe6888b9c1f4c5127552edac214486cfe83a332de09a5c40d490d79bb27bef977ba1085a8497512ff52eaac72e26564f77ce908 languageName: node linkType: hard @@ -42057,14 +42057,15 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 languageName: node linkType: hard From 20c771470b4e35f90277b5acde6fdc5d59df25ed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:29:15 +0000 Subject: [PATCH 152/219] fix(deps): update dependency react-hook-form to v7.51.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 669e37bbdc..61629a46dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39827,11 +39827,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.12.2, react-hook-form@npm:^7.13.0": - version: 7.50.1 - resolution: "react-hook-form@npm:7.50.1" + version: 7.51.1 + resolution: "react-hook-form@npm:7.51.1" peerDependencies: react: ^16.8.0 || ^17 || ^18 - checksum: 40dcb64d2ff631f6da76db2c5788957da3429f07649a6f3aed76545c616fae8eee557a6b06d0d0842be1f80ac8244f44d87f4d8d83fddabec76d7ab9921f8781 + checksum: 6ed9060ac9230a7e9e6ca46fc001cc5f44f35e6485e0c951ab1a5e85bd698c200a7230c5514f0642875e4f45f6cb8f79479deac0253f1c2b8db1445d1c96d796 languageName: node linkType: hard From 90d08b071d1a0525f2f149cd3c2224d5b70401cf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:29:52 +0000 Subject: [PATCH 153/219] fix(deps): update dependency react-idle-timer to v5.7.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-45377c1.md | 5 +++++ packages/core-components/package.json | 2 +- yarn.lock | 12 +++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 .changeset/renovate-45377c1.md diff --git a/.changeset/renovate-45377c1.md b/.changeset/renovate-45377c1.md new file mode 100644 index 0000000000..5b0c6e1fc8 --- /dev/null +++ b/.changeset/renovate-45377c1.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Updated dependency `react-idle-timer` to `5.7.2`. diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 04de809938..525b41dba7 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -78,7 +78,7 @@ "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", - "react-idle-timer": "5.6.2", + "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", diff --git a/yarn.lock b/yarn.lock index 669e37bbdc..b2ca02b07e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4024,7 +4024,7 @@ __metadata: rc-progress: 3.5.1 react-helmet: 6.1.0 react-hook-form: ^7.12.2 - react-idle-timer: 5.6.2 + react-idle-timer: 5.7.2 react-markdown: ^8.0.0 react-sparklines: ^1.7.0 react-syntax-highlighter: ^15.4.5 @@ -39845,6 +39845,16 @@ __metadata: languageName: node linkType: hard +"react-idle-timer@npm:5.7.2": + version: 5.7.2 + resolution: "react-idle-timer@npm:5.7.2" + peerDependencies: + react: ">=16" + react-dom: ">=16" + checksum: 6faf3cfa87c9d65ae7a87078a2d82db5b821936a45565a98d69e7341e4b4acd5610b1f26cf1a6809b5551e4c30357f2ab5ce729c4c33751f66cb9ce6072dfb02 + languageName: node + linkType: hard + "react-immutable-proptypes@npm:2.2.0": version: 2.2.0 resolution: "react-immutable-proptypes@npm:2.2.0" From 3629d34aebacf8636889825570a62f65716ac15c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:06:36 +0000 Subject: [PATCH 154/219] fix(deps): update dependency sass to v1.72.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 2b02b93f39..e7f76d67d9 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -10392,15 +10392,15 @@ __metadata: linkType: hard "sass@npm:^1.57.1": - version: 1.71.1 - resolution: "sass@npm:1.71.1" + version: 1.72.0 + resolution: "sass@npm:1.72.0" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 19c4939d3042eb9459d462bbd27b1f576fa18034e23c87ca0005b87effdee431c16503b5a785edcdcde1a76dfb804716d9ad42c85a78968ac3825d515e45cb53 + checksum: f420079c7d51660b7256ee52463c1499ede36f7fd5c8ef50c687451777ad641509001454dea45244073cedd7c00e7a3bc1c362e55206ac6686171b994edb41e4 languageName: node linkType: hard From 40e44fe3778b3f788580ba5784cc23d95adb0af2 Mon Sep 17 00:00:00 2001 From: drodil Date: Sun, 17 Mar 2024 18:08:19 +0200 Subject: [PATCH 155/219] Add missing migrations Signed-off-by: drodil --- plugins/notifications-backend/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 68c7b9b22b..1e86c6bcda 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -18,7 +18,8 @@ "main": "src/index.ts", "types": "src/index.ts", "files": [ - "dist" + "dist", + "migrations/**/*.{js,d.ts}" ], "scripts": { "build": "backstage-cli package build", From 12ab826b26efca333b5e81bcc450103964c584fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:16:23 +0000 Subject: [PATCH 156/219] fix(deps): update dependency swagger-ui-react to v5.12.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 508 +++++++++++++++++++++++++++--------------------------- 1 file changed, 257 insertions(+), 251 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d5be2ebc1..c47737344d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3133,13 +3133,13 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/runtime-corejs3@npm:7.23.9" +"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.24.0": + version: 7.24.0 + resolution: "@babel/runtime-corejs3@npm:7.24.0" dependencies: core-js-pure: ^3.30.2 regenerator-runtime: ^0.14.0 - checksum: 715d916b6cf60013597aa9a5823fd04a9c6cc6ba6221bb8611e76c369cbf1b4baf1d0ad63b6522736593a38e89a6502213a38f57a9c24e5586628e930c4fd52c + checksum: cd4f2cde0878c911b2eeebf1cb48df819c862492da163bb9001ba690c82e9addd1d14087a8b0dd87fb1da2d916fa3b85d9a8cece4d46f8e5c51d734acda5a8bd languageName: node linkType: hard @@ -17349,409 +17349,408 @@ __metadata: languageName: node linkType: hard -"@swagger-api/apidom-ast@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ast@npm:0.92.0" +"@swagger-api/apidom-ast@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ast@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-error": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 unraw: ^3.0.0 - checksum: 11770246944b3bb5964a88e71a7e32e37691b7a3b6ec9ae6acf58cd580571ca75c079d749bb952cd08c86be2155cbef3ed418ad6194681e1e2fea643a2128af2 + checksum: 447d66bd742a8bbea8b3d0d2d6ddef2e1384107ef6e0105342694f6fc087c1712cc82f165d7349cbd64ce0703e684892f0d6c3e5303c743d20f101348cdf54dc languageName: node linkType: hard -"@swagger-api/apidom-core@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-core@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-core@npm:0.92.0" +"@swagger-api/apidom-core@npm:>=0.97.0 <1.0.0, @swagger-api/apidom-core@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-core@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ast": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 "@types/ramda": ~0.29.6 minim: ~0.23.8 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 short-unique-id: ^5.0.2 stampit: ^4.3.2 - checksum: e02f1a838ab1d811960a48f98922c66bb306f1a5a1a154b8fe4c6445fb0a20c671409fee14a2e49051387bc7b5c28e218161bcc1519c6ad9cbc767bf432ee05d + checksum: 8d2658fcb3f1241cf78c7b551a55930ab8b530fe7a579993f5265bf2d70c9c2e4d73863bd99d5b7ea6c94d5de49a7f7f6b0abcab7370317cacc1f4221709f056 languageName: node linkType: hard -"@swagger-api/apidom-error@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-error@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-error@npm:0.92.0" +"@swagger-api/apidom-error@npm:>=0.97.0 <1.0.0, @swagger-api/apidom-error@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-error@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - checksum: bdd3051a47f4300344c0f1f2a55c4bb3dbe147ba8ebd27c94a77db2c90e8cc371bca63b72dfb49d0034794b82929edbf70d20ab33f59ba9f8c2d2fc8dc0430db + checksum: a32322d59dd6b2cf0c209d1af9efdc645869136d7655ab49749e5daf3c6851ea2204256f7343d080e0989b896448b879aabfe98b3e6245919c1cf622705a9cde languageName: node linkType: hard -"@swagger-api/apidom-json-pointer@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-json-pointer@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-json-pointer@npm:0.92.0" +"@swagger-api/apidom-json-pointer@npm:>=0.97.0 <1.0.0, @swagger-api/apidom-json-pointer@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-json-pointer@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 89d748fd1f52fce381d4e07710244d94c4d9f8a20411ca8bcfb33e7ec515432c7766660b296a9c603fa6b861b39eca4917151f98f3688f1bdcf10f25f9d90134 + checksum: d41bfd104ef57128225e0235b7454828cfd9d0ab4ee9fa9089a9ec12d60446c4b3a3840ec215076b45d58d251aa98766907898bcbee92404a19ecd3cb89b8817 languageName: node linkType: hard -"@swagger-api/apidom-ns-api-design-systems@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.92.0" +"@swagger-api/apidom-ns-api-design-systems@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.97.0 + "@types/ramda": ~0.29.6 + ramda: ~0.29.1 + ramda-adjunct: ^4.1.1 + ts-mixer: ^6.0.3 + checksum: 1413919eff2b1d0a2962299ac32375707b1aaa1f8575778a2cd200dd4add1118d6191ad6501c73e4ffe9c48c35446d74dc86743821535d726e4c3d566acef2c6 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-asyncapi-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.97.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-json-schema-draft-7": ^0.97.0 + "@types/ramda": ~0.29.6 + ramda: ~0.29.1 + ramda-adjunct: ^4.1.1 + ts-mixer: ^6.0.3 + checksum: 13fff868db0ef2cc9ced74fb4e34a67fb15fb815228b81034a9dc4229ad5587acff58ee73e4c49494a1ee0f2f91b75f1c1d07fb43cb57370847b7dbab0af4ba3 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.97.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-ast": ^0.97.0 + "@swagger-api/apidom-core": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 8e993f6b8cd37cb9857a34437e2b16e087ccce524373726a167bf98ab622c44a03c47c81e218ff4b00aa7bd973a25bd696e2437c5fd018ace09ba2ad0fcda9de + checksum: 404dbc22dbc612753768af6f2d254ac9b85004fb4f16039513277b08e58528d305e4bc965f1dd2f4967df195723d0d887a6c9ed6948dc7cf98f1428b0aa3dcaf languageName: node linkType: hard -"@swagger-api/apidom-ns-asyncapi-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.92.0" +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-json-schema-draft-7": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: bef3de2c2a854590c8bb1cd892a5b170b65e14119a97528652457bf1e3e19f4a05d7da41ddb697f64de9972c8fad8afc7e6ccfa97ce8809fc9eba8c1305d509c + checksum: 7c8f4c12096bc7f029dee35d13a2675b970f6bb2cc03d0f698d4e4f9b3b239294eb1b3d8456edbaa1f29dbe2c89bfa58b0cd91084c3c2394d2692b5debe87675 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.92.0" +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.92.0 - "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 + "@swagger-api/apidom-ns-json-schema-draft-6": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 6b0d57acf1c34df314c401ab25d0feb3ad5638fc8c848f6b84c76691fef177a39a9e8ebfa16309d22c764d9bfb292ed5ad39943b2cece67dde746a6e9d5fdc12 + checksum: b59d769d67d718a5a9124164cf9f22408a0ef11457d3fd8e82c006096a17e20ad92def5711b6f7f12c7865232f5b01d8d30da95718b625223d67312a39e05cde languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.92.0" +"@swagger-api/apidom-ns-openapi-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-openapi-2@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 - checksum: 5660459753ff1359527e61820db59a6465ecc8b51cc5a6c14e155b2144b67570c6fc2c7c41d97617470d1478b85e26879fadc3f1ff4460c6309411c13db209e6 + ts-mixer: ^6.0.3 + checksum: bd9527915eaa454e290abbbc29ff59798e1be47e29ebf269b8aed799da25c507cd413b07c655c38cad2d442cc754970f91e1e657b46ec92df72bab71868face6 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.92.0" +"@swagger-api/apidom-ns-openapi-3-0@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 - "@swagger-api/apidom-ns-json-schema-draft-6": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 - checksum: 838d2b9917b4086880156e895d67adfd6400236e97b2a75814356dc55b0d45afd3e458bfe97b52af39aeea4c3483fc40f7a1551af14285977009513a168fb87c + ts-mixer: ^6.0.3 + checksum: 7d4d63af782486fa6899f8fbc8c01296d08973034605ff9433016a4e4233f595a27baa118f9b553225897aee3777d1a6db607b00089f551820e5dc2d0b4152da languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-openapi-2@npm:0.92.0" +"@swagger-api/apidom-ns-openapi-3-1@npm:>=0.97.0 <1.0.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.92.0 + "@swagger-api/apidom-ast": ^0.97.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 - checksum: 154de0b299a3ff0fcac40cf995dafb8c173cb4e294c75f952a9fa9cd5452eaab7783a9e5abb425fbc6e7135466155645e9b96fa9495f3effa7aec18f3152e6c3 + ts-mixer: ^6.0.3 + checksum: ab87430addb3e57d760e7435c1a09c107077c55213cd423d985e9a78c355123001f547b1637fcf9ba50af54c45be6dc4390cd1824d55e2b837f042e4ab0b3f36 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-0@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.92.0" +"@swagger-api/apidom-ns-workflows-1@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-ns-workflows-1@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 - checksum: 9ae883feea63c06f2514ba834b637bd00d6a56c35fe9b875507698d991199202d307a90bd06ebeaeb5642e3e42fe54238249858568c8a61a1797792fa5fff259 + ts-mixer: ^6.0.3 + checksum: 70079907606c264b82c591ec9bf659f210770d9facf5cea3ae8a3887aa6fdb61c4e1bc1988bea83c75000322e70873cdc0e4fd27132f19a9ffb97bb8b0ea04dd languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-1@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.92.0 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 - "@types/ramda": ~0.29.6 - ramda: ~0.29.1 - ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 - checksum: 316861ccd563d28c46039fa4202337f2266e0b99bf803bc71f64d307d824a74dcf7e4cdf7fc4ac25d6cf3521aebc74938c2001eb74ef0c364bc02470a1ffc723 - languageName: node - linkType: hard - -"@swagger-api/apidom-ns-workflows-1@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-ns-workflows-1@npm:0.92.0" - dependencies: - "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 - "@types/ramda": ~0.29.6 - ramda: ~0.29.1 - ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 - checksum: 684804790b58b52a28ae10ffc7fc2fa5bf6b99d8cb3e5d9409e28325c4d4b9ce5b5cc10e0cc401fb21788753ea65287e33db79337388afccd54f6902f60d9159 - languageName: node - linkType: hard - -"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.92.0" - dependencies: - "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-api-design-systems": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-api-design-systems": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: d9c361b8bb7b8a056acc2c52ef70a2d7304c511efc836cfebc315558ced7e93fe4e958dd554030a3315702d49ace30082ff7f2f91e9a76aaa2fff944a19fe39e + checksum: 36283626a9bd68d6d9c972666e6470fcaa3d45d57278d0f3aed6be37f9fe58fe842812fa082aca280456b21267b415c25b144aa636b1b588832925f795b8c508 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-api-design-systems": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-api-design-systems": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 248e61ed6e202eeab048c7c5e3eff0e0f2b6bfea958a02cbc6d8b831693a015d063db118af25c2e7380a4828ab84bf991764d200409a8eb99ffadb0dc6db65c0 + checksum: c5ca7eb0f789ebb86c89e5b098d62e2e1dd67e11be84362a85718dadf858cabdfab7da52f594adaa4ce06b112918f08f43b374aaf8e8723ca3ee4d0a97062a3a languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 0fc981bc839758af1b3a8dfa0695376919a515a11ae71e6f9f1e0c91dd1530aa659fa7405cb73109db28fd95f594f09b5ee941611cc4ce4f3d1817335b12ec4b + checksum: 1665752ed68e4ea4193cd2d5bd486d8c19db9a065804606f0b731af0e909a4cb312a0b1c55893a6b7221e38e32132a1dc40558327c9cebc2b7a768fad131edc6 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: a1554f73cc20b75df71296322f6bdf5b5a0f1d775bd9bff89d7798843606e1a383c48960ddc2b1f879c962d2d56962e6096c3000ec2ad6091d49627aa2992b2e + checksum: 365806b5475670b8556bd818c2507003a6e42158f563b954368d0de173a0f140b9b339bcb3f8f2eb883799444b926284fd05e65cbd18556cf01fb7e172f38537 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-json@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-json@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.92.0 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ast": ^0.97.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 "@types/ramda": ~0.29.6 node-gyp: latest ramda: ~0.29.1 ramda-adjunct: ^4.1.1 tree-sitter: =0.20.4 - tree-sitter-json: =0.20.1 + tree-sitter-json: =0.20.2 web-tree-sitter: =0.20.3 - checksum: ca66dd9fffaa84249398420b9cf2301721d2b173340e0f07097348b73654f54698a370a94d814d7f51b7e662f968054b7fc745607074dbd71892c53714a18b62 + checksum: 5aa68b41e496f527e4413d82183ca6dad6631f315cc9cedaf6e73a773d564cc7276f5f3e6710bbf5cea7c03980b88499752330a78abbb7c383f90b6f07da8c56 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 383827eec8fbc2bb36c095c8db4f8dce5264e5ffdfa7aca9a938d603294d99f0a552d57947222c160fbbbc1b79be7d08a7091348f3b373bbe25bd52a34bee529 + checksum: 61e012547438ab0bef23de008cdcabe479ac5447a0bd1375412b686a19655241eb26cb2197b3a5ed26969c1fc435eff9df33b74df1823f2efcc3d28650c339bb languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 592c1149d901a3c21594aca5c96a997382648ff559fb67cd6b75630440248a52f26df91ad96fa762e585e297725e20eb6f5623f91a6b6a5e2c950f57df4de760 + checksum: 3f4dab2959bb73c70beb2dcb79f9e026dad1975591dfe312fb321b5935097563ac977d0f8e7b9b5bbf171ad88c912a83abab2ca6eae3d2b31a36ee994d4ed0de languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: feaa0b825921ea9defde642b65a07049a8539905142baa113b3b5e90c76630a58ef2557a6f770740e32e5cfa46486fc9f7d3c468b8ec29aaa53cb507c4ad3469 + checksum: 5f7b30b231c3d371ffe7fb39a8f7c4607d4bdab13a0dc7f183146f189eef90cd90e63d7c1c67420e3f8b9c39d441ffe441da7ef0523c94904c9ee9bc93c08ebc languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: efd8dbd705592accadce53b25fc293ee48d1d11ec191f618df4243e6fdfea1add502ef3a5d433051883092dd29bf0a9f2026f2314a0cced1b8f04af59e63e995 + checksum: 1bcb9df1dc597601896ea80b41cb813b9134ef45b0f4982ee4dec878415f9fe38059fb05d6eb8651bbdf440204129dbb2d8698a28cb48e9e5490901af594f54f languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 47a034efae971b56d13e96bc64d0973a2015ca303bf63334117ebbcfb2b2676d50a0b68aa24ea5a3b669786a524035762d52ae1cc795f3c3dc65249297a23068 + checksum: b651c47b062f219f60235d0f184f485e1e3c9a47757d2363b28bfd3692176eda57b095b047b8f5ed3e2a733ff1b6a24ff7016ed45de5c610ea4135694b51ad86 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: c565913065e401109e7e4494f1024d24958959c742e5f842247a56eca6b75dcc9c3495a4c550912a62d62db896b2803bd317642336b4b18c851adc141fa38b61 + checksum: 0f1cc4538c7523246da1462ae5f2fd23dd5ac3dd31f71c79098c6561ea52a3fe38f577b629a68d51ca8282d908594136076ab1a58ef7b59e3c4afd21dd2f95a2 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-workflows-json-1@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-workflows-json-1@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-workflows-json-1@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-workflows-json-1@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-workflows-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-workflows-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 570f8323aaa5c67da3b5421d6ca6a9f0c3bf486a602584fa5969476e6a4943abe9a7f8f2bd7dfc1a7019286746e65cc76b050cadfabab276e0d452fbad4db59f + checksum: 42234b5609d32560f777cfc2d20e7cb56072c8e13b0451015cf2f5b61ab3f8348985e68a0dbb85ce65efc32ba17be6a4463e5cb5c44933d7604d31001b48726b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-ns-workflows-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-ns-workflows-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 020ecd34fb45ba57977377f71dc0b28ebba95b950bb873e1f6222eb6b544f91243dfb6b1f7555fe5f279d7bee044089337216a3f4b8e58612fb7066530938f32 + checksum: c5c7024be74365f42c98636bcad082de0dd1f5e4f7e3cdcee99cb5ca45aad21d04bd9cdf2304ed6e08274b63922c92bbe6267cbd75e9512e6bfa5ec68d57e341 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.92.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.92.0" +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.97.0": + version: 0.97.0 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.97.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.92.0 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ast": ^0.97.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 "@types/ramda": ~0.29.6 node-gyp: latest ramda: ~0.29.1 @@ -17759,37 +17758,37 @@ __metadata: tree-sitter: =0.20.4 tree-sitter-yaml: =0.5.0 web-tree-sitter: =0.20.3 - checksum: 1ee0bf2c2f7fed54ff194917034f31080ad4ad36e14dc2018c80d8bda38f8b6574ace974eca1a65aa336a86df375dabd0661215909551031e796dcee9d0d1a14 + checksum: d1d43dbda9990fec3cc0934d489ec66d229d5ae270dfdd26d35649daaed894871c880c743c7478d9ed1a96b5e9d4def038535572d2679f863e419922220465b0 languageName: node linkType: hard -"@swagger-api/apidom-reference@npm:>=0.90.0 <1.0.0": - version: 0.92.0 - resolution: "@swagger-api/apidom-reference@npm:0.92.0" +"@swagger-api/apidom-reference@npm:>=0.97.0 <1.0.0": + version: 0.97.1 + resolution: "@swagger-api/apidom-reference@npm:0.97.1" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.92.0 - "@swagger-api/apidom-error": ^0.92.0 - "@swagger-api/apidom-json-pointer": ^0.92.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.92.0 - "@swagger-api/apidom-ns-openapi-2": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 - "@swagger-api/apidom-ns-workflows-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.92.0 - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.92.0 - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-json": ^0.92.0 - "@swagger-api/apidom-parser-adapter-openapi-json-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.92.0 - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": ^0.92.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.92.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-workflows-json-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": ^0.92.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@swagger-api/apidom-core": ^0.97.0 + "@swagger-api/apidom-error": ^0.97.0 + "@swagger-api/apidom-json-pointer": ^0.97.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.97.0 + "@swagger-api/apidom-ns-openapi-2": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.97.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.97.0 + "@swagger-api/apidom-ns-workflows-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.97.0 + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.97.0 + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-json": ^0.97.0 + "@swagger-api/apidom-parser-adapter-openapi-json-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.97.0 + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": ^0.97.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.97.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-workflows-json-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": ^0.97.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.97.0 "@types/ramda": ~0.29.6 axios: ^1.4.0 minimatch: ^7.4.3 @@ -17840,7 +17839,7 @@ __metadata: optional: true "@swagger-api/apidom-parser-adapter-yaml-1-2": optional: true - checksum: 05b2c97233f2f60879d2dc62a811a4b31520acb7b3c730d47e60e5927f861c1bf1376e790648b773b242ccb1e24596c567014c570d123655dc59fc2c590668c7 + checksum: db92999b3b1f723c81b05d3c6992e440ec281d271d89dd005b7cdac56d21b0944fb1747deb535f9b485a0a765dfa1c6c71a8607514bb7080a94242e3056263b8 languageName: node linkType: hard @@ -43428,16 +43427,16 @@ __metadata: languageName: node linkType: hard -"swagger-client@npm:^3.25.3": - version: 3.25.3 - resolution: "swagger-client@npm:3.25.3" +"swagger-client@npm:^3.26.0": + version: 3.26.0 + resolution: "swagger-client@npm:3.26.0" dependencies: "@babel/runtime-corejs3": ^7.22.15 - "@swagger-api/apidom-core": ">=0.90.0 <1.0.0" - "@swagger-api/apidom-error": ">=0.90.0 <1.0.0" - "@swagger-api/apidom-json-pointer": ">=0.90.0 <1.0.0" - "@swagger-api/apidom-ns-openapi-3-1": ">=0.90.0 <1.0.0" - "@swagger-api/apidom-reference": ">=0.90.0 <1.0.0" + "@swagger-api/apidom-core": ">=0.97.0 <1.0.0" + "@swagger-api/apidom-error": ">=0.97.0 <1.0.0" + "@swagger-api/apidom-json-pointer": ">=0.97.0 <1.0.0" + "@swagger-api/apidom-ns-openapi-3-1": ">=0.97.0 <1.0.0" + "@swagger-api/apidom-reference": ">=0.97.0 <1.0.0" cookie: ~0.6.0 deepmerge: ~4.3.0 fast-json-patch: ^3.0.0-1 @@ -43447,15 +43446,15 @@ __metadata: node-fetch-commonjs: ^3.3.2 qs: ^6.10.2 traverse: ~0.6.6 - checksum: 01ef0298c6b078db42d3eb191d418cd82645cff35887c6e7f533940153c01f44265a2a03140b0d309b010843ea5bc3bf71edaf09e7090c59fcf25fda644c4c24 + checksum: 8897d7e8da535266475bdf8b85c31268f005276c13e8955e863e8502868ac6bcd86a4605d459eed9dd7e4eaf5ce6ef7b28b496b99fc912918e5a53361894a4df languageName: node linkType: hard "swagger-ui-react@npm:^5.0.0": - version: 5.11.8 - resolution: "swagger-ui-react@npm:5.11.8" + version: 5.12.0 + resolution: "swagger-ui-react@npm:5.12.0" dependencies: - "@babel/runtime-corejs3": ^7.23.9 + "@babel/runtime-corejs3": ^7.24.0 "@braintree/sanitize-url": =7.0.0 base64-js: ^1.5.1 classnames: ^2.5.1 @@ -43484,7 +43483,7 @@ __metadata: reselect: ^5.1.0 serialize-error: ^8.1.0 sha.js: ^2.4.11 - swagger-client: ^3.25.3 + swagger-client: ^3.26.0 url-parse: ^1.5.10 xml: =1.0.1 xml-but-prettier: ^1.0.1 @@ -43492,7 +43491,7 @@ __metadata: peerDependencies: react: ">=16.8.0 <19" react-dom: ">=16.8.0 <19" - checksum: 131a3421e182225368822e49944e72e51cae10d8263263fbd4bcc4c5eed9782314bb6b42ca471d9542393961c1305190c149cc19c7163b3ec1540f1e288509ce + checksum: 322611f2adf4d358920c324fe3a08711b490e53a6f2b706a50de16c04344acbea1050d705f59ea7945f7126ece061b44366c70a7d0e645185d8bd5e1ec8b608d languageName: node linkType: hard @@ -44111,13 +44110,13 @@ __metadata: languageName: node linkType: hard -"tree-sitter-json@npm:=0.20.1": - version: 0.20.1 - resolution: "tree-sitter-json@npm:0.20.1" +"tree-sitter-json@npm:=0.20.2": + version: 0.20.2 + resolution: "tree-sitter-json@npm:0.20.2" dependencies: nan: ^2.18.0 node-gyp: latest - checksum: fb77f3e3f148a4ce48a58ac478c5ab12fb5ea29b426fbf4978f07c659de982bfa62268c556e262ecc3ef192d50f7e6f6fe650abd566e6be87debb31332c81a26 + checksum: 4f5eba7fc86855d15510647e3e5803ea05a8cd5ab2a2a25c8d173a103ca02a6cc25b4cc925b3d234e31e6180f7eed4a50351d39e2c5254b06d6dd0fabeb6c3d8 languageName: node linkType: hard @@ -44223,6 +44222,13 @@ __metadata: languageName: node linkType: hard +"ts-mixer@npm:^6.0.3": + version: 6.0.4 + resolution: "ts-mixer@npm:6.0.4" + checksum: 36b1af526befd74345e736e9aa16f5c28876ebcea07784da14d929149fd7e6028cfd2fe9304c8efe8cb91b588443a9cc9e991df58e4c6e602326edbaae2af3ab + languageName: node + linkType: hard + "ts-morph@npm:^21.0.0": version: 21.0.1 resolution: "ts-morph@npm:21.0.1" From 0008f296b178f8551212ce6562640d56be5fc0aa Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Sun, 17 Mar 2024 17:27:27 +0100 Subject: [PATCH 157/219] fix: ajv warning for stricttypes Signed-off-by: aramissennyeydd --- plugins/tech-insights-backend-module-jsonfc/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tech-insights-backend-module-jsonfc/config.json b/plugins/tech-insights-backend-module-jsonfc/config.json index b95b5e52bb..347d4aa54f 100644 --- a/plugins/tech-insights-backend-module-jsonfc/config.json +++ b/plugins/tech-insights-backend-module-jsonfc/config.json @@ -109,7 +109,7 @@ ] }, "rule": { - "type": "string", + "type": "object", "required": ["conditions"], "properties": { "conditions": { From 6ce8c0be292c7cf8d632d95aa865ed59c0fbc6bd Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Sun, 17 Mar 2024 17:29:09 +0100 Subject: [PATCH 158/219] add changeset Signed-off-by: aramissennyeydd --- .changeset/popular-guests-tickle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/popular-guests-tickle.md diff --git a/.changeset/popular-guests-tickle.md b/.changeset/popular-guests-tickle.md new file mode 100644 index 0000000000..e442dae2d5 --- /dev/null +++ b/.changeset/popular-guests-tickle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend-module-jsonfc': patch +--- + +Fixes an invalid line in the schema that was causing AJV to complain. From 004d9c0c9f3469e227dd77ad22075c88fee7d0d5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:16:41 +0000 Subject: [PATCH 159/219] fix(deps): update dependency winston to v3.12.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index c47737344d..8d8a8c01dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46179,7 +46179,7 @@ __metadata: languageName: node linkType: hard -"winston-transport@npm:^4.5.0": +"winston-transport@npm:^4.5.0, winston-transport@npm:^4.7.0": version: 4.7.0 resolution: "winston-transport@npm:4.7.0" dependencies: @@ -46191,8 +46191,8 @@ __metadata: linkType: hard "winston@npm:^3.2.1": - version: 3.11.0 - resolution: "winston@npm:3.11.0" + version: 3.12.0 + resolution: "winston@npm:3.12.0" dependencies: "@colors/colors": ^1.6.0 "@dabh/diagnostics": ^2.0.2 @@ -46204,8 +46204,8 @@ __metadata: safe-stable-stringify: ^2.3.1 stack-trace: 0.0.x triple-beam: ^1.3.0 - winston-transport: ^4.5.0 - checksum: ca4454070f7a71b19f53c8c1765c59a013dab220edb49161b2e81917751d3e9edc3382430e4fb050feda04fb8463290ecab7cbc9240ec8d3d3b32a121849bbb0 + winston-transport: ^4.7.0 + checksum: 7549e90d471312f3678c86fc51c86da05717be0390ecc0dc1a312a57f4ab3eb22e4fae1829291a05334376db8caa5f118d1de019d8c67e5f031ed70678363703 languageName: node linkType: hard From f5f3636b26b9bc057191444cf7d06cb5c300191b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:17:50 +0000 Subject: [PATCH 160/219] fix(deps): update dependency yup to v1.4.0 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 c47737344d..0cd607ab38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46753,14 +46753,14 @@ __metadata: linkType: hard "yup@npm:^1.0.0": - version: 1.3.3 - resolution: "yup@npm:1.3.3" + version: 1.4.0 + resolution: "yup@npm:1.4.0" dependencies: property-expr: ^2.0.5 tiny-case: ^1.0.3 toposort: ^2.0.2 type-fest: ^2.19.0 - checksum: 7b9e19fedc85deb8cffd6b24617f79542c904f11a9c4ca8bb72fb003e61bd6c5278cc799fa9421c6a1a96ff04e7117bf0c000c9f10b543d6cd32a1e35e8f5f65 + checksum: 20a2ee0c1e891979ca16b34805b3a3be9ab4bea6ea3d2f9005b998b4dc992d0e4d7b53e5f4d8d9423420046630fb44fdf0ecf7e83bc34dd83392bca046c5229d languageName: node linkType: hard From fb716988088c94042751eab37e12876d1e1a7e8a Mon Sep 17 00:00:00 2001 From: Min Kim Date: Tue, 21 Nov 2023 23:20:43 -0500 Subject: [PATCH 161/219] Refactor create-app template to use the new backend Signed-off-by: Min Kim --- packages/create-app/src/lib/tasks.test.ts | 4 + packages/create-app/src/lib/versions.ts | 10 ++ .../packages/backend/package.json.hbs | 9 +- .../default-app/packages/backend/src/index.ts | 124 +++--------------- .../packages/backend/src/plugins/app.ts | 14 -- .../packages/backend/src/plugins/auth.ts | 54 -------- .../packages/backend/src/plugins/catalog.ts | 14 -- .../packages/backend/src/plugins/proxy.ts | 13 -- .../backend/src/plugins/scaffolder.ts | 22 ---- .../backend/src/plugins/search.ts.hbs | 66 ---------- .../packages/backend/src/plugins/techdocs.ts | 51 ------- 11 files changed, 38 insertions(+), 343 deletions(-) delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/app.ts delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/catalog.ts delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/proxy.ts delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs delete mode 100644 packages/create-app/templates/default-app/packages/backend/src/plugins/techdocs.ts diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index b1f5e17ba0..34a239ca48 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -51,6 +51,7 @@ jest.mock('./versions', () => ({ root: '1.2.3', '@backstage/cli': '1.0.0', '@backstage/backend-common': '1.0.0', + '@backstage/backend-defaults': '1.0.0', '@backstage/backend-tasks': '1.0.0', '@backstage/catalog-model': '1.0.0', '@backstage/catalog-client': '1.0.0', @@ -58,10 +59,13 @@ jest.mock('./versions', () => ({ '@backstage/plugin-app-backend': '1.0.0', '@backstage/plugin-auth-backend': '1.0.0', '@backstage/plugin-auth-node': '1.0.0', + '@backstage/plugin-auth-backend-module-github-provider': '1.0.0', '@backstage/plugin-catalog-backend': '1.0.0', '@backstage/plugin-catalog-backend-module-scaffolder-entity-model': '1.0.0', '@backstage/plugin-permission-common': '1.0.0', '@backstage/plugin-permission-node': '1.0.0', + '@backstage/plugin-permission-backend': '1.0.0', + '@backstage/plugin-permission-backend-module-allow-all-policy': '1.0.0', '@backstage/plugin-proxy-backend': '1.0.0', '@backstage/plugin-scaffolder-backend': '1.0.0', '@backstage/plugin-search-backend': '1.0.0', diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index 03ef32d921..ec96bafc1f 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -33,6 +33,7 @@ import { version as root } from '../../../../package.json'; import { version as appDefaults } from '../../../app-defaults/package.json'; import { version as backendCommon } from '../../../backend-common/package.json'; +import { version as backendDefaults } from '../../../backend-defaults/package.json'; import { version as backendTasks } from '../../../backend-tasks/package.json'; import { version as catalogClient } from '../../../catalog-client/package.json'; import { version as catalogModel } from '../../../catalog-model/package.json'; @@ -50,6 +51,7 @@ import { version as theme } from '../../../theme/package.json'; import { version as pluginApiDocs } from '../../../../plugins/api-docs/package.json'; import { version as pluginAppBackend } from '../../../../plugins/app-backend/package.json'; import { version as pluginAuthBackend } from '../../../../plugins/auth-backend/package.json'; +import { version as pluginAuthBackendModuleGithubProvider } from '../../../../plugins/auth-backend-module-github-provider/package.json'; import { version as pluginAuthNode } from '../../../../plugins/auth-node/package.json'; import { version as pluginCatalog } from '../../../../plugins/catalog/package.json'; import { version as pluginCatalogCommon } from '../../../../plugins/catalog-common/package.json'; @@ -62,6 +64,8 @@ import { version as pluginExplore } from '../../../../plugins/explore/package.js import { version as pluginGithubActions } from '../../../../plugins/github-actions/package.json'; import { version as pluginLighthouse } from '../../../../plugins/lighthouse/package.json'; import { version as pluginOrg } from '../../../../plugins/org/package.json'; +import { version as pluginPermissionBackend } from '../../../../plugins/permission-backend/package.json'; +import { version as pluginPermissionBackendModulePolicyAllowAll } from '../../../../plugins/permission-backend-module-policy-allow-all/package.json'; import { version as pluginPermissionCommon } from '../../../../plugins/permission-common/package.json'; import { version as pluginPermissionReact } from '../../../../plugins/permission-react/package.json'; import { version as pluginPermissionNode } from '../../../../plugins/permission-node/package.json'; @@ -87,6 +91,7 @@ export const packageVersions = { root, '@backstage/app-defaults': appDefaults, '@backstage/backend-common': backendCommon, + '@backstage/backend-defaults': backendDefaults, '@backstage/backend-tasks': backendTasks, '@backstage/catalog-client': catalogClient, '@backstage/catalog-model': catalogModel, @@ -101,6 +106,8 @@ export const packageVersions = { '@backstage/plugin-api-docs': pluginApiDocs, '@backstage/plugin-app-backend': pluginAppBackend, '@backstage/plugin-auth-backend': pluginAuthBackend, + '@backstage/plugin-auth-backend-module-github-provider': + pluginAuthBackendModuleGithubProvider, '@backstage/plugin-auth-node': pluginAuthNode, '@backstage/plugin-catalog': pluginCatalog, '@backstage/plugin-catalog-common': pluginCatalogCommon, @@ -114,6 +121,9 @@ export const packageVersions = { '@backstage/plugin-github-actions': pluginGithubActions, '@backstage/plugin-lighthouse': pluginLighthouse, '@backstage/plugin-org': pluginOrg, + '@backstage/plugin-permission-backend': pluginPermissionBackend, + '@backstage/plugin-permission-backend-module-allow-all-policy': + pluginPermissionBackendModulePolicyAllowAll, '@backstage/plugin-permission-common': pluginPermissionCommon, '@backstage/plugin-permission-node': pluginPermissionNode, '@backstage/plugin-permission-react': pluginPermissionReact, diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs index f3ed808afe..b9c0c75a77 100644 --- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs @@ -17,30 +17,29 @@ }, "dependencies": { "@backstage/backend-common": "^{{version '@backstage/backend-common'}}", + "@backstage/backend-defaults": "^{{version '@backstage/backend-defaults'}}", "@backstage/backend-tasks": "^{{version '@backstage/backend-tasks'}}", - "@backstage/catalog-client": "^{{version '@backstage/catalog-client'}}", - "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}", "@backstage/config": "^{{version '@backstage/config'}}", "@backstage/plugin-app-backend": "^{{version '@backstage/plugin-app-backend'}}", "@backstage/plugin-auth-backend": "^{{version '@backstage/plugin-auth-backend'}}", + "@backstage/plugin-auth-backend-module-github-provider": "^{{version '@backstage/plugin-auth-backend-module-github-provider'}}", "@backstage/plugin-auth-node": "^{{version '@backstage/plugin-auth-node'}}", "@backstage/plugin-catalog-backend": "^{{version '@backstage/plugin-catalog-backend'}}", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^{{version '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'}}", + "@backstage/plugin-permission-backend": "^{{version '@backstage/plugin-permission-backend'}}", + "@backstage/plugin-permission-backend-module-allow-all-policy": "^{{version '@backstage/plugin-permission-backend-module-allow-all-policy'}}", "@backstage/plugin-permission-common": "^{{version '@backstage/plugin-permission-common'}}", "@backstage/plugin-permission-node": "^{{version '@backstage/plugin-permission-node'}}", "@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}", "@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}", "@backstage/plugin-search-backend": "^{{version '@backstage/plugin-search-backend'}}", "@backstage/plugin-search-backend-module-catalog": "^{{version '@backstage/plugin-search-backend-module-catalog'}}", - "@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}", "@backstage/plugin-search-backend-module-techdocs": "^{{version '@backstage/plugin-search-backend-module-techdocs'}}", "@backstage/plugin-search-backend-node": "^{{version '@backstage/plugin-search-backend-node'}}", "@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}", "app": "link:../app", "better-sqlite3": "^9.0.0", "dockerode": "^3.3.1", - "express": "^4.17.1", - "express-promise-router": "^4.1.0", "node-gyp": "^9.0.0", "pg": "^8.11.3", "winston": "^3.2.1" diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 04c4ff9392..f10c5a9aab 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -6,110 +6,26 @@ * Happy hacking! */ -import Router from 'express-promise-router'; -import { - createServiceBuilder, - loadBackendConfig, - getRootLogger, - useHotMemoize, - notFoundHandler, - CacheManager, - DatabaseManager, - HostDiscovery, - UrlReaders, - ServerTokenManager, -} from '@backstage/backend-common'; -import { TaskScheduler } from '@backstage/backend-tasks'; -import { Config } from '@backstage/config'; -import app from './plugins/app'; -import auth from './plugins/auth'; -import catalog from './plugins/catalog'; -import scaffolder from './plugins/scaffolder'; -import proxy from './plugins/proxy'; -import techdocs from './plugins/techdocs'; -import search from './plugins/search'; -import { PluginEnvironment } from './types'; -import { ServerPermissionClient } from '@backstage/plugin-permission-node'; -import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; +import { createBackend } from '@backstage/backend-defaults'; -function makeCreateEnv(config: Config) { - const root = getRootLogger(); - const reader = UrlReaders.default({ logger: root, config }); - const discovery = HostDiscovery.fromConfig(config); - const cacheManager = CacheManager.fromConfig(config); - const databaseManager = DatabaseManager.fromConfig(config, { logger: root }); - const tokenManager = ServerTokenManager.noop(); - const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); +const backend = createBackend(); - const identity = DefaultIdentityClient.create({ - discovery, - }); - const permissions = ServerPermissionClient.fromConfig(config, { - discovery, - tokenManager, - }); +backend.add(import('@backstage/plugin-app-backend/alpha')); +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-github-provider')); +backend.add(import('@backstage/plugin-catalog-backend/alpha')); +backend.add( + import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), +); +backend.add(import('@backstage/plugin-permission-backend/alpha')); +backend.add( + import('@backstage/plugin-permission-backend-module-allow-all-policy'), +); +backend.add(import('@backstage/plugin-proxy-backend/alpha')); +backend.add(import('@backstage/plugin-scaffolder-backend/alpha')); +backend.add(import('@backstage/plugin-search-backend/alpha')); +backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha')); +backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha')); +backend.add(import('@backstage/plugin-techdocs-backend/alpha')); - root.info(`Created UrlReader ${reader}`); - - return (plugin: string): PluginEnvironment => { - const logger = root.child({ type: 'plugin', plugin }); - const database = databaseManager.forPlugin(plugin); - const cache = cacheManager.forPlugin(plugin); - const scheduler = taskScheduler.forPlugin(plugin); - return { - logger, - database, - cache, - config, - reader, - discovery, - tokenManager, - scheduler, - permissions, - identity, - }; - }; -} - -async function main() { - const config = await loadBackendConfig({ - argv: process.argv, - logger: getRootLogger(), - }); - const createEnv = makeCreateEnv(config); - - const catalogEnv = useHotMemoize(module, () => createEnv('catalog')); - const scaffolderEnv = useHotMemoize(module, () => createEnv('scaffolder')); - const authEnv = useHotMemoize(module, () => createEnv('auth')); - const proxyEnv = useHotMemoize(module, () => createEnv('proxy')); - const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs')); - const searchEnv = useHotMemoize(module, () => createEnv('search')); - const appEnv = useHotMemoize(module, () => createEnv('app')); - - const apiRouter = Router(); - apiRouter.use('/catalog', await catalog(catalogEnv)); - apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv)); - apiRouter.use('/auth', await auth(authEnv)); - apiRouter.use('/techdocs', await techdocs(techdocsEnv)); - apiRouter.use('/proxy', await proxy(proxyEnv)); - apiRouter.use('/search', await search(searchEnv)); - - // Add backends ABOVE this line; this 404 handler is the catch-all fallback - apiRouter.use(notFoundHandler()); - - const service = createServiceBuilder(module) - .loadConfig(config) - .addRouter('/api', apiRouter) - .addRouter('', await app(appEnv)); - - await service.start().catch(err => { - console.log(err); - process.exit(1); - }); -} - -module.hot?.accept(); -main().catch(error => { - console.error('Backend failed to start up', error); - process.exit(1); -}); +backend.start(); diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/app.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/app.ts deleted file mode 100644 index 7c37f68467..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/app.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { createRouter } from '@backstage/plugin-app-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - return await createRouter({ - logger: env.logger, - config: env.config, - database: env.database, - appPackageName: 'app', - }); -} diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts deleted file mode 100644 index 77eb6aae21..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/auth.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - createRouter, - providers, - defaultAuthProviderFactories, -} from '@backstage/plugin-auth-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - return await createRouter({ - logger: env.logger, - config: env.config, - database: env.database, - discovery: env.discovery, - tokenManager: env.tokenManager, - providerFactories: { - ...defaultAuthProviderFactories, - - // This replaces the default GitHub auth provider with a customized one. - // The `signIn` option enables sign-in for this provider, using the - // identity resolution logic that's provided in the `resolver` callback. - // - // This particular resolver makes all users share a single "guest" identity. - // It should only be used for testing and trying out Backstage. - // - // If you want to use a production ready resolver you can switch to - // the one that is commented out below, it looks up a user entity in the - // catalog using the GitHub username of the authenticated user. - // That resolver requires you to have user entities populated in the catalog, - // for example using https://backstage.io/docs/integrations/github/org - // - // There are other resolvers to choose from, and you can also create - // your own, see the auth documentation for more details: - // - // https://backstage.io/docs/auth/identity-resolver - github: providers.github.create({ - signIn: { - resolver(_, ctx) { - const userRef = 'user:default/guest'; // Must be a full entity reference - return ctx.issueToken({ - claims: { - sub: userRef, // The user's own identity - ent: [userRef], // A list of identities that the user claims ownership through - }, - }); - }, - // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), - }, - }), - }, - }); -} diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/catalog.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/catalog.ts deleted file mode 100644 index 4decdca1c4..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/catalog.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -import { ScaffolderEntitiesProcessor } from '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - builder.addProcessor(new ScaffolderEntitiesProcessor()); - const { processingEngine, router } = await builder.build(); - await processingEngine.start(); - return router; -} diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/proxy.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/proxy.ts deleted file mode 100644 index 54ec3937e9..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/proxy.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createRouter } from '@backstage/plugin-proxy-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - return await createRouter({ - logger: env.logger, - config: env.config, - discovery: env.discovery, - }); -} diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts deleted file mode 100644 index a12fee2295..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CatalogClient } from '@backstage/catalog-client'; -import { createRouter } from '@backstage/plugin-scaffolder-backend'; -import { Router } from 'express'; -import type { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const catalogClient = new CatalogClient({ - discoveryApi: env.discovery, - }); - - return await createRouter({ - logger: env.logger, - config: env.config, - database: env.database, - reader: env.reader, - catalogClient, - identity: env.identity, - permissions: env.permissions, - }); -} diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs deleted file mode 100644 index 467ac60a5a..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts.hbs +++ /dev/null @@ -1,66 +0,0 @@ -import { useHotCleanup } from '@backstage/backend-common'; -import { createRouter } from '@backstage/plugin-search-backend'; -import { - IndexBuilder, - LunrSearchEngine, -} from '@backstage/plugin-search-backend-node'; -import { PluginEnvironment } from '../types'; -import { DefaultCatalogCollatorFactory } from '@backstage/plugin-search-backend-module-catalog'; -import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs'; -import { Router } from 'express'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - // Initialize a connection to a search engine. - const searchEngine = new LunrSearchEngine({ - logger: env.logger, - }); - const indexBuilder = new IndexBuilder({ - logger: env.logger, - searchEngine, - }); - - const schedule = env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 10 }, - timeout: { minutes: 15 }, - // A 3 second delay gives the backend server a chance to initialize before - // any collators are executed, which may attempt requests against the API. - initialDelay: { seconds: 3 }, - }); - - // Collators are responsible for gathering documents known to plugins. This - // collator gathers entities from the software catalog. - indexBuilder.addCollator({ - schedule, - factory: DefaultCatalogCollatorFactory.fromConfig(env.config, { - discovery: env.discovery, - tokenManager: env.tokenManager, - }), - }); - - // collator gathers entities from techdocs. - indexBuilder.addCollator({ - schedule, - factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, { - discovery: env.discovery, - logger: env.logger, - tokenManager: env.tokenManager, - }), - }); - - // The scheduler controls when documents are gathered from collators and sent - // to the search engine for indexing. - const { scheduler } = await indexBuilder.build(); - scheduler.start(); - - useHotCleanup(module, () => scheduler.stop()); - - return await createRouter({ - engine: indexBuilder.getSearchEngine(), - types: indexBuilder.getDocumentTypes(), - permissions: env.permissions, - config: env.config, - logger: env.logger, - }); -} diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/techdocs.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/techdocs.ts deleted file mode 100644 index be8bb0c06f..0000000000 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/techdocs.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { DockerContainerRunner } from '@backstage/backend-common'; -import { - createRouter, - Generators, - Preparers, - Publisher, -} from '@backstage/plugin-techdocs-backend'; -import Docker from 'dockerode'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - // Preparers are responsible for fetching source files for documentation. - const preparers = await Preparers.fromConfig(env.config, { - logger: env.logger, - reader: env.reader, - }); - - // Docker client (conditionally) used by the generators, based on techdocs.generators config. - const dockerClient = new Docker(); - const containerRunner = new DockerContainerRunner({ dockerClient }); - - // Generators are used for generating documentation sites. - const generators = await Generators.fromConfig(env.config, { - logger: env.logger, - containerRunner, - }); - - // Publisher is used for - // 1. Publishing generated files to storage - // 2. Fetching files from storage and passing them to TechDocs frontend. - const publisher = await Publisher.fromConfig(env.config, { - logger: env.logger, - discovery: env.discovery, - }); - - // checks if the publisher is working and logs the result - await publisher.getReadiness(); - - return await createRouter({ - preparers, - generators, - publisher, - logger: env.logger, - config: env.config, - discovery: env.discovery, - cache: env.cache, - }); -} From 829a2492bd72d5b8c64997ef10d8aeb1bd993ba3 Mon Sep 17 00:00:00 2001 From: Min Kim Date: Wed, 20 Dec 2023 09:44:53 -0500 Subject: [PATCH 162/219] Add changeset Signed-off-by: Min Kim --- .changeset/gold-mangos-agree.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/gold-mangos-agree.md diff --git a/.changeset/gold-mangos-agree.md b/.changeset/gold-mangos-agree.md new file mode 100644 index 0000000000..9afd7979e3 --- /dev/null +++ b/.changeset/gold-mangos-agree.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Migrated the backend of the create app template to use the new backend system. For information on how to migrate your existing backend, see the [migration guide](https://backstage.io/docs/backend-system/building-backends/migrating). From fd7b543c793bc038f2065fa572fe6c1d2c8c769c Mon Sep 17 00:00:00 2001 From: Min Kim Date: Thu, 28 Dec 2023 10:51:19 -0500 Subject: [PATCH 163/219] Organize backend imports and add comments Signed-off-by: Min Kim --- .../default-app/packages/backend/src/index.ts | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index f10c5a9aab..d2502955fb 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -11,21 +11,25 @@ import { createBackend } from '@backstage/backend-defaults'; const backend = createBackend(); backend.add(import('@backstage/plugin-app-backend/alpha')); -backend.add(import('@backstage/plugin-auth-backend')); -backend.add(import('@backstage/plugin-auth-backend-module-github-provider')); -backend.add(import('@backstage/plugin-catalog-backend/alpha')); -backend.add( - import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), -); -backend.add(import('@backstage/plugin-permission-backend/alpha')); -backend.add( - import('@backstage/plugin-permission-backend-module-allow-all-policy'), -); backend.add(import('@backstage/plugin-proxy-backend/alpha')); backend.add(import('@backstage/plugin-scaffolder-backend/alpha')); +backend.add(import('@backstage/plugin-techdocs-backend/alpha')); + +// auth plugin +backend.add(import('@backstage/plugin-auth-backend')); + // See https://backstage.io/docs/backend-system/building-backends/migrating#the-auth-plugin + +// catalog plugin +backend.add(import('@backstage/plugin-catalog-backend/alpha')); +backend.add(import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model')); + +// permission plugin +backend.add(import('@backstage/plugin-permission-backend/alpha')); +backend.add(import('@backstage/plugin-permission-backend-module-allow-all-policy')); + +// search plugin backend.add(import('@backstage/plugin-search-backend/alpha')); backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha')); backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha')); -backend.add(import('@backstage/plugin-techdocs-backend/alpha')); backend.start(); From 0bc478c1c5fb66bd74b181556b1cc9264d9c76e3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 20:34:08 +0000 Subject: [PATCH 164/219] chore(deps): update dependency knip to v5.1.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 64a90090b0..d981fee7e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33470,8 +33470,8 @@ __metadata: linkType: hard "knip@npm:^5.0.0": - version: 5.1.1 - resolution: "knip@npm:5.1.1" + version: 5.1.2 + resolution: "knip@npm:5.1.2" dependencies: "@ericcornelissen/bash-parser": 0.5.2 "@nodelib/fs.walk": 2.0.0 @@ -33500,7 +33500,7 @@ __metadata: typescript: ">=5.0.4" bin: knip: bin/knip.js - checksum: 33fd81860f9dc5b3ad58ca13c4874443c68d4dc4f07061bfd3d0fb2336b68271362d92e4a739a8d422d7de78fdd0beed470e4fa94c2a2e84c54ab1deac4f5f8f + checksum: ff27c3ffa20b188ac2bc7a84b6aff49016236fa41c57b4c6650e5dae0d292747159e08045aabf858d24195214a3421bef73651235530828c1d238a598f68b95f languageName: node linkType: hard From 0d72065dfd74f2bab6ffaca06605d47c8655b0a5 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 Mar 2024 21:13:07 +0100 Subject: [PATCH 165/219] cli: fix backend dev watch mode Signed-off-by: Patrik Oldsberg --- .changeset/six-shirts-vanish.md | 5 + packages/cli/config/nodeTransform.cjs | 39 +++ packages/cli/knip-report.md | 3 +- packages/cli/package.json | 2 +- .../experimental/startBackendExperimental.ts | 36 ++- yarn.lock | 267 +----------------- 6 files changed, 74 insertions(+), 278 deletions(-) create mode 100644 .changeset/six-shirts-vanish.md create mode 100644 packages/cli/config/nodeTransform.cjs diff --git a/.changeset/six-shirts-vanish.md b/.changeset/six-shirts-vanish.md new file mode 100644 index 0000000000..dca3e0d0fc --- /dev/null +++ b/.changeset/six-shirts-vanish.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': minor +--- + +The backend devlopment server transpilation has been replaced with a simplified solution based on SWC, which is already the transpiler used for tests. This fixed an issue where never versions of the `tsx` dependency had a new contract for signalling dependencies, breaking watch mode. This change fixed file watches as well as enables sourcemaps. diff --git a/packages/cli/config/nodeTransform.cjs b/packages/cli/config/nodeTransform.cjs new file mode 100644 index 0000000000..0f64fb931d --- /dev/null +++ b/packages/cli/config/nodeTransform.cjs @@ -0,0 +1,39 @@ +/* + * 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. + */ + +const { transformSync } = require('@swc/core'); +const { addHook } = require('pirates'); + +addHook( + (code, filename) => { + const transformed = transformSync(code, { + filename, + sourceMaps: 'inline', + module: { type: 'commonjs' }, + }); + process.send?.({ type: 'watch', path: filename }); + return transformed.code; + }, + { extensions: ['.ts', '.cts'], ignoreNodeModules: true }, +); + +addHook( + (code, filename) => { + process.send?.({ type: 'watch', path: filename }); + return code; + }, + { extensions: ['.js', '.cjs'], ignoreNodeModules: true }, +); diff --git a/packages/cli/knip-report.md b/packages/cli/knip-report.md index fa42f97d33..84e38cc861 100644 --- a/packages/cli/knip-report.md +++ b/packages/cli/knip-report.md @@ -1,6 +1,6 @@ # Knip report -## Unused dependencies (27) +## Unused dependencies (28) | Name | Location | Severity | | :------------------------------- | :----------- | :------- | @@ -25,6 +25,7 @@ | @swc/core | package.json | error | | @swc/jest | package.json | error | | esbuild | package.json | error | +| pirates | package.json | error | | postcss | package.json | error | | process | package.json | error | | sucrase | package.json | error | diff --git a/packages/cli/package.json b/packages/cli/package.json index 1af0ef03b7..f633d1f607 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -114,6 +114,7 @@ "ora": "^5.3.0", "p-limit": "^3.1.0", "p-queue": "^6.6.2", + "pirates": "^4.0.6", "postcss": "^8.1.0", "process": "^0.11.10", "react-dev-utils": "^12.0.0-next.60", @@ -131,7 +132,6 @@ "swc-loader": "^0.2.3", "tar": "^6.1.12", "terser-webpack-plugin": "^5.1.3", - "tsx": "^4.0.0", "util": "^0.12.3", "webpack": "^5.70.0", "webpack-dev-server": "^4.7.3", diff --git a/packages/cli/src/lib/experimental/startBackendExperimental.ts b/packages/cli/src/lib/experimental/startBackendExperimental.ts index 0ca3b182b5..19f71aa993 100644 --- a/packages/cli/src/lib/experimental/startBackendExperimental.ts +++ b/packages/cli/src/lib/experimental/startBackendExperimental.ts @@ -22,22 +22,16 @@ import { ctrlc } from 'ctrlc-windows'; import { IpcServer } from './IpcServer'; import { ServerDataStore } from './ServerDataStore'; import debounce from 'lodash/debounce'; -import { fileURLToPath, pathToFileURL } from 'url'; +import { fileURLToPath } from 'url'; import { isAbsolute as isAbsolutePath } from 'path'; import { paths } from '../paths'; import spawn from 'cross-spawn'; -const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(Number); -const supportsModuleLoaderRegister = - nodeMajor > 20 || - (nodeMajor === 20 && nodeMinor >= 6) || - (nodeMajor === 18 && nodeMinor >= 19); - const loaderArgs = [ + '--enable-source-maps', '--require', - require.resolve('tsx/preflight'), - supportsModuleLoaderRegister ? '--import' : '--loader', - pathToFileURL(require.resolve('tsx')).toString(), // Windows prefers a URL here + require.resolve('@backstage/cli/config/nodeTransform.cjs'), + // TODO: Support modules, although there's currently no way to load them since import() is transpiled tp require() ]; export async function startBackendExperimental(options: BackendServeOptions) { @@ -51,11 +45,21 @@ export async function startBackendExperimental(options: BackendServeOptions) { ServerDataStore.bind(server); let exiting = false; + let firstStart = true; let child: ChildProcess | undefined; let watcher: FSWatcher | undefined = undefined; let shutdownPromise: Promise | undefined = undefined; + const watchedPaths = new Set(); + const restart = debounce(async () => { + if (firstStart) { + firstStart = false; + } else { + console.log(); + console.log('Change detected, restarting the development server...'); + console.log(); + } // If a re-trigger happens during an existing shutdown, we just ignore it if (shutdownPromise) { return; @@ -115,14 +119,18 @@ export async function startBackendExperimental(options: BackendServeOptions) { // This captures messages sent by @esbuild-kit/cjs-loader child.on('message', (data: { type?: string } | null) => { - if (typeof data === 'object' && data?.type === 'dependency') { + if (!watcher) { + return; + } + if (typeof data === 'object' && data?.type === 'watch') { let path = (data as { path: string }).path; if (path.startsWith('file:')) { path = fileURLToPath(path); } - if (isAbsolutePath(path)) { - watcher?.add(path); + if (isAbsolutePath(path) && !watchedPaths.has(path)) { + watchedPaths.add(path); + watcher.add(path); } } }); @@ -130,7 +138,7 @@ export async function startBackendExperimental(options: BackendServeOptions) { restart(); - watcher = watch([], { + watcher = watch(['./package.json'], { cwd: process.cwd(), ignoreInitial: true, ignorePermissionErrors: true, diff --git a/yarn.lock b/yarn.lock index 64a90090b0..d2b6b8b95b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3692,6 +3692,7 @@ __metadata: ora: ^5.3.0 p-limit: ^3.1.0 p-queue: ^6.6.2 + pirates: ^4.0.6 postcss: ^8.1.0 process: ^0.11.10 react-dev-utils: ^12.0.0-next.60 @@ -3710,7 +3711,6 @@ __metadata: tar: ^6.1.12 terser-webpack-plugin: ^5.1.3 ts-node: ^10.0.0 - tsx: ^4.0.0 util: ^0.12.3 webpack: ^5.70.0 webpack-dev-server: ^4.7.3 @@ -10957,13 +10957,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/aix-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/aix-ppc64@npm:0.20.2" @@ -10978,13 +10971,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm64@npm:0.20.2" @@ -10999,13 +10985,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm@npm:0.20.2" @@ -11020,13 +10999,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-x64@npm:0.20.2" @@ -11041,13 +11013,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-arm64@npm:0.20.2" @@ -11062,13 +11027,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-x64@npm:0.20.2" @@ -11083,13 +11041,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-arm64@npm:0.20.2" @@ -11104,13 +11055,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-x64@npm:0.20.2" @@ -11125,13 +11069,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm64@npm:0.20.2" @@ -11146,13 +11083,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm@npm:0.20.2" @@ -11167,13 +11097,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ia32@npm:0.20.2" @@ -11188,13 +11111,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-loong64@npm:0.20.2" @@ -11209,13 +11125,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-mips64el@npm:0.20.2" @@ -11230,13 +11139,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ppc64@npm:0.20.2" @@ -11251,13 +11153,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-riscv64@npm:0.20.2" @@ -11272,13 +11167,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-s390x@npm:0.20.2" @@ -11293,13 +11181,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-x64@npm:0.20.2" @@ -11314,13 +11195,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/netbsd-x64@npm:0.20.2" @@ -11335,13 +11209,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/openbsd-x64@npm:0.20.2" @@ -11356,13 +11223,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/sunos-x64@npm:0.20.2" @@ -11377,13 +11237,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-arm64@npm:0.20.2" @@ -11398,13 +11251,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-ia32@npm:0.20.2" @@ -11419,13 +11265,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-x64@npm:0.20.2" @@ -26909,86 +26748,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:~0.19.10": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f - languageName: node - linkType: hard - "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -29066,7 +28825,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -29085,7 +28844,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" dependencies: @@ -29323,7 +29082,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.2": +"get-tsconfig@npm:^4.7.0": version: 4.7.2 resolution: "get-tsconfig@npm:4.7.2" dependencies: @@ -38240,7 +37999,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.5": +"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.5, pirates@npm:^4.0.6": version: 4.0.6 resolution: "pirates@npm:4.0.6" checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 @@ -44328,22 +44087,6 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.0.0": - version: 4.7.1 - resolution: "tsx@npm:4.7.1" - dependencies: - esbuild: ~0.19.10 - fsevents: ~2.3.3 - get-tsconfig: ^4.7.2 - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 7f77294c0eee9a9b203f89eb299ee80b393d6b4bf79ec01b650502213a23ea08d0dfc52e938b302ef27c97b70557f7f5a590c3174a7e3c8f1140c668eea4a3a2 - languageName: node - linkType: hard - "tty-browserify@npm:0.0.0": version: 0.0.0 resolution: "tty-browserify@npm:0.0.0" From 1bd4596c995f3210f150eb1310248752d1253b29 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 Mar 2024 21:25:52 +0100 Subject: [PATCH 166/219] replaced usage to ts-node with CLI nodeTransform Signed-off-by: Patrik Oldsberg --- .changeset/giant-pots-dream.md | 9 +++++++++ .github/workflows/sync_snyk-github-issues.yml | 2 +- package.json | 1 - packages/cli/bin/backstage-cli | 10 +--------- packages/cli/knip-report.md | 3 +-- packages/cli/package.json | 3 +-- packages/codemods/bin/backstage-codemods | 10 +--------- packages/codemods/knip-report.md | 6 ------ packages/codemods/package.json | 3 +-- packages/create-app/bin/backstage-create-app | 11 +---------- packages/create-app/knip-report.md | 3 +-- packages/create-app/package.json | 3 +-- packages/e2e-test/bin/e2e-test | 12 +----------- packages/e2e-test/knip-report.md | 3 +-- packages/e2e-test/package.json | 3 +-- packages/repo-tools/bin/backstage-repo-tools | 10 +--------- packages/repo-tools/knip-report.md | 3 +-- packages/repo-tools/package.json | 1 - packages/techdocs-cli/bin/techdocs-cli | 9 +-------- packages/techdocs-cli/knip-report.md | 3 +-- packages/techdocs-cli/package.json | 3 +-- scripts/snyk-github-issue-sync.ts | 2 +- yarn.lock | 9 +-------- 23 files changed, 28 insertions(+), 94 deletions(-) create mode 100644 .changeset/giant-pots-dream.md diff --git a/.changeset/giant-pots-dream.md b/.changeset/giant-pots-dream.md new file mode 100644 index 0000000000..2baeb866a2 --- /dev/null +++ b/.changeset/giant-pots-dream.md @@ -0,0 +1,9 @@ +--- +'@techdocs/cli': patch +'@backstage/create-app': patch +'@backstage/repo-tools': patch +'@backstage/codemods': patch +'@backstage/cli': patch +--- + +Removed the `ts-node` dev dependency. diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 638f5213be..149fc32958 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -43,6 +43,6 @@ jobs: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} NODE_OPTIONS: --max-old-space-size=7168 - name: Update Github issues - run: yarn ts-node scripts/snyk-github-issue-sync.ts + run: ./scripts/snyk-github-issue-sync.ts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index 98ec78baab..ed8f5cdedc 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,6 @@ "shx": "^0.3.2", "sloc": "^0.3.1", "sort-package-json": "^2.8.0", - "ts-node": "^10.4.0", "typescript": "~5.1.0" }, "packageManager": "yarn@3.2.3", diff --git a/packages/cli/bin/backstage-cli b/packages/cli/bin/backstage-cli index 9aa82f6c2a..b721c8d3c1 100755 --- a/packages/cli/bin/backstage-cli +++ b/packages/cli/bin/backstage-cli @@ -24,14 +24,6 @@ const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); if (!isLocal || process.env.BACKSTAGE_E2E_CLI_TEST) { require('..'); } else { - require('ts-node').register({ - transpileOnly: true, - /* eslint-disable-next-line no-restricted-syntax */ - project: path.resolve(__dirname, '../../../tsconfig.json'), - compilerOptions: { - module: 'CommonJS', - }, - }); - + require('@backstage/cli/config/nodeTransform.cjs'); require('../src'); } diff --git a/packages/cli/knip-report.md b/packages/cli/knip-report.md index 84e38cc861..16926bb87d 100644 --- a/packages/cli/knip-report.md +++ b/packages/cli/knip-report.md @@ -33,7 +33,7 @@ | glob | package.json | error | | util | package.json | error | -## Unused devDependencies (12) +## Unused devDependencies (11) | Name | Location | Severity | | :-------------------------------------- | :----------- | :------- | @@ -47,7 +47,6 @@ | @types/svgo | package.json | error | | @types/ejs | package.json | error | | nodemon | package.json | error | -| ts-node | package.json | error | | del | package.json | error | ## Referenced optional peerDependencies (4) diff --git a/packages/cli/package.json b/packages/cli/package.json index f633d1f607..f1214e3320 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -170,8 +170,7 @@ "@types/yarnpkg__lockfile": "^1.1.4", "del": "^7.0.0", "msw": "^1.0.0", - "nodemon": "^3.0.1", - "ts-node": "^10.0.0" + "nodemon": "^3.0.1" }, "peerDependencies": { "@vitejs/plugin-react": "^4.0.4", diff --git a/packages/codemods/bin/backstage-codemods b/packages/codemods/bin/backstage-codemods index 0bc4088cae..a43ae6324b 100755 --- a/packages/codemods/bin/backstage-codemods +++ b/packages/codemods/bin/backstage-codemods @@ -24,14 +24,6 @@ const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); if (!isLocal) { require('..'); } else { - require('ts-node').register({ - transpileOnly: true, - /* eslint-disable-next-line no-restricted-syntax */ - project: path.resolve(__dirname, '../../../tsconfig.json'), - compilerOptions: { - module: 'CommonJS', - }, - }); - + require('@backstage/cli/config/nodeTransform.cjs'); require('../src'); } diff --git a/packages/codemods/knip-report.md b/packages/codemods/knip-report.md index f9903638ea..2661c35327 100644 --- a/packages/codemods/knip-report.md +++ b/packages/codemods/knip-report.md @@ -1,8 +1,2 @@ # Knip report -## Unused devDependencies (1) - -| Name | Location | Severity | -| :------ | :----------- | :------- | -| ts-node | package.json | error | - diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 3fc1d63eae..202006d4c2 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -52,7 +52,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/jscodeshift": "^0.11.0", - "@types/node": "^18.17.8", - "ts-node": "^10.0.0" + "@types/node": "^18.17.8" } } diff --git a/packages/create-app/bin/backstage-create-app b/packages/create-app/bin/backstage-create-app index 4639ea96dc..bacee3e835 100755 --- a/packages/create-app/bin/backstage-create-app +++ b/packages/create-app/bin/backstage-create-app @@ -24,15 +24,6 @@ const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); if (!isLocal || process.env.BACKSTAGE_E2E_CLI_TEST) { require('..'); } else { - // Only used for development, so should be a devDependency - // eslint-disable-next-line @backstage/no-undeclared-imports - require('ts-node').register({ - transpileOnly: true, - project: path.resolve(__dirname, '../../../tsconfig.json'), - compilerOptions: { - module: 'CommonJS', - }, - }); - + require('@backstage/cli/config/nodeTransform.cjs'); require('../src'); } diff --git a/packages/create-app/knip-report.md b/packages/create-app/knip-report.md index dac197211b..65ef020fc3 100644 --- a/packages/create-app/knip-report.md +++ b/packages/create-app/knip-report.md @@ -1,10 +1,9 @@ # Knip report -## Unused devDependencies (3) +## Unused devDependencies (2) | Name | Location | Severity | | :-------------------- | :----------- | :------- | | @types/command-exists | package.json | error | | nodemon | package.json | error | -| ts-node | package.json | error | diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 6f91013809..a0836ef09e 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -52,8 +52,7 @@ "@types/node": "^18.17.8", "@types/recursive-readdir": "^2.2.0", "msw": "^1.0.0", - "nodemon": "^3.0.1", - "ts-node": "^10.0.0" + "nodemon": "^3.0.1" }, "nodemonConfig": { "watch": "./src", diff --git a/packages/e2e-test/bin/e2e-test b/packages/e2e-test/bin/e2e-test index 27ed3472d5..495f72980b 100755 --- a/packages/e2e-test/bin/e2e-test +++ b/packages/e2e-test/bin/e2e-test @@ -15,15 +15,5 @@ * limitations under the License. */ -const path = require('path'); - -require('ts-node').register({ - transpileOnly: true, - /* eslint-disable-next-line no-restricted-syntax */ - project: path.resolve(__dirname, '../../../tsconfig.json'), - compilerOptions: { - module: 'CommonJS', - }, -}); - +require('@backstage/cli/config/nodeTransform.cjs'); require('../src'); diff --git a/packages/e2e-test/knip-report.md b/packages/e2e-test/knip-report.md index 4020464e7b..baf9661c0a 100644 --- a/packages/e2e-test/knip-report.md +++ b/packages/e2e-test/knip-report.md @@ -1,10 +1,9 @@ # Knip report -## Unused devDependencies (3) +## Unused devDependencies (2) | Name | Location | Severity | | :--------------- | :----------- | :------- | | @types/puppeteer | package.json | error | | nodemon | package.json | error | -| ts-node | package.json | error | diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 0bd2d8ec76..00cde5e2ab 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -44,8 +44,7 @@ "@types/fs-extra": "^11.0.0", "@types/node": "^18.17.8", "@types/puppeteer": "^5.4.4", - "nodemon": "^3.0.1", - "ts-node": "^10.0.0" + "nodemon": "^3.0.1" }, "nodemonConfig": { "watch": "./src", diff --git a/packages/repo-tools/bin/backstage-repo-tools b/packages/repo-tools/bin/backstage-repo-tools index 377e4a32ca..b723d215fd 100755 --- a/packages/repo-tools/bin/backstage-repo-tools +++ b/packages/repo-tools/bin/backstage-repo-tools @@ -24,14 +24,6 @@ const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); if (!isLocal || process.env.BACKSTAGE_E2E_CLI_TEST) { require('..'); } else { - require('ts-node').register({ - transpileOnly: true, - /* eslint-disable-next-line no-restricted-syntax */ - project: path.resolve(__dirname, '../../../tsconfig.json'), - compilerOptions: { - module: 'CommonJS', - }, - }); - + require('@backstage/cli/config/nodeTransform.cjs'); require('../src'); } diff --git a/packages/repo-tools/knip-report.md b/packages/repo-tools/knip-report.md index 7571c6922d..32502b699c 100644 --- a/packages/repo-tools/knip-report.md +++ b/packages/repo-tools/knip-report.md @@ -1,6 +1,6 @@ # Knip report -## Unused dependencies (6) +## Unused dependencies (5) | Name | Location | Severity | | :---------------------------------- | :----------- | :------- | @@ -8,7 +8,6 @@ | @stoplight/spectral-functions | package.json | error | | @stoplight/spectral-runtime | package.json | error | | is-glob | package.json | error | -| ts-node | package.json | error | | glob | package.json | error | ## Unused devDependencies (1) diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 73195e8816..6550c5840b 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -59,7 +59,6 @@ "minimatch": "^9.0.0", "p-limit": "^3.0.2", "portfinder": "^1.0.32", - "ts-node": "^10.0.0", "yaml-diff-patch": "^2.0.0" }, "devDependencies": { diff --git a/packages/techdocs-cli/bin/techdocs-cli b/packages/techdocs-cli/bin/techdocs-cli index 6c0bbd37b5..a43ae6324b 100755 --- a/packages/techdocs-cli/bin/techdocs-cli +++ b/packages/techdocs-cli/bin/techdocs-cli @@ -24,13 +24,6 @@ const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); if (!isLocal) { require('..'); } else { - require('ts-node').register({ - transpileOnly: true, - project: path.resolve(__dirname, '../../../tsconfig.json'), - compilerOptions: { - module: 'CommonJS', - }, - }); - + require('@backstage/cli/config/nodeTransform.cjs'); require('../src'); } diff --git a/packages/techdocs-cli/knip-report.md b/packages/techdocs-cli/knip-report.md index 06b1586f74..7329783857 100644 --- a/packages/techdocs-cli/knip-report.md +++ b/packages/techdocs-cli/knip-report.md @@ -6,11 +6,10 @@ | :----------- | :----------- | :------- | | global-agent | package.json | error | -## Unused devDependencies (3) +## Unused devDependencies (2) | Name | Location | Severity | | :----------------- | :----------- | :------- | | @types/webpack-env | package.json | error | | nodemon | package.json | error | -| ts-node | package.json | error | diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index ecda27819d..b1be4ac055 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -44,8 +44,7 @@ "@types/webpack-env": "^1.15.3", "find-process": "^1.4.5", "nodemon": "^3.0.1", - "techdocs-cli-embedded-app": "link:../techdocs-cli-embedded-app", - "ts-node": "^10.0.0" + "techdocs-cli-embedded-app": "link:../techdocs-cli-embedded-app" }, "files": [ "bin", diff --git a/scripts/snyk-github-issue-sync.ts b/scripts/snyk-github-issue-sync.ts index ea7d42a2a4..21bb852b5f 100755 --- a/scripts/snyk-github-issue-sync.ts +++ b/scripts/snyk-github-issue-sync.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env yarn ts-node --transpile-only +#!/usr/bin/env node --require @backstage/cli/config/nodeTransform.cjs /* * Copyright 2021 The Backstage Authors * diff --git a/yarn.lock b/yarn.lock index d2b6b8b95b..2dda73ed3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3710,7 +3710,6 @@ __metadata: swc-loader: ^0.2.3 tar: ^6.1.12 terser-webpack-plugin: ^5.1.3 - ts-node: ^10.0.0 util: ^0.12.3 webpack: ^5.70.0 webpack-dev-server: ^4.7.3 @@ -3750,7 +3749,6 @@ __metadata: commander: ^12.0.0 jscodeshift: ^0.15.0 jscodeshift-add-imports: ^1.0.10 - ts-node: ^10.0.0 bin: backstage-codemods: bin/backstage-codemods languageName: unknown @@ -4106,7 +4104,6 @@ __metadata: nodemon: ^3.0.1 ora: ^5.3.0 recursive-readdir: ^2.2.2 - ts-node: ^10.0.0 bin: backstage-create-app: bin/backstage-create-app languageName: unknown @@ -10138,7 +10135,6 @@ __metadata: minimatch: ^9.0.0 p-limit: ^3.0.2 portfinder: ^1.0.32 - ts-node: ^10.0.0 yaml-diff-patch: ^2.0.0 peerDependencies: "@microsoft/api-extractor-model": "*" @@ -17905,7 +17901,6 @@ __metadata: react-dev-utils: ^12.0.0-next.60 serve-handler: ^6.1.3 techdocs-cli-embedded-app: "link:../techdocs-cli-embedded-app" - ts-node: ^10.0.0 winston: ^3.2.1 bin: techdocs-cli: bin/techdocs-cli @@ -26043,7 +26038,6 @@ __metadata: nodemon: ^3.0.1 pgtools: ^1.0.0 tree-kill: ^1.2.2 - ts-node: ^10.0.0 bin: e2e-test: bin/e2e-test languageName: unknown @@ -41157,7 +41151,6 @@ __metadata: shx: ^0.3.2 sloc: ^0.3.1 sort-package-json: ^2.8.0 - ts-node: ^10.4.0 typescript: ~5.1.0 languageName: unknown linkType: soft @@ -43998,7 +43991,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.0.0, ts-node@npm:^10.4.0, ts-node@npm:^10.9.1": +"ts-node@npm:^10.9.1": version: 10.9.2 resolution: "ts-node@npm:10.9.2" dependencies: From ff3102cafb09c86885fa4c5905bf1b01cf37756a Mon Sep 17 00:00:00 2001 From: Min Kim Date: Sun, 17 Mar 2024 16:36:39 -0400 Subject: [PATCH 167/219] Add auth guest provider to the backend template Signed-off-by: Min Kim --- packages/create-app/src/lib/tasks.test.ts | 1 + packages/create-app/src/lib/versions.ts | 3 +++ .../create-app/templates/default-app/app-config.local.yaml | 4 ++++ .../templates/default-app/packages/backend/package.json.hbs | 1 + .../templates/default-app/packages/backend/src/index.ts | 4 +++- 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 34a239ca48..522db161eb 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -60,6 +60,7 @@ jest.mock('./versions', () => ({ '@backstage/plugin-auth-backend': '1.0.0', '@backstage/plugin-auth-node': '1.0.0', '@backstage/plugin-auth-backend-module-github-provider': '1.0.0', + '@backstage/plugin-auth-backend-module-guest-provider': '1.0.0', '@backstage/plugin-catalog-backend': '1.0.0', '@backstage/plugin-catalog-backend-module-scaffolder-entity-model': '1.0.0', '@backstage/plugin-permission-common': '1.0.0', diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index ec96bafc1f..76f3c37f78 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -52,6 +52,7 @@ import { version as pluginApiDocs } from '../../../../plugins/api-docs/package.j import { version as pluginAppBackend } from '../../../../plugins/app-backend/package.json'; import { version as pluginAuthBackend } from '../../../../plugins/auth-backend/package.json'; import { version as pluginAuthBackendModuleGithubProvider } from '../../../../plugins/auth-backend-module-github-provider/package.json'; +import { version as pluginAuthBackendModuleGuestProvider } from '../../../../plugins/auth-backend-module-guest-provider/package.json'; import { version as pluginAuthNode } from '../../../../plugins/auth-node/package.json'; import { version as pluginCatalog } from '../../../../plugins/catalog/package.json'; import { version as pluginCatalogCommon } from '../../../../plugins/catalog-common/package.json'; @@ -108,6 +109,8 @@ export const packageVersions = { '@backstage/plugin-auth-backend': pluginAuthBackend, '@backstage/plugin-auth-backend-module-github-provider': pluginAuthBackendModuleGithubProvider, + '@backstage/plugin-auth-backend-module-guest-provider': + pluginAuthBackendModuleGuestProvider, '@backstage/plugin-auth-node': pluginAuthNode, '@backstage/plugin-catalog': pluginCatalog, '@backstage/plugin-catalog-common': pluginCatalogCommon, diff --git a/packages/create-app/templates/default-app/app-config.local.yaml b/packages/create-app/templates/default-app/app-config.local.yaml index 976293b546..4d4b6391d7 100644 --- a/packages/create-app/templates/default-app/app-config.local.yaml +++ b/packages/create-app/templates/default-app/app-config.local.yaml @@ -1 +1,5 @@ # Backstage override configuration for your local development environment +auth: + providers: + guest: {} + # See https://github.com/backstage/backstage/blob/master/docs/auth/guest/provider.md diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs index b9c0c75a77..93228e5c8f 100644 --- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs @@ -23,6 +23,7 @@ "@backstage/plugin-app-backend": "^{{version '@backstage/plugin-app-backend'}}", "@backstage/plugin-auth-backend": "^{{version '@backstage/plugin-auth-backend'}}", "@backstage/plugin-auth-backend-module-github-provider": "^{{version '@backstage/plugin-auth-backend-module-github-provider'}}", + "@backstage/plugin-auth-backend-module-guest-provider": "^{{version '@backstage/plugin-auth-backend-module-guest-provider'}}", "@backstage/plugin-auth-node": "^{{version '@backstage/plugin-auth-node'}}", "@backstage/plugin-catalog-backend": "^{{version '@backstage/plugin-catalog-backend'}}", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^{{version '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'}}", diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index d2502955fb..0615677df9 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -17,7 +17,9 @@ backend.add(import('@backstage/plugin-techdocs-backend/alpha')); // auth plugin backend.add(import('@backstage/plugin-auth-backend')); - // See https://backstage.io/docs/backend-system/building-backends/migrating#the-auth-plugin +// See https://backstage.io/docs/backend-system/building-backends/migrating#the-auth-plugin +backend.add(import('@backstage/plugin-auth-backend-module-guest-provider')); +// See https://github.com/backstage/backstage/blob/master/docs/auth/guest/provider.md // catalog plugin backend.add(import('@backstage/plugin-catalog-backend/alpha')); From 97b5da8410f9c404b4d05aaaada39fddd5ef717c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 21:20:39 +0000 Subject: [PATCH 168/219] fix(deps): update dependency postcss to v8.4.36 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 d981fee7e1..9a3c0616e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38792,13 +38792,13 @@ __metadata: linkType: hard "postcss@npm:^8.1.0, postcss@npm:^8.4.27, postcss@npm:^8.4.33": - version: 8.4.35 - resolution: "postcss@npm:8.4.35" + version: 8.4.36 + resolution: "postcss@npm:8.4.36" dependencies: nanoid: ^3.3.7 picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da + source-map-js: ^1.1.0 + checksum: 1bb0f2bdfccd5a3ea0ed39700c09098f15501d38110208bfba2df5e3925e4ff7e9a4eaf8abb87bc692ae4d122d9aa0ec13bf4f4d8fd1ad8d8ceaa1f345e50ed1 languageName: node linkType: hard @@ -42366,10 +42366,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:^1.1.0": + version: 1.1.0 + resolution: "source-map-js@npm:1.1.0" + checksum: 6ef39381cdf5451c3db406e4b0fa95657be3c35db76fe6df3be430174b2e6af3c0b57d9728328dc62a211ae6209a0295d6a26442a55d5fccbf7cf1211fffa80e languageName: node linkType: hard From 64ec0a5cbb0736d96a0d4183d37160b8a20fb99e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 22:04:23 +0000 Subject: [PATCH 169/219] chore(deps): update dependency aws-sdk-client-mock to v3.1.0 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 9a3c0616e5..23217bda15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21869,13 +21869,13 @@ __metadata: linkType: hard "aws-sdk-client-mock@npm:^3.0.0": - version: 3.0.1 - resolution: "aws-sdk-client-mock@npm:3.0.1" + version: 3.1.0 + resolution: "aws-sdk-client-mock@npm:3.1.0" dependencies: "@types/sinon": ^10.0.10 sinon: ^16.1.3 tslib: ^2.1.0 - checksum: e875af24a765d7883059c101a629a58bbb2ec3a055443562f9410ebd96823691dfae25d69b962dc3c22ad5867971c37b378d05f3c8344bbb992b1a624a0fb836 + checksum: fbb11b5783fe6ba9b5c10a4395193d5b4b1583040cce61bcd341dce25327ee86e3b00166c2fb3d47aedaa890c129e1c3fabe944086419d50ba12a417ebe2ede9 languageName: node linkType: hard From de6d1478ff43735dea78135fb21ce235ac8f091c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 22:21:02 +0000 Subject: [PATCH 170/219] chore(deps): update dependency aws-sdk-client-mock-jest to v3.1.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 155 +++--------------------------------------------------- 1 file changed, 6 insertions(+), 149 deletions(-) diff --git a/yarn.lock b/yarn.lock index 968b55533d..c202ec005c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12402,15 +12402,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect-utils@npm:28.1.3" - dependencies: - jest-get-type: ^28.0.2 - checksum: 808ea3a68292a7e0b95490fdd55605c430b4cf209ea76b5b61bfb2a1badcb41bc046810fe4e364bd5fe04663978aa2bd73d8f8465a761dd7c655aeb44cf22987 - languageName: node - linkType: hard - "@jest/expect-utils@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect-utils@npm:29.7.0" @@ -12493,15 +12484,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/schemas@npm:28.1.3" - dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de - languageName: node - linkType: hard - "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -12569,20 +12551,6 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/types@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^17.0.8 - chalk: ^4.0.0 - checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 - languageName: node - linkType: hard - "@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" @@ -16179,13 +16147,6 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.24.1": - version: 0.24.42 - resolution: "@sinclair/typebox@npm:0.24.42" - checksum: 83a3083b71063ad270669308634f7c5b473272da71cbc405343b2ff774d641ec2be0993e0a61386f8ef3f8b786c173dc01921a5bc6627d95657eb98f19f1a4c4 - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -19041,16 +19002,6 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^28.1.3": - version: 28.1.8 - resolution: "@types/jest@npm:28.1.8" - dependencies: - expect: ^28.0.0 - pretty-format: ^28.0.0 - checksum: d4cd36158a3ae1d4b42cc48a77c95de74bc56b84cf81e09af3ee0399c34f4a7da8ab9e787570f10004bd642f9e781b0033c37327fbbf4a8e4b6e37e8ee3693a7 - languageName: node - linkType: hard - "@types/jquery@npm:^3.3.34": version: 3.5.29 resolution: "@types/jquery@npm:3.5.29" @@ -21857,14 +21808,14 @@ __metadata: linkType: hard "aws-sdk-client-mock-jest@npm:^3.0.0": - version: 3.0.1 - resolution: "aws-sdk-client-mock-jest@npm:3.0.1" + version: 3.1.0 + resolution: "aws-sdk-client-mock-jest@npm:3.1.0" dependencies: - "@types/jest": ^28.1.3 + expect: ">28.1.3" tslib: ^2.1.0 peerDependencies: - aws-sdk-client-mock: 3.0.1 - checksum: c5c72ae63c9d3862636b833c66ebc708a1c170ba1159508f9a1e56c8e71ba82f7f85a00e68148b72cc699ab3e7ce6945d29bfd23151ae62c3f78133d56585ddd + aws-sdk-client-mock: 3.1.0 + checksum: d619e3dbc58009ffa9db766a7781ec1159809825a8e8246f41adeeffa81aa4ec0319cf0ba5a113e4937101b56401396eb117cab4da3fac4974b094ac8fdbeaa3 languageName: node linkType: hard @@ -25772,13 +25723,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^28.1.1": - version: 28.1.1 - resolution: "diff-sequences@npm:28.1.1" - checksum: e2529036505567c7ca5a2dea86b6bcd1ca0e3ae63bf8ebf529b8a99cfa915bbf194b7021dc1c57361a4017a6d95578d4ceb29fabc3232a4f4cb866a2726c7690 - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -28001,20 +27945,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:^28.0.0": - version: 28.1.3 - resolution: "expect@npm:28.1.3" - dependencies: - "@jest/expect-utils": ^28.1.3 - jest-get-type: ^28.0.2 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - checksum: 101e0090de300bcafedb7dbfd19223368a2251ce5fe0105bbb6de5720100b89fb6b64290ebfb42febc048324c76d6a4979cdc4b61eb77747857daf7a5de9b03d - languageName: node - linkType: hard - -"expect@npm:^29.0.0, expect@npm:^29.7.0": +"expect@npm:>28.1.3, expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -32060,18 +31991,6 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-diff@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^28.1.1 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: fa8583e0ccbe775714ce850b009be1b0f6b17a4b6759f33ff47adef27942ebc610dbbcc8a5f7cfb7f12b3b3b05afc9fb41d5f766674616025032ff1e4f9866e0 - languageName: node - linkType: hard - "jest-diff@npm:^29.2.0, jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" @@ -32141,13 +32060,6 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-get-type@npm:28.0.2" - checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd - languageName: node - linkType: hard - "jest-get-type@npm:^29.6.3": version: 29.6.3 resolution: "jest-get-type@npm:29.6.3" @@ -32211,18 +32123,6 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-matcher-utils@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - jest-diff: ^28.1.3 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: 6b34f0cf66f6781e92e3bec97bf27796bd2ba31121e5c5997218d9adba6deea38a30df5203937d6785b68023ed95cbad73663cc9aad6fb0cb59aeb5813a58daf - languageName: node - linkType: hard - "jest-matcher-utils@npm:^29.7.0": version: 29.7.0 resolution: "jest-matcher-utils@npm:29.7.0" @@ -32235,23 +32135,6 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-message-util@npm:28.1.3" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^28.1.3 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^28.1.3 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 - languageName: node - linkType: hard - "jest-message-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-message-util@npm:29.7.0" @@ -32413,20 +32296,6 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-util@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 - languageName: node - linkType: hard - "jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" @@ -38996,18 +38865,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^28.0.0, pretty-format@npm:^28.1.3": - version: 28.1.3 - resolution: "pretty-format@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - ansi-regex: ^5.0.1 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f - languageName: node - linkType: hard - "pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" From e780d3a5fd8c960e59e89ed0c6284f0d2470d3c4 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Mon, 18 Mar 2024 08:34:47 +0530 Subject: [PATCH 171/219] Add ESLint Rule to Vault Plugin Signed-off-by: Aditya Kumar --- .changeset/seven-monkeys-happen.md | 5 +++++ plugins/vault/.eslintrc.js | 6 +++++- plugins/vault/dev/index.tsx | 3 ++- .../src/components/EntityVaultTable/EntityVaultTable.tsx | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 .changeset/seven-monkeys-happen.md diff --git a/.changeset/seven-monkeys-happen.md b/.changeset/seven-monkeys-happen.md new file mode 100644 index 0000000000..e81d20aece --- /dev/null +++ b/.changeset/seven-monkeys-happen.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `vault` plugin to migrate the Material UI imports. diff --git a/plugins/vault/.eslintrc.js b/plugins/vault/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/vault/.eslintrc.js +++ b/plugins/vault/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/vault/dev/index.tsx b/plugins/vault/dev/index.tsx index 8d902e14c5..97dde1f3bf 100644 --- a/plugins/vault/dev/index.tsx +++ b/plugins/vault/dev/index.tsx @@ -19,7 +19,8 @@ import { Content, Header, HeaderLabel, Page } from '@backstage/core-components'; import { createDevApp } from '@backstage/dev-utils'; import { EntityProvider } from '@backstage/plugin-catalog-react'; import { TestApiProvider } from '@backstage/test-utils'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import SomeIcon from '@material-ui/icons/Storage'; import React from 'react'; import { VaultApi, vaultApiRef } from '../src/api'; diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx index 4d169611ca..412a3404d1 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx @@ -17,7 +17,8 @@ import React from 'react'; import { Entity } from '@backstage/catalog-model'; import { Link, Table, TableColumn } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import Edit from '@material-ui/icons/Edit'; import Visibility from '@material-ui/icons/Visibility'; import Alert from '@material-ui/lab/Alert'; From ee584af4b4a312dd0cd5c24b91211513c772f3e4 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Mon, 18 Mar 2024 09:55:47 +0530 Subject: [PATCH 172/219] Add ESLint Rule to UserSettings Plugin Signed-off-by: Aditya Kumar --- .changeset/khaki-penguins-whisper.md | 5 +++++ plugins/user-settings/.eslintrc.js | 6 +++++- .../AuthProviders/EmptyProviders.tsx | 3 ++- .../AuthProviders/ProviderSettingsAvatar.tsx | 3 ++- .../AuthProviders/ProviderSettingsItem.tsx | 18 ++++++++---------- .../UserSettingsAuthProviders.tsx | 2 +- .../src/components/FeatureFlags/EmptyFlags.tsx | 3 ++- .../FeatureFlags/FeatureFlagsItem.tsx | 12 +++++------- .../FeatureFlags/UserSettingsFeatureFlags.tsx | 12 +++++------- .../General/UserSettingsAppearanceCard.tsx | 2 +- .../components/General/UserSettingsGeneral.tsx | 2 +- .../General/UserSettingsLanguageToggle.tsx | 10 ++++------ .../components/General/UserSettingsMenu.tsx | 5 ++++- .../General/UserSettingsPinToggle.tsx | 12 +++++------- .../General/UserSettingsProfileCard.tsx | 3 ++- .../General/UserSettingsSignInAvatar.tsx | 3 ++- .../General/UserSettingsThemeToggle.tsx | 12 +++++------- .../SettingsLayout/SettingsLayout.tsx | 2 +- 18 files changed, 60 insertions(+), 55 deletions(-) create mode 100644 .changeset/khaki-penguins-whisper.md diff --git a/.changeset/khaki-penguins-whisper.md b/.changeset/khaki-penguins-whisper.md new file mode 100644 index 0000000000..f3412a5f79 --- /dev/null +++ b/.changeset/khaki-penguins-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `user-settings` plugin to migrate the Material UI imports. diff --git a/plugins/user-settings/.eslintrc.js b/plugins/user-settings/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/user-settings/.eslintrc.js +++ b/plugins/user-settings/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/user-settings/src/components/AuthProviders/EmptyProviders.tsx b/plugins/user-settings/src/components/AuthProviders/EmptyProviders.tsx index 082cb5e8ac..952ba3af30 100644 --- a/plugins/user-settings/src/components/AuthProviders/EmptyProviders.tsx +++ b/plugins/user-settings/src/components/AuthProviders/EmptyProviders.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Button, Typography } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; import { CodeSnippet, EmptyState } from '@backstage/core-components'; const EXAMPLE = `auth: diff --git a/plugins/user-settings/src/components/AuthProviders/ProviderSettingsAvatar.tsx b/plugins/user-settings/src/components/AuthProviders/ProviderSettingsAvatar.tsx index 07e9b4aa55..c09dac5985 100644 --- a/plugins/user-settings/src/components/AuthProviders/ProviderSettingsAvatar.tsx +++ b/plugins/user-settings/src/components/AuthProviders/ProviderSettingsAvatar.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { makeStyles, Avatar, Theme } from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import { sidebarConfig } from '@backstage/core-components'; const useStyles = makeStyles(theme => ({ diff --git a/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx b/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx index e9a710036f..07afd8083e 100644 --- a/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx +++ b/plugins/user-settings/src/components/AuthProviders/ProviderSettingsItem.tsx @@ -15,16 +15,14 @@ */ import React, { useEffect, useState } from 'react'; -import { - Button, - Grid, - ListItem, - ListItemIcon, - ListItemSecondaryAction, - ListItemText, - Tooltip, - Typography, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemText from '@material-ui/core/ListItemText'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; import { ApiRef, SessionApi, diff --git a/plugins/user-settings/src/components/AuthProviders/UserSettingsAuthProviders.tsx b/plugins/user-settings/src/components/AuthProviders/UserSettingsAuthProviders.tsx index d23716c2bf..e83440e0c5 100644 --- a/plugins/user-settings/src/components/AuthProviders/UserSettingsAuthProviders.tsx +++ b/plugins/user-settings/src/components/AuthProviders/UserSettingsAuthProviders.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { List } from '@material-ui/core'; +import List from '@material-ui/core/List'; import { EmptyProviders } from './EmptyProviders'; import { DefaultProviderSettings } from './DefaultProviderSettings'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; diff --git a/plugins/user-settings/src/components/FeatureFlags/EmptyFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/EmptyFlags.tsx index 0e2b911978..55c70ba7a2 100644 --- a/plugins/user-settings/src/components/FeatureFlags/EmptyFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/EmptyFlags.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Button, Typography } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; import { CodeSnippet, EmptyState } from '@backstage/core-components'; const EXAMPLE = `import { createPlugin } from '@backstage/core-plugin-api'; diff --git a/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx b/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx index a5f0d480cb..96f8166c4a 100644 --- a/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/FeatureFlagsItem.tsx @@ -15,13 +15,11 @@ */ import React from 'react'; -import { - ListItem, - ListItemText, - ListItemIcon, - Switch, - Tooltip, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import Switch from '@material-ui/core/Switch'; +import Tooltip from '@material-ui/core/Tooltip'; import { FeatureFlag } from '@backstage/core-plugin-api'; type Props = { diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index 60b951ab60..1522001ac5 100644 --- a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx @@ -15,13 +15,11 @@ */ import React, { useCallback, useState } from 'react'; -import { - List, - TextField, - IconButton, - Grid, - Typography, -} from '@material-ui/core'; +import List from '@material-ui/core/List'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import { EmptyFlags } from './EmptyFlags'; import { FlagItem } from './FeatureFlagsItem'; import { diff --git a/plugins/user-settings/src/components/General/UserSettingsAppearanceCard.tsx b/plugins/user-settings/src/components/General/UserSettingsAppearanceCard.tsx index 8a32c0bd9b..b8e3c44672 100644 --- a/plugins/user-settings/src/components/General/UserSettingsAppearanceCard.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsAppearanceCard.tsx @@ -15,7 +15,7 @@ */ import { InfoCard, useSidebarPinState } from '@backstage/core-components'; -import { List } from '@material-ui/core'; +import List from '@material-ui/core/List'; import React from 'react'; import { UserSettingsPinToggle } from './UserSettingsPinToggle'; import { UserSettingsThemeToggle } from './UserSettingsThemeToggle'; diff --git a/plugins/user-settings/src/components/General/UserSettingsGeneral.tsx b/plugins/user-settings/src/components/General/UserSettingsGeneral.tsx index 8dde87ba5c..6c663ed1bc 100644 --- a/plugins/user-settings/src/components/General/UserSettingsGeneral.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsGeneral.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React from 'react'; import { UserSettingsProfileCard } from './UserSettingsProfileCard'; import { UserSettingsAppearanceCard } from './UserSettingsAppearanceCard'; diff --git a/plugins/user-settings/src/components/General/UserSettingsLanguageToggle.tsx b/plugins/user-settings/src/components/General/UserSettingsLanguageToggle.tsx index 15c6e9ea9c..337960932e 100644 --- a/plugins/user-settings/src/components/General/UserSettingsLanguageToggle.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsLanguageToggle.tsx @@ -19,12 +19,10 @@ import { useTranslationRef, appLanguageApiRef, } from '@backstage/core-plugin-api/alpha'; -import { - ListItem, - ListItemText, - ListItemSecondaryAction, - makeStyles, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import { makeStyles } from '@material-ui/core/styles'; import { userSettingsTranslationRef } from '../../translation'; import { useApi } from '@backstage/core-plugin-api'; import useObservable from 'react-use/lib/useObservable'; diff --git a/plugins/user-settings/src/components/General/UserSettingsMenu.tsx b/plugins/user-settings/src/components/General/UserSettingsMenu.tsx index c83bdd5b74..8ef2f380f3 100644 --- a/plugins/user-settings/src/components/General/UserSettingsMenu.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsMenu.tsx @@ -15,7 +15,10 @@ */ import React from 'react'; -import { IconButton, ListItemIcon, Menu, MenuItem } from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; import SignOutIcon from '@material-ui/icons/MeetingRoom'; import MoreVertIcon from '@material-ui/icons/MoreVert'; import { diff --git a/plugins/user-settings/src/components/General/UserSettingsPinToggle.tsx b/plugins/user-settings/src/components/General/UserSettingsPinToggle.tsx index a06b079e8e..95317147cf 100644 --- a/plugins/user-settings/src/components/General/UserSettingsPinToggle.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsPinToggle.tsx @@ -15,13 +15,11 @@ */ import React from 'react'; -import { - ListItem, - ListItemSecondaryAction, - ListItemText, - Switch, - Tooltip, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemText from '@material-ui/core/ListItemText'; +import Switch from '@material-ui/core/Switch'; +import Tooltip from '@material-ui/core/Tooltip'; import { useSidebarPinState } from '@backstage/core-components'; /** @public */ diff --git a/plugins/user-settings/src/components/General/UserSettingsProfileCard.tsx b/plugins/user-settings/src/components/General/UserSettingsProfileCard.tsx index c96d2bb21e..c04710650c 100644 --- a/plugins/user-settings/src/components/General/UserSettingsProfileCard.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsProfileCard.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import React from 'react'; import { UserSettingsSignInAvatar } from './UserSettingsSignInAvatar'; import { UserSettingsMenu } from './UserSettingsMenu'; diff --git a/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx b/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx index 85c616ec72..80621d1a53 100644 --- a/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsSignInAvatar.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { makeStyles, Avatar, Theme } from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import { useUserProfile } from '../useUserProfileInfo'; import { sidebarConfig } from '@backstage/core-components'; diff --git a/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx b/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx index 37d91ecae0..3c19b0ab88 100644 --- a/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx +++ b/plugins/user-settings/src/components/General/UserSettingsThemeToggle.tsx @@ -19,13 +19,11 @@ import useObservable from 'react-use/lib/useObservable'; import AutoIcon from '@material-ui/icons/BrightnessAuto'; import ToggleButton from '@material-ui/lab/ToggleButton'; import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup'; -import { - ListItem, - ListItemText, - ListItemSecondaryAction, - Tooltip, - makeStyles, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import Tooltip from '@material-ui/core/Tooltip'; +import { makeStyles } from '@material-ui/core/styles'; import { appThemeApiRef, useApi } from '@backstage/core-plugin-api'; import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; import { userSettingsTranslationRef } from '../../translation'; diff --git a/plugins/user-settings/src/components/SettingsLayout/SettingsLayout.tsx b/plugins/user-settings/src/components/SettingsLayout/SettingsLayout.tsx index 9855fdd048..c17333571d 100644 --- a/plugins/user-settings/src/components/SettingsLayout/SettingsLayout.tsx +++ b/plugins/user-settings/src/components/SettingsLayout/SettingsLayout.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { TabProps } from '@material-ui/core'; +import { TabProps } from '@material-ui/core/Tab'; import { Header, Page, From a35590ac898eacaa179fe1720300dfbb35affe0e Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Mon, 18 Mar 2024 10:24:09 +0530 Subject: [PATCH 173/219] Add ESLint Rule to UserSettings Plugin Signed-off-by: Aditya Kumar --- plugins/user-settings/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/user-settings/api-report.md b/plugins/user-settings/api-report.md index b92677f8ce..d485320fe8 100644 --- a/plugins/user-settings/api-report.md +++ b/plugins/user-settings/api-report.md @@ -24,7 +24,7 @@ import { RouteRef } from '@backstage/core-plugin-api'; import { SessionApi } from '@backstage/core-plugin-api'; import { StorageApi } from '@backstage/core-plugin-api'; import { StorageValueSnapshot } from '@backstage/core-plugin-api'; -import { TabProps } from '@material-ui/core'; +import { TabProps } from '@material-ui/core/Tab'; // @public (undocumented) export const DefaultProviderSettings: (props: { From 6aec7259724643e330ea86b9ef25c53a6ebe00f5 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Mon, 18 Mar 2024 12:49:51 +0530 Subject: [PATCH 174/219] Add ESLint Rule to TechInsights Plugin Signed-off-by: Aditya Kumar --- .changeset/spotty-ducks-deny.md | 5 +++++ plugins/tech-insights/.eslintrc.js | 6 +++++- .../src/components/ScorecardsContent/ScorecardContent.tsx | 2 +- .../src/components/ScorecardsInfo/ScorecardInfo.tsx | 6 ++++-- .../src/components/ScorecardsList/ScorecardsList.tsx | 7 +++++-- 5 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 .changeset/spotty-ducks-deny.md diff --git a/.changeset/spotty-ducks-deny.md b/.changeset/spotty-ducks-deny.md new file mode 100644 index 0000000000..964ec9428c --- /dev/null +++ b/.changeset/spotty-ducks-deny.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `tech-insights` plugin to migrate the Material UI imports. diff --git a/plugins/tech-insights/.eslintrc.js b/plugins/tech-insights/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/tech-insights/.eslintrc.js +++ b/plugins/tech-insights/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/tech-insights/src/components/ScorecardsContent/ScorecardContent.tsx b/plugins/tech-insights/src/components/ScorecardsContent/ScorecardContent.tsx index f8871b87c1..c144833ea7 100644 --- a/plugins/tech-insights/src/components/ScorecardsContent/ScorecardContent.tsx +++ b/plugins/tech-insights/src/components/ScorecardsContent/ScorecardContent.tsx @@ -21,7 +21,7 @@ import { useApi } from '@backstage/core-plugin-api'; import { ScorecardInfo } from '../ScorecardsInfo'; import Alert from '@material-ui/lab/Alert'; import { techInsightsApiRef } from '../../api/TechInsightsApi'; -import { makeStyles } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; import { useEntity } from '@backstage/plugin-catalog-react'; import { getCompoundEntityRef } from '@backstage/catalog-model'; diff --git a/plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx b/plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx index cfff074368..2a2ca982d1 100644 --- a/plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx +++ b/plugins/tech-insights/src/components/ScorecardsInfo/ScorecardInfo.tsx @@ -15,10 +15,12 @@ */ import React from 'react'; -import { makeStyles, Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import { InfoCard } from '@backstage/core-components'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { ScorecardsList } from '../ScorecardsList'; const useStyles = makeStyles(theme => ({ diff --git a/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx b/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx index 1a9d04a9de..dcd94eb0d7 100644 --- a/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx +++ b/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx @@ -16,10 +16,13 @@ import React from 'react'; import { useApi } from '@backstage/core-plugin-api'; -import { makeStyles, List, ListItem, ListItemText } from '@material-ui/core'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import { techInsightsApiRef } from '../../api'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { MarkdownContent } from '@backstage/core-components'; const useStyles = makeStyles(theme => ({ From cfc0bb345d01e78acfc040c46e719a340db1fd02 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Mon, 18 Mar 2024 08:32:40 +0100 Subject: [PATCH 175/219] fix: some types Signed-off-by: Camila Belo --- .../CookieAuthRefreshProvider.tsx | 4 +- .../useCookieAuthRefresh.tsx | 40 +++++++++---------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx index 85846b28c9..7919207692 100644 --- a/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx +++ b/plugins/auth-react/src/components/CookieAuthRefreshProvider/CookieAuthRefreshProvider.tsx @@ -25,9 +25,9 @@ import { useCookieAuthRefresh } from '../../hooks'; * Props for the {@link CookieAuthRefreshProvider} component. */ export type CookieAuthRefreshProviderProps = { - // The plugin ID to used for discovering the API origin + // The plugin ID used for discovering the API origin pluginId: string; - // The path to used for calling the refresh cookie endpoint, default to '/cookie' + // The path used for calling the refresh cookie endpoint, default to '/cookie' path?: string; // The children to render when the refresh is successful children: ReactNode; diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index 79e80c3954..b5b5444e71 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -30,9 +30,9 @@ import { ResponseError } from '@backstage/errors'; * @param options - Options for configuring the refresh cookie endpoint */ export function useCookieAuthRefresh(options: { - // The plugin id to used for discovering the API origin + // The plugin id used for discovering the API origin pluginId: string; - // The path to used for calling the refresh cookie endpoint, default to '/cookie' + // The path used for calling the refresh cookie endpoint, default to '/cookie' path?: string; }): | { status: 'loading' } @@ -63,45 +63,43 @@ export function useCookieAuthRefresh(options: { useMountEffect(actions.execute); + const retry = useCallback(() => { + actions.execute(); + }, [actions]); + const refresh = useCallback( (params: { expiresAt: string }) => { // Randomize the refreshing margin with a margin of 1-4 minutes to avoid all tabs refreshing at the same time // It cannot be less than 5 minutes otherwise the backend will return the same expiration date const margin = (1 + 3 * Math.random()) * 60000; const delay = Date.parse(params.expiresAt) - Date.now() - margin; - const timeout = setTimeout(actions.execute, delay); + const timeout = setTimeout(retry, delay); return () => clearTimeout(timeout); }, - [actions], + [retry], ); useEffect(() => { - // Only start the refresh process if we have a successful response + // Only schedule a refresh if we have a successful response if (state.status !== 'success' || !state.result) { return () => {}; } - - store.set('expiresAt', state.result.expiresAt); - - let cancel = refresh(state.result); - - const observable = store.observe$('expiresAt'); - const subscription = observable.subscribe(({ value }) => { - if (!value) return; - cancel(); - cancel = refresh({ expiresAt: value }); - }); - + const expiresAt = state.result.expiresAt; + store.set('expiresAt', expiresAt); + let cancel = refresh({ expiresAt }); + const subscription = store + .observe$('expiresAt') + .subscribe(({ value }) => { + if (!value) return; + cancel(); + cancel = refresh({ expiresAt: value }); + }); return () => { cancel(); subscription.unsubscribe(); }; }, [state, refresh, store]); - const retry = useCallback(() => { - actions.execute(); - }, [actions]); - // Initialising if (state.status === 'not-executed') { return { status: 'loading' }; From 1bc13fc3293758159e9de392e75ba4c24fa9c059 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 09:46:24 +0100 Subject: [PATCH 176/219] cli: switch node transform type target es2022 and typescript Signed-off-by: Patrik Oldsberg --- packages/cli/config/nodeTransform.cjs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/cli/config/nodeTransform.cjs b/packages/cli/config/nodeTransform.cjs index 0f64fb931d..a5eb4e8fb0 100644 --- a/packages/cli/config/nodeTransform.cjs +++ b/packages/cli/config/nodeTransform.cjs @@ -23,6 +23,12 @@ addHook( filename, sourceMaps: 'inline', module: { type: 'commonjs' }, + jsc: { + target: 'es2022', + parser: { + syntax: 'typescript', + }, + }, }); process.send?.({ type: 'watch', path: filename }); return transformed.code; From b8234ce637d90249e3e96087ced5dad715dfc4a8 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Mon, 18 Mar 2024 14:17:04 +0530 Subject: [PATCH 177/219] Add ESLint Rule to Stackstorm Plugin Signed-off-by: Aditya Kumar --- .changeset/plenty-singers-call.md | 5 ++++ plugins/stackstorm/.eslintrc.js | 6 ++++- .../components/ActionsList/ActionsList.tsx | 14 +++++------ .../ExecutionsTable/ExecutionPanel.tsx | 23 ++++++++----------- .../StackstormHome/StackstormHome.tsx | 2 +- 5 files changed, 27 insertions(+), 23 deletions(-) create mode 100644 .changeset/plenty-singers-call.md diff --git a/.changeset/plenty-singers-call.md b/.changeset/plenty-singers-call.md new file mode 100644 index 0000000000..cd51c18aa1 --- /dev/null +++ b/.changeset/plenty-singers-call.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-stackstorm': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `stackstorm` plugin to migrate the Material UI imports. diff --git a/plugins/stackstorm/.eslintrc.js b/plugins/stackstorm/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/stackstorm/.eslintrc.js +++ b/plugins/stackstorm/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/stackstorm/src/components/ActionsList/ActionsList.tsx b/plugins/stackstorm/src/components/ActionsList/ActionsList.tsx index 1080f67373..bd5fc56c2f 100644 --- a/plugins/stackstorm/src/components/ActionsList/ActionsList.tsx +++ b/plugins/stackstorm/src/components/ActionsList/ActionsList.tsx @@ -17,14 +17,12 @@ import React, { useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { Link, Progress, ResponseErrorPanel } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; -import { - List, - ListItemText, - Collapse, - ListItem, - ListItemSecondaryAction, - ListItemIcon, -} from '@material-ui/core'; +import List from '@material-ui/core/List'; +import ListItemText from '@material-ui/core/ListItemText'; +import Collapse from '@material-ui/core/Collapse'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; import { makeStyles } from '@material-ui/core/styles'; import ExpandMore from '@material-ui/icons/ExpandMore'; import ExpandLess from '@material-ui/icons/ExpandLess'; diff --git a/plugins/stackstorm/src/components/ExecutionsTable/ExecutionPanel.tsx b/plugins/stackstorm/src/components/ExecutionsTable/ExecutionPanel.tsx index 8a55c31246..cd22120898 100644 --- a/plugins/stackstorm/src/components/ExecutionsTable/ExecutionPanel.tsx +++ b/plugins/stackstorm/src/components/ExecutionsTable/ExecutionPanel.tsx @@ -22,19 +22,16 @@ import { import { useApi } from '@backstage/core-plugin-api'; import { Execution, stackstormApiRef } from '../../api'; import useAsync from 'react-use/lib/useAsync'; -import { - Button, - Card, - CardActions, - CardContent, - makeStyles, - Table, - TableBody, - TableCell, - TableRow, - Typography, - withStyles, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles, withStyles } from '@material-ui/core/styles'; import { Status } from './Status'; const useStyles = makeStyles(theme => ({ diff --git a/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx b/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx index 1bb9031815..13b1e181b5 100644 --- a/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx +++ b/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React, { Fragment } from 'react'; -import { IconButton } from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; import { Header, Page, From 6429213a599326daf4fab5546ed8bf8a4daa5f5f Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Mon, 18 Mar 2024 14:45:20 +0530 Subject: [PATCH 178/219] Add ESLint Rule to StackOverflow Plugin Signed-off-by: Aditya Kumar --- .changeset/sweet-jokes-exercise.md | 5 +++++ plugins/stack-overflow/.eslintrc.js | 6 +++++- .../src/home/StackOverflowQuestions/Content.tsx | 14 ++++++-------- .../StackOverflowQuestions.stories.tsx | 2 +- .../StackOverflowSearchResultListItem.tsx | 14 ++++++-------- 5 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 .changeset/sweet-jokes-exercise.md diff --git a/.changeset/sweet-jokes-exercise.md b/.changeset/sweet-jokes-exercise.md new file mode 100644 index 0000000000..72a4f13889 --- /dev/null +++ b/.changeset/sweet-jokes-exercise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-stack-overflow': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `stack-overflow` plugin to migrate the Material UI imports. diff --git a/plugins/stack-overflow/.eslintrc.js b/plugins/stack-overflow/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/stack-overflow/.eslintrc.js +++ b/plugins/stack-overflow/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx index 8d8aeccb3b..d74f296614 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx @@ -16,14 +16,12 @@ import { useApi } from '@backstage/core-plugin-api'; import { Link } from '@backstage/core-components'; -import { - IconButton, - List, - ListItem, - ListItemText, - ListItemSecondaryAction, - ListItemIcon, -} from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; import Typography from '@material-ui/core/Typography'; import OpenInNewIcon from '@material-ui/icons/OpenInNew'; import useAsync from 'react-use/lib/useAsync'; diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx index 9f0fd75341..b9ac36f588 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx @@ -18,7 +18,7 @@ import { HomePageStackOverflowQuestions } from '../../plugin'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React, { ComponentType, PropsWithChildren } from 'react'; import { StackOverflowIcon } from '../../icons'; import { stackOverflowApiRef } from '../../api'; diff --git a/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx b/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx index 70e182b86d..90c129b901 100644 --- a/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx +++ b/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.tsx @@ -16,14 +16,12 @@ import React from 'react'; import { Link } from '@backstage/core-components'; -import { - Divider, - ListItem, - ListItemText, - ListItemIcon, - Box, - Chip, -} from '@material-ui/core'; +import Divider from '@material-ui/core/Divider'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; import { useAnalytics } from '@backstage/core-plugin-api'; import type { ResultHighlight } from '@backstage/plugin-search-common'; import { HighlightedSearchResultText } from '@backstage/plugin-search-react'; From d6fac59d13a15ffe09767c5dcbc2b0b46e2fd407 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:35:48 +0000 Subject: [PATCH 179/219] chore(deps): update dependency msw to v2.2.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 46e5db8616..d54cbe8d35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35755,8 +35755,8 @@ __metadata: linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.2.6 - resolution: "msw@npm:2.2.6" + version: 2.2.7 + resolution: "msw@npm:2.2.7" dependencies: "@bundled-es-modules/cookie": ^2.0.0 "@bundled-es-modules/statuses": ^1.0.1 @@ -35782,7 +35782,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: b33867107f2603195b9825bcd79027895a9d72e72d0863e60d31a5d28ddd0398604bd7360d5102cfbe5438242c636820797274ce8d0bb992774e05547918d0cd + checksum: 9a9c12a59fabe56634558a9831bae46a83c306cd828a903f0df4f6ca38724466e1f5b3b217737a787c20a30c713b83676a14bef69e22820da5805ab7381a5163 languageName: node linkType: hard From 4467036e2abf1116c7e575712ed91c1351da8643 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 11:40:39 +0100 Subject: [PATCH 180/219] plugins: allow unauthenticated access to health check endpoints Signed-off-by: Patrik Oldsberg --- .changeset/cyan-dragons-shave.md | 16 ++++++++++++++++ plugins/airbrake-backend/src/plugin.ts | 4 ++++ plugins/azure-devops-backend/src/plugin.ts | 4 ++++ plugins/azure-sites-backend/src/plugin.ts | 4 ++++ plugins/code-coverage-backend/src/plugin.ts | 4 ++++ plugins/devtools-backend/src/plugin.ts | 4 ++++ plugins/example-todo-list-backend/src/plugin.ts | 4 ++++ plugins/linguist-backend/src/plugin.ts | 4 ++++ plugins/nomad-backend/src/plugin.ts | 4 ++++ plugins/notifications-backend/src/plugin.ts | 4 ++++ plugins/periskop-backend/src/alpha.ts | 4 ++++ plugins/permission-backend/src/plugin.ts | 4 ++++ plugins/signals-backend/src/plugin.ts | 4 ++++ plugins/vault-backend/src/service/plugin.ts | 4 ++++ 14 files changed, 68 insertions(+) create mode 100644 .changeset/cyan-dragons-shave.md diff --git a/.changeset/cyan-dragons-shave.md b/.changeset/cyan-dragons-shave.md new file mode 100644 index 0000000000..6d591c5d31 --- /dev/null +++ b/.changeset/cyan-dragons-shave.md @@ -0,0 +1,16 @@ +--- +'@backstage/plugin-code-coverage-backend': patch +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-azure-devops-backend': patch +'@backstage/plugin-azure-sites-backend': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-airbrake-backend': patch +'@backstage/plugin-devtools-backend': patch +'@backstage/plugin-linguist-backend': patch +'@backstage/plugin-periskop-backend': patch +'@backstage/plugin-signals-backend': patch +'@backstage/plugin-nomad-backend': patch +'@backstage/plugin-vault-backend': patch +--- + +Allow unauthenticated access to health check endpoint. diff --git a/plugins/airbrake-backend/src/plugin.ts b/plugins/airbrake-backend/src/plugin.ts index 90e790c05f..83606ba115 100644 --- a/plugins/airbrake-backend/src/plugin.ts +++ b/plugins/airbrake-backend/src/plugin.ts @@ -43,6 +43,10 @@ export const airbrakePlugin = createBackendPlugin({ logger: loggerToWinstonLogger(logger), }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/azure-devops-backend/src/plugin.ts b/plugins/azure-devops-backend/src/plugin.ts index 1cf17ceecc..f378e9c62e 100644 --- a/plugins/azure-devops-backend/src/plugin.ts +++ b/plugins/azure-devops-backend/src/plugin.ts @@ -46,6 +46,10 @@ export const azureDevOpsPlugin = createBackendPlugin({ permissions, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/azure-sites-backend/src/plugin.ts b/plugins/azure-sites-backend/src/plugin.ts index a8afe4e430..5416e853a1 100644 --- a/plugins/azure-sites-backend/src/plugin.ts +++ b/plugins/azure-sites-backend/src/plugin.ts @@ -63,6 +63,10 @@ export const azureSitesPlugin = createBackendPlugin({ httpAuth, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/code-coverage-backend/src/plugin.ts b/plugins/code-coverage-backend/src/plugin.ts index 340280795f..0ddb6418bc 100644 --- a/plugins/code-coverage-backend/src/plugin.ts +++ b/plugins/code-coverage-backend/src/plugin.ts @@ -54,6 +54,10 @@ export const codeCoveragePlugin = createBackendPlugin({ database, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/devtools-backend/src/plugin.ts b/plugins/devtools-backend/src/plugin.ts index 28447e02cc..fb0bb8b048 100644 --- a/plugins/devtools-backend/src/plugin.ts +++ b/plugins/devtools-backend/src/plugin.ts @@ -55,6 +55,10 @@ export const devtoolsPlugin = createBackendPlugin({ httpAuth, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/example-todo-list-backend/src/plugin.ts b/plugins/example-todo-list-backend/src/plugin.ts index 6bdae201f1..1838a8a165 100644 --- a/plugins/example-todo-list-backend/src/plugin.ts +++ b/plugins/example-todo-list-backend/src/plugin.ts @@ -42,6 +42,10 @@ export const exampleTodoListPlugin = createBackendPlugin({ logger: loggerToWinstonLogger(logger), }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/linguist-backend/src/plugin.ts b/plugins/linguist-backend/src/plugin.ts index e569b00233..e6de4297ad 100644 --- a/plugins/linguist-backend/src/plugin.ts +++ b/plugins/linguist-backend/src/plugin.ts @@ -68,6 +68,10 @@ export const linguistPlugin = createBackendPlugin({ tokenManager, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/nomad-backend/src/plugin.ts b/plugins/nomad-backend/src/plugin.ts index f3a43c4a91..3c6a34f5fa 100644 --- a/plugins/nomad-backend/src/plugin.ts +++ b/plugins/nomad-backend/src/plugin.ts @@ -46,6 +46,10 @@ export const nomadPlugin = createBackendPlugin({ config, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/notifications-backend/src/plugin.ts b/plugins/notifications-backend/src/plugin.ts index 9f4c5912fd..c0344fb06f 100644 --- a/plugins/notifications-backend/src/plugin.ts +++ b/plugins/notifications-backend/src/plugin.ts @@ -90,6 +90,10 @@ export const notificationsPlugin = createBackendPlugin({ processors: processingExtensions.processors, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/periskop-backend/src/alpha.ts b/plugins/periskop-backend/src/alpha.ts index 59271e02fc..c18e0dc87d 100644 --- a/plugins/periskop-backend/src/alpha.ts +++ b/plugins/periskop-backend/src/alpha.ts @@ -39,6 +39,10 @@ export default createBackendPlugin({ httpRouter.use( await createRouter({ config, logger: loggerToWinstonLogger(logger) }), ); + httpRouter.addAuthPolicy({ + allow: 'unauthenticated', + path: '/health', + }); }, }); }, diff --git a/plugins/permission-backend/src/plugin.ts b/plugins/permission-backend/src/plugin.ts index cc7f31dfdd..28555b1836 100644 --- a/plugins/permission-backend/src/plugin.ts +++ b/plugins/permission-backend/src/plugin.ts @@ -86,6 +86,10 @@ export const permissionPlugin = createBackendPlugin({ userInfo, }), ); + http.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/signals-backend/src/plugin.ts b/plugins/signals-backend/src/plugin.ts index 2cd1917bfb..d20506f004 100644 --- a/plugins/signals-backend/src/plugin.ts +++ b/plugins/signals-backend/src/plugin.ts @@ -57,6 +57,10 @@ export const signalsPlugin = createBackendPlugin({ events, }), ); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, diff --git a/plugins/vault-backend/src/service/plugin.ts b/plugins/vault-backend/src/service/plugin.ts index cf9d2cf87b..200bc092d5 100644 --- a/plugins/vault-backend/src/service/plugin.ts +++ b/plugins/vault-backend/src/service/plugin.ts @@ -68,6 +68,10 @@ export const vaultPlugin = createBackendPlugin({ const { router } = builder.build(); httpRouter.use(router); + httpRouter.addAuthPolicy({ + path: '/health', + allow: 'unauthenticated', + }); }, }); }, From 112ec7b48617f96b52e4f171719d1125b4cec042 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:17:03 +0000 Subject: [PATCH 181/219] fix(deps): update dependency date-fns to v3.6.0 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 1f19f41e3c..e6e91d5ecd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25252,9 +25252,9 @@ __metadata: linkType: hard "date-fns@npm:^3.0.0": - version: 3.5.0 - resolution: "date-fns@npm:3.5.0" - checksum: 0f326b72aff0a10b5a7a253d7790462263ee3c79b4283fdbb423c3159017f7ddb7cfd8e509ce94c652825232e9aa84278143f333ddb357bc6b03bd39eebd6f5d + version: 3.6.0 + resolution: "date-fns@npm:3.6.0" + checksum: 0daa1e9a436cf99f9f2ae9232b55e11f3dd46132bee10987164f3eebd29f245b2e066d7d7db40782627411ecf18551d8f4c9fcdf2226e48bb66545407d448ab7 languageName: node linkType: hard From 40d44e3efb136fe2f263a045f5cd466ca19f679a Mon Sep 17 00:00:00 2001 From: Min Kim Date: Mon, 18 Mar 2024 10:31:21 -0400 Subject: [PATCH 182/219] Add default sign in page with a guest provider Signed-off-by: Min Kim --- .../default-app/packages/app/src/App.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/app/src/App.tsx b/packages/create-app/templates/default-app/packages/app/src/App.tsx index 8d62f29c52..df21e95ffb 100644 --- a/packages/create-app/templates/default-app/packages/app/src/App.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/App.tsx @@ -27,7 +27,11 @@ import { entityPage } from './components/catalog/EntityPage'; import { searchPage } from './components/search/SearchPage'; import { Root } from './components/Root'; -import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; +import { + AlertDisplay, + OAuthRequestDialog, + SignInPage, +} from '@backstage/core-components'; import { createApp } from '@backstage/app-defaults'; import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; @@ -53,6 +57,17 @@ const app = createApp({ catalogIndex: catalogPlugin.routes.catalogIndex, }); }, + components: { + SignInPage: props => ( + + ) + } }); const routes = ( From cadbb82712421fec54d8b5295f1e1386af0dd2e1 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 16:38:55 +0100 Subject: [PATCH 183/219] cli: add experimental lazy compilation flag Signed-off-by: Patrik Oldsberg --- .changeset/curvy-flies-own.md | 5 +++++ packages/cli/src/lib/bundler/config.ts | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/curvy-flies-own.md diff --git a/.changeset/curvy-flies-own.md b/.changeset/curvy-flies-own.md new file mode 100644 index 0000000000..19fcc6bf62 --- /dev/null +++ b/.changeset/curvy-flies-own.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Added a `EXPERIMENTAL_LAZY_COMPILATION` flag, which enables the experimental Webpack lazy compilation option in frontend builds. diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index 581ead8575..8245cf61b3 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -224,6 +224,9 @@ export async function createConfig( } : {}), }, + experiments: { + lazyCompilation: yn(process.env.EXPERIMENTAL_LAZY_COMPILATION), + }, plugins, ...(withCache ? { From 19dadcb17391ad723cb3816640e7de8e9955cceb Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 18 Mar 2024 16:45:18 +0100 Subject: [PATCH 184/219] feat: add location analyzer to github module and refactor Signed-off-by: blam --- ...er.test.ts => githubCatalogModule.test.ts} | 25 ++++++++++++--- ...tityProvider.ts => githubCatalogModule.ts} | 32 ++++++++++++++++--- .../src/module/index.ts | 2 +- 3 files changed, 49 insertions(+), 10 deletions(-) rename plugins/catalog-backend-module-github/src/module/{catalogModuleGithubEntityProvider.test.ts => githubCatalogModule.test.ts} (75%) rename plugins/catalog-backend-module-github/src/module/{catalogModuleGithubEntityProvider.ts => githubCatalogModule.ts} (64%) diff --git a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts similarity index 75% rename from plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts rename to plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts index cb38be1a5d..0f466fefb7 100644 --- a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts @@ -17,11 +17,15 @@ import { TaskScheduleDefinition } from '@backstage/backend-tasks'; import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; import { EntityProvider } from '@backstage/plugin-catalog-node'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { + catalogAnalysisExtensionPoint, + catalogProcessingExtensionPoint, +} from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { catalogModuleGithubEntityProvider } from './catalogModuleGithubEntityProvider'; +import { githubCatalogModule } from './githubCatalogModule'; +import { GithubLocationAnalyzer } from '../analyzers/GithubLocationAnalyzer'; -describe('catalogModuleGithubEntityProvider', () => { +describe('githubCatalogModule', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -31,6 +35,11 @@ describe('catalogModuleGithubEntityProvider', () => { addedProviders = providers; }, }; + + const analysisExtensionPoint = { + addLocationAnalyzer: jest.fn(), + }; + const runner = jest.fn(); const scheduler = mockServices.scheduler.mock({ createScheduledTaskRunner(schedule) { @@ -54,9 +63,12 @@ describe('catalogModuleGithubEntityProvider', () => { }; await startTestBackend({ - extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], + extensionPoints: [ + [catalogProcessingExtensionPoint, extensionPoint], + [catalogAnalysisExtensionPoint, analysisExtensionPoint], + ], features: [ - catalogModuleGithubEntityProvider(), + githubCatalogModule(), mockServices.rootConfig.factory({ data: config }), scheduler.factory, ], @@ -69,5 +81,8 @@ describe('catalogModuleGithubEntityProvider', () => { 'github-provider:default', ); expect(runner).not.toHaveBeenCalled(); + expect(analysisExtensionPoint.addLocationAnalyzer).toHaveBeenCalledWith( + expect.any(GithubLocationAnalyzer), + ); }); }); diff --git a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts similarity index 64% rename from plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts rename to plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts index bfa8cf2a4e..cb9d1c43f6 100644 --- a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts @@ -19,26 +19,50 @@ import { coreServices, } from '@backstage/backend-plugin-api'; import { loggerToWinstonLogger } from '@backstage/backend-common'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { + catalogAnalysisExtensionPoint, + catalogProcessingExtensionPoint, +} from '@backstage/plugin-catalog-node/alpha'; import { GithubEntityProvider } from '../providers/GithubEntityProvider'; +import { GithubLocationAnalyzer } from '../analyzers/GithubLocationAnalyzer'; /** * Registers the `GithubEntityProvider` with the catalog processing extension point. * * @alpha */ -export const catalogModuleGithubEntityProvider = createBackendModule({ +export const githubCatalogModule = createBackendModule({ pluginId: 'catalog', - moduleId: 'github-entity-provider', + moduleId: 'github', register(env) { env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, + analyzers: catalogAnalysisExtensionPoint, + auth: coreServices.auth, + tokenManager: coreServices.tokenManager, + discovery: coreServices.discovery, config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, }, - async init({ catalog, config, logger, scheduler }) { + async init({ + catalog, + config, + logger, + scheduler, + analyzers, + discovery, + auth, + }) { + analyzers.addLocationAnalyzer( + new GithubLocationAnalyzer({ + discovery, + config, + auth, + }), + ); + catalog.addEntityProvider( GithubEntityProvider.fromConfig(config, { logger: loggerToWinstonLogger(logger), diff --git a/plugins/catalog-backend-module-github/src/module/index.ts b/plugins/catalog-backend-module-github/src/module/index.ts index 9c9331763c..02b377a4b2 100644 --- a/plugins/catalog-backend-module-github/src/module/index.ts +++ b/plugins/catalog-backend-module-github/src/module/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { catalogModuleGithubEntityProvider as default } from './catalogModuleGithubEntityProvider'; +export { githubCatalogModule as default } from './githubCatalogModule'; From 9eab52ae2b510c7a71265ec585b0f071597a532b Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 18 Mar 2024 16:46:34 +0100 Subject: [PATCH 185/219] chore: changeset Signed-off-by: blam --- .changeset/tall-jeans-buy.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tall-jeans-buy.md diff --git a/.changeset/tall-jeans-buy.md b/.changeset/tall-jeans-buy.md new file mode 100644 index 0000000000..6892c886b0 --- /dev/null +++ b/.changeset/tall-jeans-buy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Add location analyzer when installing the module From 317085836d2b3b58a62e63af3b4657b1095d9b94 Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 2 Feb 2024 11:36:42 -0700 Subject: [PATCH 186/219] feat: delete unprocessed entity Signed-off-by: Kurt King --- .../src/UnprocessedEntitiesModule.ts | 12 +- .../src/api/index.ts | 10 ++ .../src/components/FailedEntities.tsx | 108 ++++++++++++------ 3 files changed, 92 insertions(+), 38 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index a01f717e12..72713178e8 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -120,6 +120,16 @@ export class UnprocessedEntitiesModule { owner: req.query.owner as string, }), ); - }); + }) + .delete( + '/entities/unprocessed/delete/:entity_id', + async (request, response) => { + await this.database('refresh_state') + .where({ entity_id: request.params.entity_id }) + .delete(); + + response.status(204).send(); + }, + ); } } diff --git a/plugins/catalog-unprocessed-entities/src/api/index.ts b/plugins/catalog-unprocessed-entities/src/api/index.ts index 92dde93a93..030a4d0293 100644 --- a/plugins/catalog-unprocessed-entities/src/api/index.ts +++ b/plugins/catalog-unprocessed-entities/src/api/index.ts @@ -54,6 +54,10 @@ export interface CatalogUnprocessedEntitiesApi { * Returns a list of entities with state 'failed' */ failed(): Promise; + /** + * Deletes an entity from the refresh_state table + */ + delete(entity_id: string): Promise; } /** @@ -83,4 +87,10 @@ export class CatalogUnprocessedEntitiesClient async failed(): Promise { return await this.fetch('entities/unprocessed/failed'); } + + async delete(entity_id: string): Promise { + await this.fetch(`entities/unprocessed/delete/${entity_id}`, { + method: 'DELETE', + }); + } } diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx index a1044c6679..4c01b888b2 100644 --- a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx @@ -22,15 +22,18 @@ import { Table, TableColumn, } from '@backstage/core-components'; -import { useApi } from '@backstage/core-plugin-api'; + import Box from '@material-ui/core/Box'; import Typography from '@material-ui/core/Typography'; +import IconButton from '@material-ui/core/IconButton'; import { Theme, makeStyles } from '@material-ui/core/styles'; +import { alertApiRef, useApi } from '@backstage/core-plugin-api'; import { UnprocessedEntity } from '../types'; import { EntityDialog } from './EntityDialog'; import { catalogUnprocessedEntitiesApiRef } from '../api'; import useAsync from 'react-use/lib/useAsync'; +import DeleteIcon from '@material-ui/icons/Delete'; const useStyles = makeStyles((theme: Theme) => ({ errorBox: { @@ -94,6 +97,8 @@ export const FailedEntities = () => { value: data, } = useAsync(async () => await unprocessedApi.failed()); const [, setSelectedSearchTerm] = useState(''); + const unprocessedEntityApi = useApi(catalogUnprocessedEntitiesApiRef); + const alertApi = useApi(alertApiRef); if (loading) { return ; @@ -102,6 +107,21 @@ export const FailedEntities = () => { return ; } + const handleDelete = async ({ id }: { id: string }) => { + try { + await unprocessedEntityApi.delete(id); + alertApi.post({ + message: `Entity has been deleted`, + severity: 'success', + }); + } catch (e) { + alertApi.post({ + message: `Ran into an issue when deleting. Please try again later.`, + severity: 'error', + }); + } + }; + const columns: TableColumn[] = [ { title: entityRef, @@ -136,43 +156,57 @@ export const FailedEntities = () => { ), }, + { + title: Actions, + render: (rowData: UnprocessedEntity | {}) => { + return ( + + await handleDelete({ + id: (rowData as UnprocessedEntity).entity_id, + }) + } + > + + + ); + }, + }, ]; + return ( - <> - - No failed entities found - - } - onSearchChange={(searchTerm: string) => - setSelectedSearchTerm(searchTerm) - } - detailPanel={({ rowData }) => { - const errors = (rowData as UnprocessedEntity).errors; - return ( - <> - {errors?.map(e => { - return ( - - - {e.name} - - - - - ); - })} - - ); - }} - /> - +
+ No failed entities found + + } + onSearchChange={(searchTerm: string) => setSelectedSearchTerm(searchTerm)} + detailPanel={({ rowData }) => { + const errors = (rowData as UnprocessedEntity).errors; + return ( + <> + {errors?.map((e, idx) => { + return ( + + + {e.name} + + + + + ); + })} + + ); + }} + /> ); }; From 93da9004dcecc9816f3f1189fc055b20402bd2e1 Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 2 Feb 2024 12:23:14 -0700 Subject: [PATCH 187/219] docs: new api report Signed-off-by: Kurt King --- plugins/catalog-unprocessed-entities/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog-unprocessed-entities/api-report.md b/plugins/catalog-unprocessed-entities/api-report.md index cc4d6bba88..0fea84256b 100644 --- a/plugins/catalog-unprocessed-entities/api-report.md +++ b/plugins/catalog-unprocessed-entities/api-report.md @@ -14,6 +14,7 @@ import { RouteRef } from '@backstage/core-plugin-api'; // @public export interface CatalogUnprocessedEntitiesApi { + delete(entity_id: string): Promise; failed(): Promise; pending(): Promise; } From 48329dc965057b66e14813a70ddd7e7e8ef632ce Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 2 Feb 2024 12:32:16 -0700 Subject: [PATCH 188/219] include entityRef in alert output Signed-off-by: Kurt King --- .../src/components/FailedEntities.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx index 4c01b888b2..4618953af2 100644 --- a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx @@ -107,16 +107,22 @@ export const FailedEntities = () => { return ; } - const handleDelete = async ({ id }: { id: string }) => { + const handleDelete = async ({ + id, + entityRef, + }: { + id: string; + entityRef: string; + }) => { try { await unprocessedEntityApi.delete(id); alertApi.post({ - message: `Entity has been deleted`, + message: `Entity ${entityRef} has been deleted`, severity: 'success', }); } catch (e) { alertApi.post({ - message: `Ran into an issue when deleting. Please try again later.`, + message: `Ran into an issue when deleting ${entityRef}. Please try again later.`, severity: 'error', }); } @@ -165,6 +171,7 @@ export const FailedEntities = () => { onClick={async () => await handleDelete({ id: (rowData as UnprocessedEntity).entity_id, + entityRef: (rowData as UnprocessedEntity).entity_ref, }) } > From fc4a5b0a7f8718d30205e211e28ee4e3ad93e8fd Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 2 Feb 2024 13:09:11 -0700 Subject: [PATCH 189/219] fix: returning resp.json() because 204 status responses do not have a json payload Signed-off-by: Kurt King --- plugins/catalog-unprocessed-entities/src/api/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-unprocessed-entities/src/api/index.ts b/plugins/catalog-unprocessed-entities/src/api/index.ts index 030a4d0293..ae5feedf84 100644 --- a/plugins/catalog-unprocessed-entities/src/api/index.ts +++ b/plugins/catalog-unprocessed-entities/src/api/index.ts @@ -73,11 +73,12 @@ export class CatalogUnprocessedEntitiesClient private async fetch(path: string, init?: RequestInit): Promise { const url = await this.discovery.getBaseUrl('catalog'); const resp = await this.fetchApi.fetch(`${url}/${path}`, init); + if (!resp.ok) { throw await ResponseError.fromResponse(resp); } - return await resp.json(); + return resp.status === 204 ? (resp as T) : await resp.json(); } async pending(): Promise { From 1f471f0ac4b17acffb7c8b8f5e5b78eb1ddc0c34 Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 2 Feb 2024 13:12:51 -0700 Subject: [PATCH 190/219] refactor: id to entityId Signed-off-by: Kurt King --- plugins/catalog-unprocessed-entities/api-report.md | 2 +- .../catalog-unprocessed-entities/src/api/index.ts | 6 +++--- .../src/components/FailedEntities.tsx | 12 +++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/plugins/catalog-unprocessed-entities/api-report.md b/plugins/catalog-unprocessed-entities/api-report.md index 0fea84256b..7d8f6299da 100644 --- a/plugins/catalog-unprocessed-entities/api-report.md +++ b/plugins/catalog-unprocessed-entities/api-report.md @@ -14,7 +14,7 @@ import { RouteRef } from '@backstage/core-plugin-api'; // @public export interface CatalogUnprocessedEntitiesApi { - delete(entity_id: string): Promise; + delete(entityId: string): Promise; failed(): Promise; pending(): Promise; } diff --git a/plugins/catalog-unprocessed-entities/src/api/index.ts b/plugins/catalog-unprocessed-entities/src/api/index.ts index ae5feedf84..dfff3e15f7 100644 --- a/plugins/catalog-unprocessed-entities/src/api/index.ts +++ b/plugins/catalog-unprocessed-entities/src/api/index.ts @@ -57,7 +57,7 @@ export interface CatalogUnprocessedEntitiesApi { /** * Deletes an entity from the refresh_state table */ - delete(entity_id: string): Promise; + delete(entityId: string): Promise; } /** @@ -89,8 +89,8 @@ export class CatalogUnprocessedEntitiesClient return await this.fetch('entities/unprocessed/failed'); } - async delete(entity_id: string): Promise { - await this.fetch(`entities/unprocessed/delete/${entity_id}`, { + async delete(entityId: string): Promise { + await this.fetch(`entities/unprocessed/delete/${entityId}`, { method: 'DELETE', }); } diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx index 4618953af2..ca5ca942c7 100644 --- a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx +++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx @@ -108,14 +108,14 @@ export const FailedEntities = () => { } const handleDelete = async ({ - id, + entityId, entityRef, }: { - id: string; + entityId: string; entityRef: string; }) => { try { - await unprocessedEntityApi.delete(id); + await unprocessedEntityApi.delete(entityId); alertApi.post({ message: `Entity ${entityRef} has been deleted`, severity: 'success', @@ -165,13 +165,15 @@ export const FailedEntities = () => { { title: Actions, render: (rowData: UnprocessedEntity | {}) => { + const { entity_id, entity_ref } = rowData as UnprocessedEntity; + return ( await handleDelete({ - id: (rowData as UnprocessedEntity).entity_id, - entityRef: (rowData as UnprocessedEntity).entity_ref, + entityId: entity_id, + entityRef: entity_ref, }) } > From e86433526d19bc121758da7dbd2dd1c7f13a478c Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 2 Feb 2024 13:38:04 -0700 Subject: [PATCH 191/219] feat: support permissions Signed-off-by: Kurt King --- .../package.json | 5 +++ .../src/UnprocessedEntitiesModule.ts | 44 ++++++++++++++++++- .../.eslintrc.js | 1 + .../README.md | 5 +++ .../package.json | 35 +++++++++++++++ .../src/index.ts | 23 ++++++++++ .../src/permissions.ts | 25 +++++++++++ .../src/setupTests.ts | 16 +++++++ yarn.lock | 17 +++++-- 9 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 plugins/catalog-unprocessed-entities-common/.eslintrc.js create mode 100644 plugins/catalog-unprocessed-entities-common/README.md create mode 100644 plugins/catalog-unprocessed-entities-common/package.json create mode 100644 plugins/catalog-unprocessed-entities-common/src/index.ts create mode 100644 plugins/catalog-unprocessed-entities-common/src/permissions.ts create mode 100644 plugins/catalog-unprocessed-entities-common/src/setupTests.ts diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 26243bff51..b5091021c6 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -36,6 +36,11 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-catalog-unprocessed-entities-common": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", "express-promise-router": "^4.1.1", "knex": "^3.0.0" } diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index 72713178e8..51e3f06894 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -23,6 +23,15 @@ import { import { Knex } from 'knex'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import Router from 'express-promise-router'; +import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; +import { + AuthorizeResult, + BasicPermission, + PermissionEvaluator, +} from '@backstage/plugin-permission-common'; +import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; +import { unprocessedEntitiesDeletePermission } from '@backstage/plugin-catalog-unprocessed-entities-common'; +import { NotAllowedError } from '@backstage/errors'; /** * Module providing Unprocessed Entities API endpoints @@ -103,7 +112,31 @@ export class UnprocessedEntitiesModule { return res; } - registerRoutes() { + registerRoutes({ permissions }: { permissions: PermissionEvaluator }) { + const permissionIntegrationRouter = createPermissionIntegrationRouter({ + permissions: [unprocessedEntitiesDeletePermission], + }); + + const isRequestAuthorized = async ( + req: Request, + permission: BasicPermission, + ): Promise => { + const token = getBearerTokenFromAuthorizationHeader( + // @ts-ignore + req.header('authorization'), + ); + + const decision = ( + await permissions.authorize([{ permission }], { + token, + }) + )[0]; + + return decision.result !== AuthorizeResult.DENY; + }; + + this.router.use(permissionIntegrationRouter); + this.moduleRouter .get('/entities/unprocessed/failed', async (req, res) => { return res.json( @@ -124,6 +157,15 @@ export class UnprocessedEntitiesModule { .delete( '/entities/unprocessed/delete/:entity_id', async (request, response) => { + const authorized = await isRequestAuthorized( + request as any as Request, + unprocessedEntitiesDeletePermission, + ); + + if (!authorized) { + throw new NotAllowedError('Unauthorized'); + } + await this.database('refresh_state') .where({ entity_id: request.params.entity_id }) .delete(); diff --git a/plugins/catalog-unprocessed-entities-common/.eslintrc.js b/plugins/catalog-unprocessed-entities-common/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-unprocessed-entities-common/README.md b/plugins/catalog-unprocessed-entities-common/README.md new file mode 100644 index 0000000000..490c5e8f6e --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/README.md @@ -0,0 +1,5 @@ +# @backstage/plugin-catalog-unprocessed-entities-common + +Welcome to the common package for the catalog-unprocessed-entities plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json new file mode 100644 index 0000000000..b90f3d9182 --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -0,0 +1,35 @@ +{ + "name": "@backstage/plugin-catalog-unprocessed-entities-common", + "description": "Common functionalities for the catalog-unprocessed-entities plugin", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "common-library" + }, + "sideEffects": false, + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + }, + "files": [ + "dist" + ], + "dependencies": { + "@backstage/plugin-permission-common": "workspace:^" + } +} diff --git a/plugins/catalog-unprocessed-entities-common/src/index.ts b/plugins/catalog-unprocessed-entities-common/src/index.ts new file mode 100644 index 0000000000..cd5a39c731 --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/src/index.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +/** + * Common functionalities for the catalog-unprocessed-entities plugin. + * + * @packageDocumentation + */ + +export * from './permissions'; diff --git a/plugins/catalog-unprocessed-entities-common/src/permissions.ts b/plugins/catalog-unprocessed-entities-common/src/permissions.ts new file mode 100644 index 0000000000..c6ac44fc0b --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/src/permissions.ts @@ -0,0 +1,25 @@ +/* + * 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 { createPermission } from '@backstage/plugin-permission-common'; + +export const unprocessedEntitiesDeletePermission = createPermission({ + name: 'unprocessed-entities.delete', + attributes: { action: 'delete' }, +}); + +export const unprocessedEntitiesPermissions = { + unprocessedEntitiesDeletePermission, +}; diff --git a/plugins/catalog-unprocessed-entities-common/src/setupTests.ts b/plugins/catalog-unprocessed-entities-common/src/setupTests.ts new file mode 100644 index 0000000000..c7ce5c0988 --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export {}; diff --git a/yarn.lock b/yarn.lock index 69bf765b58..3f0bcdef53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,3 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - __metadata: version: 6 cacheKey: 8 @@ -5775,6 +5772,11 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-catalog-unprocessed-entities-common": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" express-promise-router: ^4.1.1 knex: ^3.0.0 languageName: unknown @@ -6037,6 +6039,15 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-catalog-unprocessed-entities-common@workspace:^, @backstage/plugin-catalog-unprocessed-entities-common@workspace:plugins/catalog-unprocessed-entities-common": + version: 0.0.0-use.local + resolution: "@backstage/plugin-catalog-unprocessed-entities-common@workspace:plugins/catalog-unprocessed-entities-common" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + languageName: unknown + linkType: soft + "@backstage/plugin-catalog-unprocessed-entities@workspace:^, @backstage/plugin-catalog-unprocessed-entities@workspace:plugins/catalog-unprocessed-entities": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-unprocessed-entities@workspace:plugins/catalog-unprocessed-entities" From ca6b79b6a28223babf44c0397663a5b5fbd91176 Mon Sep 17 00:00:00 2001 From: Kurt King Date: Sat, 3 Feb 2024 14:09:54 -0700 Subject: [PATCH 192/219] chore: update report Signed-off-by: Kurt King --- .../api-report.md | 15 +++++++++++++++ .../src/permissions.ts | 11 ++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 plugins/catalog-unprocessed-entities-common/api-report.md diff --git a/plugins/catalog-unprocessed-entities-common/api-report.md b/plugins/catalog-unprocessed-entities-common/api-report.md new file mode 100644 index 0000000000..6d5dc15ff5 --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/api-report.md @@ -0,0 +1,15 @@ +## API Report File for "@backstage/plugin-catalog-unprocessed-entities-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BasicPermission } from '@backstage/plugin-permission-common'; + +// @alpha +export const unprocessedEntitiesDeletePermission: BasicPermission; + +// @alpha +export const unprocessedEntitiesPermissions: { + unprocessedEntitiesDeletePermission: BasicPermission; +}; +``` diff --git a/plugins/catalog-unprocessed-entities-common/src/permissions.ts b/plugins/catalog-unprocessed-entities-common/src/permissions.ts index c6ac44fc0b..d34cc0d1dc 100644 --- a/plugins/catalog-unprocessed-entities-common/src/permissions.ts +++ b/plugins/catalog-unprocessed-entities-common/src/permissions.ts @@ -15,11 +15,20 @@ */ import { createPermission } from '@backstage/plugin-permission-common'; +/** + * This permission is used to designate actions that involve removing an + * unprocessed entity record from the refresh_state table. + * @public + */ export const unprocessedEntitiesDeletePermission = createPermission({ - name: 'unprocessed-entities.delete', + name: 'catalog.entities.unprocessed.delete', attributes: { action: 'delete' }, }); +/** + * List of all unprocessed entity permissions + * @public + */ export const unprocessedEntitiesPermissions = { unprocessedEntitiesDeletePermission, }; From 845d40e1b6dc09c28e85bdc1941e1bb10fc233cf Mon Sep 17 00:00:00 2001 From: Kurt King Date: Mon, 12 Feb 2024 22:31:23 -0700 Subject: [PATCH 193/219] chore: api reports Signed-off-by: Kurt King --- plugins/catalog-backend-module-unprocessed/api-report.md | 3 ++- plugins/catalog-unprocessed-entities-common/api-report.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/api-report.md b/plugins/catalog-backend-module-unprocessed/api-report.md index 569bd572da..1309e5bdaa 100644 --- a/plugins/catalog-backend-module-unprocessed/api-report.md +++ b/plugins/catalog-backend-module-unprocessed/api-report.md @@ -6,6 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import { Knex } from 'knex'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; // @public const catalogModuleUnprocessedEntities: () => BackendFeature; @@ -15,6 +16,6 @@ export default catalogModuleUnprocessedEntities; export class UnprocessedEntitiesModule { constructor(database: Knex, router: Pick); // (undocumented) - registerRoutes(): void; + registerRoutes({ permissions }: { permissions: PermissionEvaluator }): void; } ``` diff --git a/plugins/catalog-unprocessed-entities-common/api-report.md b/plugins/catalog-unprocessed-entities-common/api-report.md index 6d5dc15ff5..03b316eebb 100644 --- a/plugins/catalog-unprocessed-entities-common/api-report.md +++ b/plugins/catalog-unprocessed-entities-common/api-report.md @@ -5,10 +5,10 @@ ```ts import { BasicPermission } from '@backstage/plugin-permission-common'; -// @alpha +// @public export const unprocessedEntitiesDeletePermission: BasicPermission; -// @alpha +// @public export const unprocessedEntitiesPermissions: { unprocessedEntitiesDeletePermission: BasicPermission; }; From db06fce59273110d50457063adc9124602cd7f6c Mon Sep 17 00:00:00 2001 From: Kurt King Date: Tue, 13 Feb 2024 09:25:34 -0700 Subject: [PATCH 194/219] chore: add missing catalog file Signed-off-by: Kurt King --- .../catalog-info.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/catalog-unprocessed-entities-common/catalog-info.yaml diff --git a/plugins/catalog-unprocessed-entities-common/catalog-info.yaml b/plugins/catalog-unprocessed-entities-common/catalog-info.yaml new file mode 100644 index 0000000000..7494c41b5c --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/catalog-info.yaml @@ -0,0 +1,9 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-catalog-unprocessed-entities-common + title: '@backstage/plugin-catalog-unprocessed-entities-common' +spec: + lifecycle: experimental + type: backstage-common-library + owner: catalog-maintainers From 924c1ac616ef8160559ca4812bf6e70b99a27a2d Mon Sep 17 00:00:00 2001 From: Kurt King Date: Thu, 15 Feb 2024 14:38:57 -0700 Subject: [PATCH 195/219] chore: changeset Signed-off-by: Kurt King --- .changeset/warm-buses-do.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/warm-buses-do.md diff --git a/.changeset/warm-buses-do.md b/.changeset/warm-buses-do.md new file mode 100644 index 0000000000..27eac558c8 --- /dev/null +++ b/.changeset/warm-buses-do.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-catalog-backend-module-unprocessed': minor +'@backstage/plugin-catalog-unprocessed-entities': minor +'@backstage/plugin-catalog-unprocessed-entities-common': patch +--- + +Add the ability to delete an unprocessed entity from the `refresh_state` table +∫ From 31855d303c3ee09aa59475c85982e1e01027b296 Mon Sep 17 00:00:00 2001 From: Kurt King Date: Fri, 16 Feb 2024 07:28:58 -0700 Subject: [PATCH 196/219] Update .changeset/warm-buses-do.md Co-authored-by: Ben Lambert Signed-off-by: Kurt King --- .changeset/warm-buses-do.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/warm-buses-do.md b/.changeset/warm-buses-do.md index 27eac558c8..bd1e354a60 100644 --- a/.changeset/warm-buses-do.md +++ b/.changeset/warm-buses-do.md @@ -5,4 +5,3 @@ --- Add the ability to delete an unprocessed entity from the `refresh_state` table -∫ From 7a40ad392acd9f0e29ab9d8f0eb735da4a2d6e1e Mon Sep 17 00:00:00 2001 From: Kurt King Date: Mon, 4 Mar 2024 08:09:42 -0700 Subject: [PATCH 197/219] chore: update changeset Signed-off-by: Kurt King --- .changeset/warm-buses-do.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.changeset/warm-buses-do.md b/.changeset/warm-buses-do.md index bd1e354a60..2acd90dd48 100644 --- a/.changeset/warm-buses-do.md +++ b/.changeset/warm-buses-do.md @@ -4,4 +4,6 @@ '@backstage/plugin-catalog-unprocessed-entities-common': patch --- -Add the ability to delete an unprocessed entity from the `refresh_state` table +Breaking change - `@backstage/plugin-catalog-backend-module-unprocessed` + +Adds the ability to delete an unprocessed entity from the `refresh_state` table. This change requires enabling permissions for your Backstage instance. From ed4f88b19586218ec8b1e06695745ab1ed4764c5 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 13 Mar 2024 14:38:00 +0100 Subject: [PATCH 198/219] chore: fix yarn Signed-off-by: blam --- yarn.lock | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yarn.lock b/yarn.lock index 3f0bcdef53..501c88b70e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,3 +1,6 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + __metadata: version: 6 cacheKey: 8 From 319d58e796a7f429cb28a3b6643e63b96018d86a Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 13 Mar 2024 15:02:11 +0100 Subject: [PATCH 199/219] chore: fix build, install and checks Signed-off-by: blam --- packages/backend/src/plugins/catalog.ts | 4 +- .../src/module.ts | 6 ++- .../package.json | 39 +++++++++++-------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 9b92b4eb06..95e86ddd23 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -41,7 +41,9 @@ export default async function createPlugin( await env.database.getClient(), router, ); - unprocessed.registerRoutes(); + + unprocessed.registerRoutes({ permissions: env.permissions }); + await processingEngine.start(); return router; } diff --git a/plugins/catalog-backend-module-unprocessed/src/module.ts b/plugins/catalog-backend-module-unprocessed/src/module.ts index 8c724d432d..310d78810f 100644 --- a/plugins/catalog-backend-module-unprocessed/src/module.ts +++ b/plugins/catalog-backend-module-unprocessed/src/module.ts @@ -34,14 +34,16 @@ export const catalogModuleUnprocessedEntities = createBackendModule({ database: coreServices.database, router: coreServices.httpRouter, logger: coreServices.logger, + permissions: coreServices.permissions, }, - async init({ database, router, logger }) { + async init({ database, router, logger, permissions }) { const module = new UnprocessedEntitiesModule( await database.getClient(), router, ); - module.registerRoutes(); + module.registerRoutes({ permissions }); + logger.info( 'registered additional routes for catalogModuleUnprocessedEntities', ); diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json index b90f3d9182..68a5a346b5 100644 --- a/plugins/catalog-unprocessed-entities-common/package.json +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -1,35 +1,40 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities-common", - "description": "Common functionalities for the catalog-unprocessed-entities plugin", "version": "0.0.0", - "main": "src/index.ts", - "types": "src/index.ts", - "license": "Apache-2.0", + "description": "Common functionalities for the catalog-unprocessed-entities plugin", + "backstage": { + "role": "common-library" + }, "publishConfig": { "access": "public", "main": "dist/index.cjs.js", "module": "dist/index.esm.js", "types": "dist/index.d.ts" }, - "backstage": { - "role": "common-library" + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/catalog-unprocessed-entities-common" }, + "license": "Apache-2.0", "sideEffects": false, - "scripts": { - "build": "backstage-cli package build", - "lint": "backstage-cli package lint", - "test": "backstage-cli package test", - "clean": "backstage-cli package clean", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack" - }, - "devDependencies": { - "@backstage/cli": "workspace:^" - }, + "main": "src/index.ts", + "types": "src/index.ts", "files": [ "dist" ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "test": "backstage-cli package test" + }, "dependencies": { "@backstage/plugin-permission-common": "workspace:^" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" } } From 04ab59d00f440ac5695f68e8864439491684c668 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 13 Mar 2024 19:04:32 +0100 Subject: [PATCH 200/219] chore: update changeset a little Signed-off-by: blam Signed-off-by: blam --- .changeset/warm-buses-do.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.changeset/warm-buses-do.md b/.changeset/warm-buses-do.md index 2acd90dd48..8290679e51 100644 --- a/.changeset/warm-buses-do.md +++ b/.changeset/warm-buses-do.md @@ -4,6 +4,13 @@ '@backstage/plugin-catalog-unprocessed-entities-common': patch --- -Breaking change - `@backstage/plugin-catalog-backend-module-unprocessed` +**BREAKING**- the `@backstage/plugin-catalog-backend-module-unprocessed` now requires the `permissionsApi`. +If you're using this module in the old backend system you'll need to pass the `permissions` object to the `registerRoutes` method in `packages/backend/src/plugins/catalog.ts`. +No changes should be required if you're using the new backend system. + +```diff +- unprocessed.registerRoutes(); ++ unprocessed.registerRoutes({ permissions: env.permissions }); +``` Adds the ability to delete an unprocessed entity from the `refresh_state` table. This change requires enabling permissions for your Backstage instance. From b9caacec7d907cc61f3e40bf8fb6aa708057c2d0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 16:54:03 +0100 Subject: [PATCH 201/219] app: use experimental lazy compilation Signed-off-by: Patrik Oldsberg --- packages/app/package.json | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 746d05bf5c..203a0ad5ed 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,17 +1,39 @@ { "name": "example-app", "version": "0.2.93-next.2", - "private": true, "backstage": { "role": "frontend" }, - "bundled": true, + "private": true, "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", "directory": "packages/app" }, + "license": "Apache-2.0", + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "start": "cross-env EXPERIMENTAL_LAZY_COMPILATION=1 backstage-cli package start", + "test": "backstage-cli package test" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, "dependencies": { "@backstage/app-defaults": "workspace:^", "@backstage/catalog-model": "workspace:^", @@ -121,27 +143,5 @@ "@types/zen-observable": "^0.8.0", "cross-env": "^7.0.0" }, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "test": "backstage-cli package test", - "lint": "backstage-cli package lint" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "files": [ - "dist" - ], - "license": "Apache-2.0" + "bundled": true } From 8068ee84e3a3d2deccc3c89f8491d073dd5637db Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 18 Mar 2024 17:05:44 +0100 Subject: [PATCH 202/219] chore: use the new auth adapters Signed-off-by: blam --- .../package.json | 4 ++- .../src/UnprocessedEntitiesModule.ts | 33 ++++++++++++------- .../src/module.ts | 16 +++++++-- yarn.lock | 2 ++ 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index b5091021c6..16feb612cb 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -28,12 +28,14 @@ "postpack": "backstage-cli package postpack" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/express": "^4.17.6" }, "files": [ "dist" ], "dependencies": { + "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/errors": "workspace:^", diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index 51e3f06894..48f4ea58cf 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -21,17 +21,23 @@ import { UnprocessedEntitiesResponse, } from './types'; import { Knex } from 'knex'; -import { HttpRouterService } from '@backstage/backend-plugin-api'; +import { + DiscoveryService, + HttpAuthService, + HttpRouterService, + PermissionsService, +} from '@backstage/backend-plugin-api'; import Router from 'express-promise-router'; -import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; +import type { Request } from 'express'; + import { AuthorizeResult, BasicPermission, - PermissionEvaluator, } from '@backstage/plugin-permission-common'; import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; import { unprocessedEntitiesDeletePermission } from '@backstage/plugin-catalog-unprocessed-entities-common'; import { NotAllowedError } from '@backstage/errors'; +import { createLegacyAuthAdapters } from '@backstage/backend-common'; /** * Module providing Unprocessed Entities API endpoints @@ -41,12 +47,22 @@ import { NotAllowedError } from '@backstage/errors'; export class UnprocessedEntitiesModule { private readonly moduleRouter; + private readonly httpAuth: HttpAuthService; + constructor( private readonly database: Knex, private readonly router: Pick, + private readonly permissions: PermissionsService, + discovery: DiscoveryService, + httpAuth?: HttpAuthService, ) { this.moduleRouter = Router(); this.router.use(this.moduleRouter); + + this.httpAuth = createLegacyAuthAdapters({ + discovery, + httpAuth, + }).httpAuth; } private async unprocessed( @@ -112,7 +128,7 @@ export class UnprocessedEntitiesModule { return res; } - registerRoutes({ permissions }: { permissions: PermissionEvaluator }) { + registerRoutes() { const permissionIntegrationRouter = createPermissionIntegrationRouter({ permissions: [unprocessedEntitiesDeletePermission], }); @@ -121,14 +137,9 @@ export class UnprocessedEntitiesModule { req: Request, permission: BasicPermission, ): Promise => { - const token = getBearerTokenFromAuthorizationHeader( - // @ts-ignore - req.header('authorization'), - ); - const decision = ( - await permissions.authorize([{ permission }], { - token, + await this.permissions.authorize([{ permission }], { + credentials: await this.httpAuth.credentials(req), }) )[0]; diff --git a/plugins/catalog-backend-module-unprocessed/src/module.ts b/plugins/catalog-backend-module-unprocessed/src/module.ts index 310d78810f..2420c75cbd 100644 --- a/plugins/catalog-backend-module-unprocessed/src/module.ts +++ b/plugins/catalog-backend-module-unprocessed/src/module.ts @@ -34,15 +34,27 @@ export const catalogModuleUnprocessedEntities = createBackendModule({ database: coreServices.database, router: coreServices.httpRouter, logger: coreServices.logger, + httpAuth: coreServices.httpAuth, + discovery: coreServices.discovery, permissions: coreServices.permissions, }, - async init({ database, router, logger, permissions }) { + async init({ + database, + router, + logger, + permissions, + httpAuth, + discovery, + }) { const module = new UnprocessedEntitiesModule( await database.getClient(), router, + permissions, + discovery, + httpAuth, ); - module.registerRoutes({ permissions }); + module.registerRoutes(); logger.info( 'registered additional routes for catalogModuleUnprocessedEntities', diff --git a/yarn.lock b/yarn.lock index 501c88b70e..73b18a599a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5772,6 +5772,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-unprocessed@workspace:plugins/catalog-backend-module-unprocessed" dependencies: + "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" @@ -5780,6 +5781,7 @@ __metadata: "@backstage/plugin-catalog-unprocessed-entities-common": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" + "@types/express": ^4.17.6 express-promise-router: ^4.1.1 knex: ^3.0.0 languageName: unknown From b63b3b8514899adc9d72054e7bcbe2d2950af752 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 18 Mar 2024 17:13:12 +0100 Subject: [PATCH 203/219] chore: fixing api-reports Signed-off-by: blam --- plugins/catalog-backend-module-github/api-report-alpha.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend-module-github/api-report-alpha.md b/plugins/catalog-backend-module-github/api-report-alpha.md index cd5344f728..ca3a7b1978 100644 --- a/plugins/catalog-backend-module-github/api-report-alpha.md +++ b/plugins/catalog-backend-module-github/api-report-alpha.md @@ -6,8 +6,8 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -const catalogModuleGithubEntityProvider: () => BackendFeature; -export default catalogModuleGithubEntityProvider; +const githubCatalogModule: () => BackendFeature; +export default githubCatalogModule; // (No @packageDocumentation comment for this package) ``` From f729291a05f08b28ac3981c80dddd31bb896010d Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 18 Mar 2024 17:14:36 +0100 Subject: [PATCH 204/219] chore: remove token mgr Signed-off-by: blam --- .../src/module/githubCatalogModule.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts index cb9d1c43f6..55a1b7f34d 100644 --- a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts +++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts @@ -40,7 +40,6 @@ export const githubCatalogModule = createBackendModule({ catalog: catalogProcessingExtensionPoint, analyzers: catalogAnalysisExtensionPoint, auth: coreServices.auth, - tokenManager: coreServices.tokenManager, discovery: coreServices.discovery, config: coreServices.rootConfig, logger: coreServices.logger, From 13c680c165987c655b081f2aa385a8d1c7bb4c0e Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Mon, 18 Mar 2024 16:54:35 +0100 Subject: [PATCH 205/219] refactor: use broadcast channel again Signed-off-by: Camila Belo --- .../useCookieAuthRefresh.test.tsx | 32 +++++----------- .../useCookieAuthRefresh.tsx | 37 +++++++++++-------- plugins/auth-react/src/setupTests.ts | 33 +++++++++++++++++ .../src/test-utils.tsx | 10 +---- .../TechDocsReaderPage.test.tsx | 5 --- 5 files changed, 66 insertions(+), 51 deletions(-) diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx index 5c754b584c..180de98a46 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.test.tsx @@ -16,12 +16,8 @@ import React from 'react'; import { renderHook, waitFor } from '@testing-library/react'; -import { - fetchApiRef, - discoveryApiRef, - storageApiRef, -} from '@backstage/core-plugin-api'; -import { MockStorageApi, TestApiProvider } from '@backstage/test-utils'; +import { fetchApiRef, discoveryApiRef } from '@backstage/core-plugin-api'; +import { TestApiProvider } from '@backstage/test-utils'; import { useCookieAuthRefresh } from './useCookieAuthRefresh'; describe('useCookieAuthRefresh', () => { @@ -43,8 +39,6 @@ describe('useCookieAuthRefresh', () => { }), }; - const storageApiMock = MockStorageApi.create(); - beforeEach(() => { jest.useFakeTimers({ now }); jest.clearAllMocks(); @@ -69,7 +63,6 @@ describe('useCookieAuthRefresh', () => { fetch: jest.fn().mockRejectedValue(error), }, ], - [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApiMock], ]} > @@ -100,7 +93,6 @@ describe('useCookieAuthRefresh', () => { .mockReturnValue(new Promise(() => {})), }, ], - [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApiMock], ]} > @@ -153,7 +145,6 @@ describe('useCookieAuthRefresh', () => { .mockReturnValue(new Promise(() => {})), }, ], - [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApiMock], ]} > @@ -208,7 +199,6 @@ describe('useCookieAuthRefresh', () => { fetch: jest.fn().mockRejectedValue(error), }, ], - [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApiMock], ]} > @@ -235,7 +225,6 @@ describe('useCookieAuthRefresh', () => { @@ -268,7 +257,6 @@ describe('useCookieAuthRefresh', () => { @@ -281,12 +269,14 @@ describe('useCookieAuthRefresh', () => { now + 2 * tenMinutesInMilliseconds; // simulating other tab refreshing the cookie - storageApiMock - .forBucket(`${pluginId}-auth-cookie-storage`) - .set( - 'expiresAt', - new Date(twentyMinutesFromNowInMilliseconds).toISOString(), - ); + new global.BroadcastChannel( + `${pluginId}-auth-cookie-expires-at`, + ).postMessage({ + action: 'COOKIE_REFRESH_SUCCESS', + payload: { + expiresAt: new Date(twentyMinutesFromNowInMilliseconds).toISOString(), + }, + }); // advance the timers in 10 minutes to match the old expires at jest.advanceTimersByTime(tenMinutesInMilliseconds); @@ -309,7 +299,6 @@ describe('useCookieAuthRefresh', () => { @@ -345,7 +334,6 @@ describe('useCookieAuthRefresh', () => { diff --git a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx index b5b5444e71..dfb13289db 100644 --- a/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx +++ b/plugins/auth-react/src/hooks/useCookieAuthRefresh/useCookieAuthRefresh.tsx @@ -14,11 +14,10 @@ * limitations under the License. */ -import { useEffect, useCallback } from 'react'; +import { useEffect, useCallback, useMemo } from 'react'; import { discoveryApiRef, fetchApiRef, - storageApiRef, useApi, } from '@backstage/core-plugin-api'; import { useAsync, useMountEffect } from '@react-hookz/web'; @@ -40,10 +39,13 @@ export function useCookieAuthRefresh(options: { | { status: 'success'; data: { expiresAt: string } } { const { pluginId, path = '/cookie' } = options ?? {}; const fetchApi = useApi(fetchApiRef); - const storageApi = useApi(storageApiRef); const discoveryApi = useApi(discoveryApiRef); - const store = storageApi.forBucket(`${pluginId}-auth-cookie-storage`); + const channel = useMemo(() => { + return 'BroadcastChannel' in window + ? new BroadcastChannel(`${pluginId}-auth-cookie-expires-at`) + : null; + }, [pluginId]); const [state, actions] = useAsync<{ expiresAt: string }>(async () => { const apiOrigin = await discoveryApi.getBaseUrl(pluginId); @@ -84,21 +86,26 @@ export function useCookieAuthRefresh(options: { if (state.status !== 'success' || !state.result) { return () => {}; } - const expiresAt = state.result.expiresAt; - store.set('expiresAt', expiresAt); - let cancel = refresh({ expiresAt }); - const subscription = store - .observe$('expiresAt') - .subscribe(({ value }) => { - if (!value) return; + channel?.postMessage({ + action: 'COOKIE_REFRESH_SUCCESS', + payload: state.result, + }); + let cancel = refresh(state.result); + const listener = ( + event: MessageEvent<{ action: string; payload: { expiresAt: string } }>, + ) => { + const { action, payload } = event.data; + if (action === 'COOKIE_REFRESH_SUCCESS') { cancel(); - cancel = refresh({ expiresAt: value }); - }); + cancel = refresh(payload); + } + }; + channel?.addEventListener('message', listener); return () => { cancel(); - subscription.unsubscribe(); + channel?.removeEventListener('message', listener); }; - }, [state, refresh, store]); + }, [state, refresh, channel]); // Initialising if (state.status === 'not-executed') { diff --git a/plugins/auth-react/src/setupTests.ts b/plugins/auth-react/src/setupTests.ts index 658016ffdd..6580ddffad 100644 --- a/plugins/auth-react/src/setupTests.ts +++ b/plugins/auth-react/src/setupTests.ts @@ -14,3 +14,36 @@ * limitations under the License. */ import '@testing-library/jest-dom'; + +global.BroadcastChannel = jest + .fn() + .mockImplementation((_channelName: string) => { + const listeners: ((event: { data: any }) => void)[] = []; + + return { + addEventListener: ( + type: string, + listener: (event: { data: any }) => void, + ) => { + if (type === 'message') { + listeners.push(listener); + } + }, + removeEventListener: ( + type: string, + listener: (event: { data: any }) => void, + ) => { + if (type === 'message') { + const index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + } + }, + postMessage: (message: any) => { + listeners.forEach(listener => { + listener({ data: message }); + }); + }, + }; + }); diff --git a/plugins/techdocs-addons-test-utils/src/test-utils.tsx b/plugins/techdocs-addons-test-utils/src/test-utils.tsx index c3e7281116..51a4650f99 100644 --- a/plugins/techdocs-addons-test-utils/src/test-utils.tsx +++ b/plugins/techdocs-addons-test-utils/src/test-utils.tsx @@ -22,17 +22,12 @@ import { screen } from 'testing-library__dom'; import { Route } from 'react-router-dom'; import { act, render } from '@testing-library/react'; -import { - wrapInTestApp, - TestApiProvider, - MockStorageApi, -} from '@backstage/test-utils'; +import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { FlatRoutes } from '@backstage/core-app-api'; import { ApiRef, discoveryApiRef, fetchApiRef, - storageApiRef, } from '@backstage/core-plugin-api'; import { @@ -78,8 +73,6 @@ const scmIntegrationsApi = { fromConfig: jest.fn().mockReturnValue({}), }; -const storageApiMock = MockStorageApi.create(); - const discoveryApi = { getBaseUrl: jest .fn() @@ -232,7 +225,6 @@ export class TechDocsAddonTester { build() { const apis: TechdocsAddonTesterApis = [ [fetchApiRef, fetchApi], - [storageApiRef, storageApiMock], [discoveryApiRef, discoveryApi], [techdocsApiRef, techdocsApi], [techdocsStorageApiRef, techdocsStorageApi], diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx index abea660b62..ed8b05c661 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx @@ -19,7 +19,6 @@ import { scmIntegrationsApiRef } from '@backstage/integration-react'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { MockConfigApi, - MockStorageApi, renderInTestApp, TestApiProvider, } from '@backstage/test-utils'; @@ -39,7 +38,6 @@ import { configApiRef, discoveryApiRef, fetchApiRef, - storageApiRef, } from '@backstage/core-plugin-api'; const mockEntityMetadata = { @@ -82,8 +80,6 @@ const techdocsStorageApiMock: jest.Mocked = { syncEntityDocs: jest.fn(), }; -const storageApiMock = MockStorageApi.create(); - const discoveryApiMock = { getBaseUrl: jest .fn() @@ -121,7 +117,6 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => { Date: Mon, 18 Mar 2024 17:32:37 +0100 Subject: [PATCH 206/219] chore: fix changese and updating things Signed-off-by: blam --- .changeset/warm-buses-do.md | 20 +++++++++++++++---- packages/backend/src/plugins/catalog.ts | 10 ++++++---- .../src/UnprocessedEntitiesModule.ts | 18 ++++++++++++++++- .../src/module.ts | 6 +++--- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/.changeset/warm-buses-do.md b/.changeset/warm-buses-do.md index 8290679e51..b1755b0d0c 100644 --- a/.changeset/warm-buses-do.md +++ b/.changeset/warm-buses-do.md @@ -4,13 +4,25 @@ '@backstage/plugin-catalog-unprocessed-entities-common': patch --- -**BREAKING**- the `@backstage/plugin-catalog-backend-module-unprocessed` now requires the `permissionsApi`. -If you're using this module in the old backend system you'll need to pass the `permissions` object to the `registerRoutes` method in `packages/backend/src/plugins/catalog.ts`. +**BREAKING**- the `@backstage/plugin-catalog-backend-module-unprocessed` constructor is now private, and have been moved to using the static `.create` method instead which now requires a `PermissionService` and `DiscoveryService`. + +If you're using this module in the old backend system you'll need to migrate to using the `.create` method and pass in the new required parameters in `packages/backend/src/plugins/catalog.ts`. + No changes should be required if you're using the new backend system. ```diff -- unprocessed.registerRoutes(); -+ unprocessed.registerRoutes({ permissions: env.permissions }); +- const unprocessed = new UnprocessedEntitiesModule( +- await env.database.getClient(), +- router, +- ); ++ const unprocessed = UnprocessedEntitiesModule.create({ ++ database: await env.database.getClient(), ++ router, ++ permissions: env.permissions, ++ discovery: env.discovery, ++ }); + + unprocessed.registerRoutes(); ``` Adds the ability to delete an unprocessed entity from the `refresh_state` table. This change requires enabling permissions for your Backstage instance. diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 95e86ddd23..c83d5844d1 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -37,12 +37,14 @@ export default async function createPlugin( const { processingEngine, router } = await builder.build(); - const unprocessed = new UnprocessedEntitiesModule( - await env.database.getClient(), + const unprocessed = UnprocessedEntitiesModule.create({ + database: await env.database.getClient(), router, - ); + permissions: env.permissions, + discovery: env.discovery, + }); - unprocessed.registerRoutes({ permissions: env.permissions }); + unprocessed.registerRoutes(); await processingEngine.start(); return router; diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index 48f4ea58cf..f177818b28 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -49,7 +49,7 @@ export class UnprocessedEntitiesModule { private readonly httpAuth: HttpAuthService; - constructor( + private constructor( private readonly database: Knex, private readonly router: Pick, private readonly permissions: PermissionsService, @@ -65,6 +65,22 @@ export class UnprocessedEntitiesModule { }).httpAuth; } + static create(options: { + router: Pick; + database: Knex; + discovery: DiscoveryService; + permissions: PermissionsService; + httpAuth?: HttpAuthService; + }) { + return new UnprocessedEntitiesModule( + options.database, + options.router, + options.permissions, + options.discovery, + options.httpAuth, + ); + } + private async unprocessed( request: UnprocessedEntitiesRequest, ): Promise { diff --git a/plugins/catalog-backend-module-unprocessed/src/module.ts b/plugins/catalog-backend-module-unprocessed/src/module.ts index 2420c75cbd..852b8fb432 100644 --- a/plugins/catalog-backend-module-unprocessed/src/module.ts +++ b/plugins/catalog-backend-module-unprocessed/src/module.ts @@ -46,13 +46,13 @@ export const catalogModuleUnprocessedEntities = createBackendModule({ httpAuth, discovery, }) { - const module = new UnprocessedEntitiesModule( - await database.getClient(), + const module = UnprocessedEntitiesModule.create({ + database: await database.getClient(), router, permissions, discovery, httpAuth, - ); + }); module.registerRoutes(); From 0c234a73ac4a59699b492ce82050f4c95a4e73e6 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 18 Mar 2024 17:36:56 +0100 Subject: [PATCH 207/219] chore: fix Signed-off-by: blam --- .../src/UnprocessedEntitiesModule.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index f177818b28..2653ffedac 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -169,7 +169,7 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'failed', - owner: req.query.owner as string, + owner: String(req.query.owner), }), ); }) @@ -177,7 +177,7 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'pending', - owner: req.query.owner as string, + owner: String(req.query.owner), }), ); }) @@ -185,7 +185,7 @@ export class UnprocessedEntitiesModule { '/entities/unprocessed/delete/:entity_id', async (request, response) => { const authorized = await isRequestAuthorized( - request as any as Request, + request, unprocessedEntitiesDeletePermission, ); From 0c727b185de1fff645d006b96e8f4231136c702b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 17:43:27 +0100 Subject: [PATCH 208/219] create-app: format App.tsx and backend index Signed-off-by: Patrik Oldsberg --- .../templates/default-app/packages/app/src/App.tsx | 12 ++---------- .../default-app/packages/backend/src/index.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/create-app/templates/default-app/packages/app/src/App.tsx b/packages/create-app/templates/default-app/packages/app/src/App.tsx index df21e95ffb..f751cf6d22 100644 --- a/packages/create-app/templates/default-app/packages/app/src/App.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/App.tsx @@ -58,16 +58,8 @@ const app = createApp({ }); }, components: { - SignInPage: props => ( - - ) - } + SignInPage: props => , + }, }); const routes = ( diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 0615677df9..44fde697ec 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -23,11 +23,15 @@ backend.add(import('@backstage/plugin-auth-backend-module-guest-provider')); // catalog plugin backend.add(import('@backstage/plugin-catalog-backend/alpha')); -backend.add(import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model')); +backend.add( + import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), +); // permission plugin backend.add(import('@backstage/plugin-permission-backend/alpha')); -backend.add(import('@backstage/plugin-permission-backend-module-allow-all-policy')); +backend.add( + import('@backstage/plugin-permission-backend-module-allow-all-policy'), +); // search plugin backend.add(import('@backstage/plugin-search-backend/alpha')); From 51123ab083b57ec1d3d1b5768b321b6bf152d642 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 17:43:52 +0100 Subject: [PATCH 209/219] create-app: move guest provider config out of local config Signed-off-by: Patrik Oldsberg --- .../create-app/templates/default-app/app-config.local.yaml | 4 ---- .../templates/default-app/app-config.production.yaml | 4 ++++ packages/create-app/templates/default-app/app-config.yaml.hbs | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/create-app/templates/default-app/app-config.local.yaml b/packages/create-app/templates/default-app/app-config.local.yaml index 4d4b6391d7..976293b546 100644 --- a/packages/create-app/templates/default-app/app-config.local.yaml +++ b/packages/create-app/templates/default-app/app-config.local.yaml @@ -1,5 +1 @@ # Backstage override configuration for your local development environment -auth: - providers: - guest: {} - # See https://github.com/backstage/backstage/blob/master/docs/auth/guest/provider.md diff --git a/packages/create-app/templates/default-app/app-config.production.yaml b/packages/create-app/templates/default-app/app-config.production.yaml index 8f0751cd31..05b02acd4f 100644 --- a/packages/create-app/templates/default-app/app-config.production.yaml +++ b/packages/create-app/templates/default-app/app-config.production.yaml @@ -28,6 +28,10 @@ backend: # ca: # if you have a CA file and want to verify it you can uncomment this section # $file: /ca/server.crt +auth: + providers: + guest: null + catalog: # Overrides the default list locations from app-config.yaml as these contain example data. # See https://backstage.io/docs/features/software-catalog/#adding-components-to-the-catalog for more details diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs index 08d2abff59..2fdc9a9077 100644 --- a/packages/create-app/templates/default-app/app-config.yaml.hbs +++ b/packages/create-app/templates/default-app/app-config.yaml.hbs @@ -64,7 +64,9 @@ techdocs: auth: # see https://backstage.io/docs/auth/ to learn about auth providers - providers: {} + providers: + # See https://backstage.io/docs/auth/guest/provider + guest: {} scaffolder: # see https://backstage.io/docs/features/software-templates/configuration for software template options From cb40c335a6347c58bbd04dabe2e6d6bb502c11da Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 19:04:03 +0100 Subject: [PATCH 210/219] create-app: update template e2e test to work with guest auth Signed-off-by: Patrik Oldsberg --- .../templates/default-app/packages/app/e2e-tests/app.test.ts | 5 +++++ .../create-app/templates/default-app/playwright.config.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts index d45bc0dbf0..48d48d07db 100644 --- a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts +++ b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts @@ -19,5 +19,10 @@ import { test, expect } from '@playwright/test'; test('App should render the welcome page', async ({ page }) => { await page.goto('/'); + const enterButton = page.getByRole('button', { name: 'Enter' }); + await expect(enterButton).toBeVisible(); + await enterButton.click(); + + await expect(page.getByText('My Company Catalog')).toBeVisible(); }); diff --git a/packages/create-app/templates/default-app/playwright.config.ts b/packages/create-app/templates/default-app/playwright.config.ts index 37c7fb14c7..733be130bd 100644 --- a/packages/create-app/templates/default-app/playwright.config.ts +++ b/packages/create-app/templates/default-app/playwright.config.ts @@ -32,7 +32,7 @@ export default defineConfig({ ? [] : [ { - command: 'yarn start', + command: 'yarn dev', port: 3000, reuseExistingServer: true, timeout: 60_000, From aa46e820af75ad1efe0916d2ff187a69f8bd33a2 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Mar 2024 21:21:44 +0100 Subject: [PATCH 211/219] create-app: fix template app e2e test format Signed-off-by: Patrik Oldsberg --- .../templates/default-app/packages/app/e2e-tests/app.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts index 48d48d07db..839ff883de 100644 --- a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts +++ b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts @@ -23,6 +23,5 @@ test('App should render the welcome page', async ({ page }) => { await expect(enterButton).toBeVisible(); await enterButton.click(); - await expect(page.getByText('My Company Catalog')).toBeVisible(); }); From c3b50c80d72e6a980235932a67ed5aef5fefb871 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 19 Mar 2024 00:15:08 +0100 Subject: [PATCH 212/219] e2e-test: override swagger-ui-react deps for react 17 test Signed-off-by: Patrik Oldsberg --- packages/e2e-test/src/commands/run.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index 9a9bf556ee..a1b35049ab 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -418,6 +418,9 @@ async function switchToReact17(appDir: string) { 'react-dom': '^17.0.0', '@types/react': '^17.0.0', '@types/react-dom': '^17.0.0', + 'swagger-ui-react/react': '17.0.2', + 'swagger-ui-react/react-dom': '17.0.2', + 'swagger-ui-react/react-redux': '^8', }; await fs.writeJson(resolvePath(appDir, 'package.json'), rootPkg, { spaces: 2, From 51f814bca132e98217098b18ace9cbda187906bb Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Tue, 19 Mar 2024 08:43:51 +0530 Subject: [PATCH 213/219] Add ESLint Rule to SplunkOnCall Plugin Signed-off-by: Aditya Kumar --- .changeset/twenty-seahorses-wave.md | 5 +++ plugins/splunk-on-call/.eslintrc.js | 6 +++- .../src/components/EntitySplunkOnCallCard.tsx | 16 ++++------ .../Errors/MissingApiKeyOrApiIdError.tsx | 2 +- .../Escalation/EscalationPolicy.tsx | 12 +++---- .../components/Escalation/EscalationUser.tsx | 18 +++++------ .../Escalation/EscalationUsersEmptyState.tsx | 10 +++--- .../Incident/IncidentEmptyState.tsx | 3 +- .../components/Incident/IncidentListItem.tsx | 18 +++++------ .../src/components/Incident/Incidents.tsx | 12 +++---- .../src/components/SplunkOnCallPage.tsx | 3 +- .../TriggerDialog/TriggerDialog.tsx | 32 ++++++++----------- 12 files changed, 64 insertions(+), 73 deletions(-) create mode 100644 .changeset/twenty-seahorses-wave.md diff --git a/.changeset/twenty-seahorses-wave.md b/.changeset/twenty-seahorses-wave.md new file mode 100644 index 0000000000..f388d6abfd --- /dev/null +++ b/.changeset/twenty-seahorses-wave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-splunk-on-call': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `splunk-on-call` plugin to migrate the Material UI imports. diff --git a/plugins/splunk-on-call/.eslintrc.js b/plugins/splunk-on-call/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/splunk-on-call/.eslintrc.js +++ b/plugins/splunk-on-call/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx b/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx index 5800ea98b6..84770c6d6e 100644 --- a/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx +++ b/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx @@ -20,17 +20,15 @@ import { useEntity, MissingAnnotationEmptyState, } from '@backstage/plugin-catalog-react'; -import { - Card, - CardContent, - CardHeader, - Divider, - makeStyles, - Typography, -} from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; +import Divider from '@material-ui/core/Divider'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import AlarmAddIcon from '@material-ui/icons/AlarmAdd'; import WebIcon from '@material-ui/icons/Web'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { splunkOnCallApiRef, UnauthorizedError } from '../api'; import { MissingApiKeyOrApiIdError } from './Errors'; import { EscalationPolicy } from './Escalation'; diff --git a/plugins/splunk-on-call/src/components/Errors/MissingApiKeyOrApiIdError.tsx b/plugins/splunk-on-call/src/components/Errors/MissingApiKeyOrApiIdError.tsx index bc8aa05813..e302a25105 100644 --- a/plugins/splunk-on-call/src/components/Errors/MissingApiKeyOrApiIdError.tsx +++ b/plugins/splunk-on-call/src/components/Errors/MissingApiKeyOrApiIdError.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React from 'react'; -import { Button } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; import { EmptyState } from '@backstage/core-components'; export const MissingApiKeyOrApiIdError = () => ( diff --git a/plugins/splunk-on-call/src/components/Escalation/EscalationPolicy.tsx b/plugins/splunk-on-call/src/components/Escalation/EscalationPolicy.tsx index 7902453490..b35464f303 100644 --- a/plugins/splunk-on-call/src/components/Escalation/EscalationPolicy.tsx +++ b/plugins/splunk-on-call/src/components/Escalation/EscalationPolicy.tsx @@ -15,18 +15,14 @@ */ import React from 'react'; -import { - createStyles, - List, - ListSubheader, - makeStyles, - Theme, -} from '@material-ui/core'; +import List from '@material-ui/core/List'; +import ListSubheader from '@material-ui/core/ListSubheader'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import { EscalationUsersEmptyState } from './EscalationUsersEmptyState'; import { EscalationUser } from './EscalationUser'; import useAsync from 'react-use/lib/useAsync'; import { splunkOnCallApiRef } from '../../api'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { User } from '../types'; import { useApi } from '@backstage/core-plugin-api'; diff --git a/plugins/splunk-on-call/src/components/Escalation/EscalationUser.tsx b/plugins/splunk-on-call/src/components/Escalation/EscalationUser.tsx index ba7abbddab..8f7944753f 100644 --- a/plugins/splunk-on-call/src/components/Escalation/EscalationUser.tsx +++ b/plugins/splunk-on-call/src/components/Escalation/EscalationUser.tsx @@ -15,16 +15,14 @@ */ import React from 'react'; -import { - ListItem, - ListItemIcon, - ListItemSecondaryAction, - Tooltip, - ListItemText, - makeStyles, - IconButton, - Typography, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import Tooltip from '@material-ui/core/Tooltip'; +import ListItemText from '@material-ui/core/ListItemText'; +import IconButton from '@material-ui/core/IconButton'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import Avatar from '@material-ui/core/Avatar'; import EmailIcon from '@material-ui/icons/Email'; import { User } from '../types'; diff --git a/plugins/splunk-on-call/src/components/Escalation/EscalationUsersEmptyState.tsx b/plugins/splunk-on-call/src/components/Escalation/EscalationUsersEmptyState.tsx index b4c10ddcf8..8a32069a50 100644 --- a/plugins/splunk-on-call/src/components/Escalation/EscalationUsersEmptyState.tsx +++ b/plugins/splunk-on-call/src/components/Escalation/EscalationUsersEmptyState.tsx @@ -15,12 +15,10 @@ */ import React from 'react'; -import { - ListItem, - ListItemIcon, - ListItemText, - makeStyles, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { makeStyles } from '@material-ui/core/styles'; import { StatusWarning } from '@backstage/core-components'; const useStyles = makeStyles({ diff --git a/plugins/splunk-on-call/src/components/Incident/IncidentEmptyState.tsx b/plugins/splunk-on-call/src/components/Incident/IncidentEmptyState.tsx index 87108f3d74..181ff6ad84 100644 --- a/plugins/splunk-on-call/src/components/Incident/IncidentEmptyState.tsx +++ b/plugins/splunk-on-call/src/components/Incident/IncidentEmptyState.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import EmptyStateImage from '../../assets/emptystate.svg'; export const IncidentsEmptyState = () => { diff --git a/plugins/splunk-on-call/src/components/Incident/IncidentListItem.tsx b/plugins/splunk-on-call/src/components/Incident/IncidentListItem.tsx index d8b6a56efc..3689db9b0a 100644 --- a/plugins/splunk-on-call/src/components/Incident/IncidentListItem.tsx +++ b/plugins/splunk-on-call/src/components/Incident/IncidentListItem.tsx @@ -15,16 +15,14 @@ */ import React, { useEffect } from 'react'; -import { - ListItem, - ListItemIcon, - ListItemSecondaryAction, - Tooltip, - ListItemText, - makeStyles, - IconButton, - Typography, -} from '@material-ui/core'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; +import Tooltip from '@material-ui/core/Tooltip'; +import ListItemText from '@material-ui/core/ListItemText'; +import IconButton from '@material-ui/core/IconButton'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; import DoneIcon from '@material-ui/icons/Done'; import DoneAllIcon from '@material-ui/icons/DoneAll'; import { DateTime, Duration } from 'luxon'; diff --git a/plugins/splunk-on-call/src/components/Incident/Incidents.tsx b/plugins/splunk-on-call/src/components/Incident/Incidents.tsx index 6dcb4f9989..fba7e540da 100644 --- a/plugins/splunk-on-call/src/components/Incident/Incidents.tsx +++ b/plugins/splunk-on-call/src/components/Incident/Incidents.tsx @@ -15,18 +15,14 @@ */ import React, { useEffect } from 'react'; -import { - createStyles, - List, - ListSubheader, - makeStyles, - Theme, -} from '@material-ui/core'; +import List from '@material-ui/core/List'; +import ListSubheader from '@material-ui/core/ListSubheader'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import { IncidentListItem } from './IncidentListItem'; import { IncidentsEmptyState } from './IncidentEmptyState'; import useAsyncFn from 'react-use/lib/useAsyncFn'; import { splunkOnCallApiRef } from '../../api'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { useApi } from '@backstage/core-plugin-api'; import { Progress } from '@backstage/core-components'; diff --git a/plugins/splunk-on-call/src/components/SplunkOnCallPage.tsx b/plugins/splunk-on-call/src/components/SplunkOnCallPage.tsx index 4cbefa244d..58df3e3304 100644 --- a/plugins/splunk-on-call/src/components/SplunkOnCallPage.tsx +++ b/plugins/splunk-on-call/src/components/SplunkOnCallPage.tsx @@ -15,7 +15,8 @@ */ import React from 'react'; -import { Grid, makeStyles } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles'; import { EntitySplunkOnCallCard } from './EntitySplunkOnCallCard'; import { Content, diff --git a/plugins/splunk-on-call/src/components/TriggerDialog/TriggerDialog.tsx b/plugins/splunk-on-call/src/components/TriggerDialog/TriggerDialog.tsx index dd8f0b1909..db16c12c04 100644 --- a/plugins/splunk-on-call/src/components/TriggerDialog/TriggerDialog.tsx +++ b/plugins/splunk-on-call/src/components/TriggerDialog/TriggerDialog.tsx @@ -15,26 +15,22 @@ */ import React, { useState, useEffect } from 'react'; -import { - Dialog, - DialogTitle, - TextField, - DialogActions, - Button, - DialogContent, - Typography, - CircularProgress, - Select, - MenuItem, - createStyles, - makeStyles, - Theme, - FormControl, - InputLabel, -} from '@material-ui/core'; +import Dialog from '@material-ui/core/Dialog'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import TextField from '@material-ui/core/TextField'; +import DialogActions from '@material-ui/core/DialogActions'; +import Button from '@material-ui/core/Button'; +import DialogContent from '@material-ui/core/DialogContent'; +import Typography from '@material-ui/core/Typography'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Select from '@material-ui/core/Select'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import InputLabel from '@material-ui/core/InputLabel'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import useAsyncFn from 'react-use/lib/useAsyncFn'; import { splunkOnCallApiRef } from '../../api'; -import { Alert } from '@material-ui/lab'; +import Alert from '@material-ui/lab/Alert'; import { TriggerAlarmRequest } from '../../api'; import { useApi, alertApiRef } from '@backstage/core-plugin-api'; From e38b29cc79c3b17d055f26609b720dd5d7c43df9 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Tue, 19 Mar 2024 09:29:19 +0530 Subject: [PATCH 214/219] Add ESLint Rule to SonarQube Plugin Signed-off-by: Aditya Kumar --- .changeset/few-rules-accept.md | 5 +++++ plugins/sonarqube/.eslintrc.js | 6 +++++- plugins/sonarqube/dev/index.tsx | 2 +- .../sonarqube/src/components/SonarQubeCard/Percentage.tsx | 2 +- plugins/sonarqube/src/components/SonarQubeCard/Rating.tsx | 4 ++-- .../sonarqube/src/components/SonarQubeCard/RatingCard.tsx | 3 ++- .../src/components/SonarQubeCard/SonarQubeCard.tsx | 3 ++- 7 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 .changeset/few-rules-accept.md diff --git a/.changeset/few-rules-accept.md b/.changeset/few-rules-accept.md new file mode 100644 index 0000000000..7e3efca161 --- /dev/null +++ b/.changeset/few-rules-accept.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sonarqube': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `sonarqube` plugin to migrate the Material UI imports. diff --git a/plugins/sonarqube/.eslintrc.js b/plugins/sonarqube/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/sonarqube/.eslintrc.js +++ b/plugins/sonarqube/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/sonarqube/dev/index.tsx b/plugins/sonarqube/dev/index.tsx index 33a36bcaef..24b1894a7b 100644 --- a/plugins/sonarqube/dev/index.tsx +++ b/plugins/sonarqube/dev/index.tsx @@ -16,7 +16,7 @@ import { Entity } from '@backstage/catalog-model'; import { createDevApp, EntityGridItem } from '@backstage/dev-utils'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React from 'react'; import { EntitySonarQubeCard, sonarQubePlugin } from '../src'; import { Content, Header, Page } from '@backstage/core-components'; diff --git a/plugins/sonarqube/src/components/SonarQubeCard/Percentage.tsx b/plugins/sonarqube/src/components/SonarQubeCard/Percentage.tsx index efc19d4bf5..1cbed3311f 100644 --- a/plugins/sonarqube/src/components/SonarQubeCard/Percentage.tsx +++ b/plugins/sonarqube/src/components/SonarQubeCard/Percentage.tsx @@ -15,7 +15,7 @@ */ import { makeStyles } from '@material-ui/core/styles'; -import { useTheme } from '@material-ui/core'; +import { useTheme } from '@material-ui/core/styles'; import { Circle } from 'rc-progress'; import React from 'react'; diff --git a/plugins/sonarqube/src/components/SonarQubeCard/Rating.tsx b/plugins/sonarqube/src/components/SonarQubeCard/Rating.tsx index fb722fd857..ce73fa3f2e 100644 --- a/plugins/sonarqube/src/components/SonarQubeCard/Rating.tsx +++ b/plugins/sonarqube/src/components/SonarQubeCard/Rating.tsx @@ -14,9 +14,9 @@ * limitations under the License. */ -import { Avatar } from '@material-ui/core'; +import Avatar from '@material-ui/core/Avatar'; import { lighten, makeStyles } from '@material-ui/core/styles'; -import { CSSProperties } from '@material-ui/styles'; +import { CSSProperties } from '@material-ui/styles/withStyles'; import React, { useMemo } from 'react'; const useStyles = makeStyles(theme => { diff --git a/plugins/sonarqube/src/components/SonarQubeCard/RatingCard.tsx b/plugins/sonarqube/src/components/SonarQubeCard/RatingCard.tsx index 547c3008c0..a8e0cf1c78 100644 --- a/plugins/sonarqube/src/components/SonarQubeCard/RatingCard.tsx +++ b/plugins/sonarqube/src/components/SonarQubeCard/RatingCard.tsx @@ -15,7 +15,8 @@ */ import { Link } from '@backstage/core-components'; -import { Grid, Typography } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import React, { ReactNode } from 'react'; diff --git a/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx b/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx index 9a6e9fb8ed..4f4f4e4fd7 100644 --- a/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx +++ b/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx @@ -23,7 +23,8 @@ import { useProjectInfo, } from '@backstage/plugin-sonarqube-react'; import { SONARQUBE_PROJECT_KEY_ANNOTATION } from '@backstage/plugin-sonarqube-react'; -import { Chip, Grid } from '@material-ui/core'; +import Chip from '@material-ui/core/Chip'; +import Grid from '@material-ui/core/Grid'; import { makeStyles } from '@material-ui/core/styles'; import BugReport from '@material-ui/icons/BugReport'; import Lock from '@material-ui/icons/Lock'; From 72df7c623ad68cdc2cc2622d4312147e96448cbf Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Tue, 19 Mar 2024 11:02:32 +0530 Subject: [PATCH 215/219] Add ESLint Rule to Signals Plugin Signed-off-by: Aditya Kumar --- .changeset/unlucky-drinks-glow.md | 5 +++++ plugins/signals/.eslintrc.js | 6 +++++- plugins/signals/dev/index.tsx | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 .changeset/unlucky-drinks-glow.md diff --git a/.changeset/unlucky-drinks-glow.md b/.changeset/unlucky-drinks-glow.md new file mode 100644 index 0000000000..6e14095a62 --- /dev/null +++ b/.changeset/unlucky-drinks-glow.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-signals': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `signals` plugin to migrate the Material UI imports. diff --git a/plugins/signals/.eslintrc.js b/plugins/signals/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/signals/.eslintrc.js +++ b/plugins/signals/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/signals/dev/index.tsx b/plugins/signals/dev/index.tsx index e8c7928f57..2b22424eee 100644 --- a/plugins/signals/dev/index.tsx +++ b/plugins/signals/dev/index.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { createDevApp } from '@backstage/dev-utils'; import { signalsPlugin } from '../src/plugin'; import { Content, Header, Page } from '@backstage/core-components'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; createDevApp() .registerPlugin(signalsPlugin) From 26a15f75e0fb70f5f46014b7593a929e8e9ceece Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Tue, 19 Mar 2024 13:20:08 +0530 Subject: [PATCH 216/219] Add ESLint Rule to Shortcuts Plugin Signed-off-by: Aditya Kumar --- .changeset/chatty-bikes-greet.md | 5 +++++ plugins/shortcuts/.eslintrc.js | 6 +++++- plugins/shortcuts/src/AddShortcut.tsx | 12 +++++------- plugins/shortcuts/src/EditShortcut.tsx | 12 +++++------- plugins/shortcuts/src/ShortcutForm.tsx | 12 +++++------- 5 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 .changeset/chatty-bikes-greet.md diff --git a/.changeset/chatty-bikes-greet.md b/.changeset/chatty-bikes-greet.md new file mode 100644 index 0000000000..449740ab93 --- /dev/null +++ b/.changeset/chatty-bikes-greet.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-shortcuts': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `shortcuts` plugin to migrate the Material UI imports. diff --git a/plugins/shortcuts/.eslintrc.js b/plugins/shortcuts/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/shortcuts/.eslintrc.js +++ b/plugins/shortcuts/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index 15850ab389..76d3a76a03 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -17,13 +17,11 @@ import React, { useState } from 'react'; import { useLocation } from 'react-router-dom'; import { SubmitHandler } from 'react-hook-form'; -import { - Button, - Card, - CardHeader, - makeStyles, - Popover, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardHeader from '@material-ui/core/CardHeader'; +import Popover from '@material-ui/core/Popover'; +import { makeStyles } from '@material-ui/core/styles'; import { ShortcutForm } from './ShortcutForm'; import { FormValues, Shortcut } from './types'; import { ShortcutApi } from './api'; diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index 9f2ffe10be..47ca1cb546 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -16,13 +16,11 @@ import React from 'react'; import { SubmitHandler } from 'react-hook-form'; -import { - Button, - Card, - CardHeader, - makeStyles, - Popover, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardHeader from '@material-ui/core/CardHeader'; +import Popover from '@material-ui/core/Popover'; +import { makeStyles } from '@material-ui/core/styles'; import { ShortcutForm } from './ShortcutForm'; import { FormValues, Shortcut } from './types'; import DeleteIcon from '@material-ui/icons/Delete'; diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 4d6fdcbc27..efb5829768 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -17,13 +17,11 @@ import React, { useEffect, useRef } from 'react'; import useObservable from 'react-use/lib/useObservable'; import { useForm, SubmitHandler, Controller } from 'react-hook-form'; -import { - Button, - CardActions, - CardContent, - makeStyles, - TextField, -} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; +import TextField from '@material-ui/core/TextField'; +import { makeStyles } from '@material-ui/core/styles'; import { FormValues } from './types'; import { shortcutsApiRef } from './api'; import { useApi } from '@backstage/core-plugin-api'; From e98d1a9eaea83d9373e0a15d6fd5a621ecd360f1 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 19 Mar 2024 09:02:32 +0100 Subject: [PATCH 217/219] chore: update api-reports Signed-off-by: blam --- .../api-report.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/api-report.md b/plugins/catalog-backend-module-unprocessed/api-report.md index 1309e5bdaa..febde39834 100644 --- a/plugins/catalog-backend-module-unprocessed/api-report.md +++ b/plugins/catalog-backend-module-unprocessed/api-report.md @@ -4,9 +4,11 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; +import { HttpAuthService } from '@backstage/backend-plugin-api'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import { Knex } from 'knex'; -import { PermissionEvaluator } from '@backstage/plugin-permission-common'; +import { PermissionsService } from '@backstage/backend-plugin-api'; // @public const catalogModuleUnprocessedEntities: () => BackendFeature; @@ -14,8 +16,15 @@ export default catalogModuleUnprocessedEntities; // @public export class UnprocessedEntitiesModule { - constructor(database: Knex, router: Pick); // (undocumented) - registerRoutes({ permissions }: { permissions: PermissionEvaluator }): void; + static create(options: { + router: Pick; + database: Knex; + discovery: DiscoveryService; + permissions: PermissionsService; + httpAuth?: HttpAuthService; + }): UnprocessedEntitiesModule; + // (undocumented) + registerRoutes(): void; } ``` From 2df7265f0eacf8b8f12acf7d9ed449e21e545d3d Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Tue, 19 Mar 2024 13:38:41 +0530 Subject: [PATCH 218/219] Add ESLint Rule to Sentry Plugin Signed-off-by: Aditya Kumar --- .changeset/selfish-swans-think.md | 5 +++++ plugins/sentry/.eslintrc.js | 6 +++++- plugins/sentry/dev/index.tsx | 2 +- plugins/sentry/src/components/ErrorCell/ErrorCell.tsx | 2 +- .../src/components/SentryIssuesTable/SentryIssuesTable.tsx | 4 +++- 5 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/selfish-swans-think.md diff --git a/.changeset/selfish-swans-think.md b/.changeset/selfish-swans-think.md new file mode 100644 index 0000000000..ef9861988d --- /dev/null +++ b/.changeset/selfish-swans-think.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sentry': patch +--- + +Added ESLint rule `no-top-level-material-ui-4-imports` in the `sentry` plugin to migrate the Material UI imports. diff --git a/plugins/sentry/.eslintrc.js b/plugins/sentry/.eslintrc.js index e2a53a6ad2..a2d8179106 100644 --- a/plugins/sentry/.eslintrc.js +++ b/plugins/sentry/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/sentry/dev/index.tsx b/plugins/sentry/dev/index.tsx index 667f965354..11207ea20c 100644 --- a/plugins/sentry/dev/index.tsx +++ b/plugins/sentry/dev/index.tsx @@ -17,7 +17,7 @@ import { Entity } from '@backstage/catalog-model'; import { createDevApp, EntityGridItem } from '@backstage/dev-utils'; import { EntityProvider } from '@backstage/plugin-catalog-react'; -import { Grid } from '@material-ui/core'; +import Grid from '@material-ui/core/Grid'; import React from 'react'; import { EntitySentryCard, diff --git a/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx b/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx index 2a0e0fbb69..26e1687a72 100644 --- a/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx +++ b/plugins/sentry/src/components/ErrorCell/ErrorCell.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { SentryIssue } from '../../api'; -import { Typography } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; import { Link } from '@backstage/core-components'; diff --git a/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.tsx b/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.tsx index 8f336c629b..f9130a2ab4 100644 --- a/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.tsx +++ b/plugins/sentry/src/components/SentryIssuesTable/SentryIssuesTable.tsx @@ -22,7 +22,9 @@ import { ErrorGraph } from '../ErrorGraph/ErrorGraph'; import { Table, TableColumn } from '@backstage/core-components'; import Select from '@material-ui/core/Select'; import { Options } from '@material-table/core'; -import { FormControl, Grid, MenuItem } from '@material-ui/core'; +import FormControl from '@material-ui/core/FormControl'; +import Grid from '@material-ui/core/Grid'; +import MenuItem from '@material-ui/core/MenuItem'; const ONE_DAY_IN_MILLIS = 86400000; const SEVEN_DAYS_IN_MILLIS = ONE_DAY_IN_MILLIS * 7; From 7277fe203dc17869c025ee6741b65715878e465f Mon Sep 17 00:00:00 2001 From: Gabor Galazzo Date: Sun, 17 Mar 2024 00:08:37 +0100 Subject: [PATCH 219/219] Simplify recursive function in vault-backend plugin The update removes a lock inside a recursive function in the vault-backend plugin's vaultApi.ts file. This change helps to prevent potential deadlocks, improving the performance and overall reliability of the code by ensuring it does not get stuck in a locked state. Signed-off-by: Gabor Galazzo --- .changeset/angry-stingrays-cover.md | 5 +++++ plugins/vault-backend/src/service/vaultApi.ts | 8 +++----- 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 .changeset/angry-stingrays-cover.md diff --git a/.changeset/angry-stingrays-cover.md b/.changeset/angry-stingrays-cover.md new file mode 100644 index 0000000000..49fe04bb7e --- /dev/null +++ b/.changeset/angry-stingrays-cover.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault-backend': patch +--- + +Removed lock inside recursion to avoid deadlocks diff --git a/plugins/vault-backend/src/service/vaultApi.ts b/plugins/vault-backend/src/service/vaultApi.ts index 789cdeeda5..b337a877b9 100644 --- a/plugins/vault-backend/src/service/vaultApi.ts +++ b/plugins/vault-backend/src/service/vaultApi.ts @@ -147,11 +147,9 @@ export class VaultClient implements VaultApi { result.data.keys.map(async secret => { if (secret.endsWith('/')) { secrets.push( - ...(await this.limit(() => - this.listSecrets(`${secretPath}/${secret.slice(0, -1)}`, { - secretEngine: mount, - }), - )), + ...(await this.listSecrets(`${secretPath}/${secret.slice(0, -1)}`, { + secretEngine: mount, + })), ); } else { const vaultUrl =