diff --git a/workspaces/keycloak/.changeset/tender-ears-judge.md b/workspaces/keycloak/.changeset/tender-ears-judge.md new file mode 100644 index 0000000000..13b96185a7 --- /dev/null +++ b/workspaces/keycloak/.changeset/tender-ears-judge.md @@ -0,0 +1,5 @@ +--- +'@backstage-community/plugin-catalog-backend-module-keycloak': patch +--- + +Serialize the calls to get groups and users from Keycloak. In cases where there was a large number of users and / or groups, originally the keycloak would make many async calls that would lead to DOS of the keycloak server. diff --git a/workspaces/keycloak/package.json b/workspaces/keycloak/package.json index 874da3c879..04d26c0f57 100644 --- a/workspaces/keycloak/package.json +++ b/workspaces/keycloak/package.json @@ -10,7 +10,7 @@ "tsc:full": "tsc --skipLibCheck true --incremental false", "build:all": "backstage-cli repo build --all", "build:api-reports": "yarn build:api-reports:only", - "build:api-reports:only": "backstage-repo-tools api-reports --allow-all-warnings -o ae-wrong-input-file-type ,ae-undocumented --validate-release-tags", + "build:api-reports:only": "backstage-repo-tools api-reports --allow-all-warnings -o ae-wrong-input-file-type --validate-release-tags", "clean": "backstage-cli repo clean", "test": "backstage-cli repo test", "test:all": "backstage-cli repo test --coverage", @@ -18,6 +18,7 @@ "lint": "backstage-cli repo lint --since origin/main", "lint:all": "backstage-cli repo lint", "prettier:check": "prettier --check .", + "prettier:fix": "prettier --write .", "new": "backstage-cli new --scope @backstage-community", "postinstall": "cd ../../ && yarn install" }, @@ -43,7 +44,6 @@ "typescript": "~5.3.0" }, "dependencies": { - "@ianvs/prettier-plugin-sort-imports": "^4.3.1", "knip": "^5.27.4" }, "resolutions": { diff --git a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/.prettierignore b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/.prettierignore deleted file mode 100644 index fc8357d99e..0000000000 --- a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/.prettierignore +++ /dev/null @@ -1,12 +0,0 @@ -dist -dist-types -coverage -.vscode -CHANGELOG.md -generated -templates -*.hbs -renovate.json -dist-dynamic -dist-scalprum -playwright-report diff --git a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/.prettierrc.js b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/.prettierrc.js deleted file mode 100644 index 5b35247f3f..0000000000 --- a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/.prettierrc.js +++ /dev/null @@ -1,34 +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. - */ - -/** @type {import("@ianvs/prettier-plugin-sort-imports").PrettierConfig} */ -module.exports = { - ...require('@spotify/prettier-config'), - plugins: ['@ianvs/prettier-plugin-sort-imports'], - importOrder: [ - '^react(.*)$', - '', - '^@backstage/(.*)$', - '', - '', - '', - '^@backstage-community/(.*)$', - '', - '', - '', - '^[.]', - ], -}; diff --git a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/api-report.md b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/api-report.md deleted file mode 100644 index a8f46f067c..0000000000 --- a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/api-report.md +++ /dev/null @@ -1,170 +0,0 @@ -## API Report File for "@backstage-community/plugin-catalog-backend-module-keycloak" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import { BackendFeature } from '@backstage/backend-plugin-api'; -import type { Config } from '@backstage/config'; -import type { EntityProvider } from '@backstage/plugin-catalog-node'; -import type { EntityProviderConnection } from '@backstage/plugin-catalog-node'; -import { ExtensionPoint } from '@backstage/backend-plugin-api'; -import type { GroupEntity } from '@backstage/catalog-model'; -import type GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation'; -import type { LoggerService } from '@backstage/backend-plugin-api'; -import type { SchedulerService } from '@backstage/backend-plugin-api'; -import type { SchedulerServiceTaskRunner } from '@backstage/backend-plugin-api'; -import type { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api'; -import type { UserEntity } from '@backstage/catalog-model'; -import type UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; - -// @alpha -const catalogModuleKeycloakEntityProvider: BackendFeature; -export default catalogModuleKeycloakEntityProvider; - -// Warning: (ae-missing-release-tag) "GroupRepresentationWithParent" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface GroupRepresentationWithParent extends GroupRepresentation { - // (undocumented) - members?: string[]; - // (undocumented) - parent?: string; - // (undocumented) - parentId?: string; -} - -// Warning: (ae-missing-release-tag) "GroupRepresentationWithParentAndEntity" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface GroupRepresentationWithParentAndEntity extends GroupRepresentationWithParent { - // (undocumented) - entity: GroupEntity; -} - -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-escape-greater-than) The ">" character should be escaped using a backslash to avoid confusion with an HTML tag -// Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// Warning: (tsdoc-html-tag-missing-greater-than) The HTML tag has invalid syntax: Expecting an attribute or ">" or "/>" -// Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// -// @public -export type GroupTransformer = (entity: GroupEntity, group: GroupRepresentation, realm: string) => Promise; - -// @public -export class KeycloakOrgEntityProvider implements EntityProvider { - constructor(options: { - id: string; - provider: KeycloakProviderConfig; - logger: LoggerService; - taskRunner: SchedulerServiceTaskRunner; - userTransformer?: UserTransformer; - groupTransformer?: GroupTransformer; - }); - // (undocumented) - connect(connection: EntityProviderConnection): Promise; - // (undocumented) - static fromConfig(deps: { - config: Config; - logger: LoggerService; - }, options: ({ - schedule: SchedulerServiceTaskRunner; - } | { - scheduler: SchedulerService; - }) & { - userTransformer?: UserTransformer; - groupTransformer?: GroupTransformer; - }): KeycloakOrgEntityProvider[]; - // (undocumented) - getProviderName(): string; - read(options?: { - logger?: LoggerService; - }): Promise; - // (undocumented) - schedule(taskRunner: SchedulerServiceTaskRunner): void; -} - -// @public -export interface KeycloakOrgEntityProviderOptions { - groupTransformer?: GroupTransformer; - id: string; - logger: LoggerService; - schedule?: SchedulerServiceTaskRunner; - scheduler?: SchedulerService; - userTransformer?: UserTransformer; -} - -// @public -export type KeycloakTransformerExtensionPoint = { - setUserTransformer(userTransformer: UserTransformer): void; - setGroupTransformer(groupTransformer: GroupTransformer): void; -}; - -// @public -export const keycloakTransformerExtensionPoint: ExtensionPoint; - -// Warning: (ae-missing-release-tag) "noopGroupTransformer" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const noopGroupTransformer: GroupTransformer; - -// Warning: (ae-missing-release-tag) "noopUserTransformer" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const noopUserTransformer: UserTransformer; - -// Warning: (ae-missing-release-tag) "sanitizeEmailTransformer" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export const sanitizeEmailTransformer: UserTransformer; - -// Warning: (ae-missing-release-tag) "UserRepresentationWithEntity" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface UserRepresentationWithEntity extends UserRepresentation { - // (undocumented) - entity: UserEntity; -} - -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// Warning: (tsdoc-param-tag-with-invalid-type) The @param block should not include a JSDoc-style '{type}' -// Warning: (tsdoc-escape-greater-than) The ">" character should be escaped using a backslash to avoid confusion with an HTML tag -// Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag -// Warning: (tsdoc-html-tag-missing-greater-than) The HTML tag has invalid syntax: Expecting an attribute or ">" or "/>" -// Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" -// -// @public -export type UserTransformer = (entity: UserEntity, user: UserRepresentation, realm: string, groups: GroupRepresentationWithParentAndEntity[]) => Promise; - -// Warnings were encountered during analysis: -// -// src/lib/transformers.d.ts:2:22 - (ae-undocumented) Missing documentation for "noopGroupTransformer". -// src/lib/transformers.d.ts:3:22 - (ae-undocumented) Missing documentation for "noopUserTransformer". -// src/lib/types.d.ts:4:1 - (ae-undocumented) Missing documentation for "GroupRepresentationWithParent". -// src/lib/types.d.ts:5:5 - (ae-undocumented) Missing documentation for "parentId". -// src/lib/types.d.ts:6:5 - (ae-undocumented) Missing documentation for "parent". -// src/lib/types.d.ts:7:5 - (ae-undocumented) Missing documentation for "members". -// src/lib/types.d.ts:9:1 - (ae-undocumented) Missing documentation for "GroupRepresentationWithParentAndEntity". -// src/lib/types.d.ts:10:5 - (ae-undocumented) Missing documentation for "entity". -// src/lib/types.d.ts:12:1 - (ae-undocumented) Missing documentation for "UserRepresentationWithEntity". -// src/lib/types.d.ts:13:5 - (ae-undocumented) Missing documentation for "entity". -// src/providers/KeycloakOrgEntityProvider.d.ts:55:5 - (ae-undocumented) Missing documentation for "fromConfig". -// src/providers/KeycloakOrgEntityProvider.d.ts:68:9 - (ae-forgotten-export) The symbol "KeycloakProviderConfig" needs to be exported by the entry point index.d.ts -// src/providers/KeycloakOrgEntityProvider.d.ts:74:5 - (ae-undocumented) Missing documentation for "getProviderName". -// src/providers/KeycloakOrgEntityProvider.d.ts:75:5 - (ae-undocumented) Missing documentation for "connect". -// src/providers/KeycloakOrgEntityProvider.d.ts:83:5 - (ae-undocumented) Missing documentation for "schedule". - -// (No @packageDocumentation comment for this package) - -``` diff --git a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/report.api.md b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/report.api.md index a8f46f067c..72daab16d4 100644 --- a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/report.api.md +++ b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/report.api.md @@ -3,7 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts - import { BackendFeature } from '@backstage/backend-plugin-api'; import type { Config } from '@backstage/config'; import type { EntityProvider } from '@backstage/plugin-catalog-node'; @@ -18,7 +17,7 @@ import type { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend- import type { UserEntity } from '@backstage/catalog-model'; import type UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; -// @alpha +// @public const catalogModuleKeycloakEntityProvider: BackendFeature; export default catalogModuleKeycloakEntityProvider; @@ -26,20 +25,21 @@ export default catalogModuleKeycloakEntityProvider; // // @public (undocumented) export interface GroupRepresentationWithParent extends GroupRepresentation { - // (undocumented) - members?: string[]; - // (undocumented) - parent?: string; - // (undocumented) - parentId?: string; + // (undocumented) + members?: string[]; + // (undocumented) + parent?: string; + // (undocumented) + parentId?: string; } // Warning: (ae-missing-release-tag) "GroupRepresentationWithParentAndEntity" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export interface GroupRepresentationWithParentAndEntity extends GroupRepresentationWithParent { - // (undocumented) - entity: GroupEntity; +export interface GroupRepresentationWithParentAndEntity + extends GroupRepresentationWithParent { + // (undocumented) + entity: GroupEntity; } // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen @@ -54,55 +54,63 @@ export interface GroupRepresentationWithParentAndEntity extends GroupRepresentat // Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" // // @public -export type GroupTransformer = (entity: GroupEntity, group: GroupRepresentation, realm: string) => Promise; +export type GroupTransformer = ( + entity: GroupEntity, + group: GroupRepresentation, + realm: string, +) => Promise; // @public export class KeycloakOrgEntityProvider implements EntityProvider { - constructor(options: { - id: string; - provider: KeycloakProviderConfig; - logger: LoggerService; - taskRunner: SchedulerServiceTaskRunner; - userTransformer?: UserTransformer; - groupTransformer?: GroupTransformer; - }); - // (undocumented) - connect(connection: EntityProviderConnection): Promise; - // (undocumented) - static fromConfig(deps: { - config: Config; - logger: LoggerService; - }, options: ({ - schedule: SchedulerServiceTaskRunner; - } | { - scheduler: SchedulerService; - }) & { - userTransformer?: UserTransformer; - groupTransformer?: GroupTransformer; - }): KeycloakOrgEntityProvider[]; - // (undocumented) - getProviderName(): string; - read(options?: { - logger?: LoggerService; - }): Promise; - // (undocumented) - schedule(taskRunner: SchedulerServiceTaskRunner): void; + constructor(options: { + id: string; + provider: KeycloakProviderConfig; + logger: LoggerService; + taskRunner: SchedulerServiceTaskRunner; + userTransformer?: UserTransformer; + groupTransformer?: GroupTransformer; + }); + // (undocumented) + connect(connection: EntityProviderConnection): Promise; + // (undocumented) + static fromConfig( + deps: { + config: Config; + logger: LoggerService; + }, + options: ( + | { + schedule: SchedulerServiceTaskRunner; + } + | { + scheduler: SchedulerService; + } + ) & { + userTransformer?: UserTransformer; + groupTransformer?: GroupTransformer; + }, + ): KeycloakOrgEntityProvider[]; + // (undocumented) + getProviderName(): string; + read(options?: { logger?: LoggerService }): Promise; + // (undocumented) + schedule(taskRunner: SchedulerServiceTaskRunner): void; } // @public export interface KeycloakOrgEntityProviderOptions { - groupTransformer?: GroupTransformer; - id: string; - logger: LoggerService; - schedule?: SchedulerServiceTaskRunner; - scheduler?: SchedulerService; - userTransformer?: UserTransformer; + groupTransformer?: GroupTransformer; + id: string; + logger: LoggerService; + schedule?: SchedulerServiceTaskRunner; + scheduler?: SchedulerService; + userTransformer?: UserTransformer; } // @public export type KeycloakTransformerExtensionPoint = { - setUserTransformer(userTransformer: UserTransformer): void; - setGroupTransformer(groupTransformer: GroupTransformer): void; + setUserTransformer(userTransformer: UserTransformer): void; + setGroupTransformer(groupTransformer: GroupTransformer): void; }; // @public @@ -127,8 +135,8 @@ export const sanitizeEmailTransformer: UserTransformer; // // @public (undocumented) export interface UserRepresentationWithEntity extends UserRepresentation { - // (undocumented) - entity: UserEntity; + // (undocumented) + entity: UserEntity; } // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen @@ -145,7 +153,12 @@ export interface UserRepresentationWithEntity extends UserRepresentation { // Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@" // // @public -export type UserTransformer = (entity: UserEntity, user: UserRepresentation, realm: string, groups: GroupRepresentationWithParentAndEntity[]) => Promise; +export type UserTransformer = ( + entity: UserEntity, + user: UserRepresentation, + realm: string, + groups: GroupRepresentationWithParentAndEntity[], +) => Promise; // Warnings were encountered during analysis: // @@ -166,5 +179,4 @@ export type UserTransformer = (entity: UserEntity, user: UserRepresentation, rea // src/providers/KeycloakOrgEntityProvider.d.ts:83:5 - (ae-undocumented) Missing documentation for "schedule". // (No @packageDocumentation comment for this package) - ``` diff --git a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/lib/read.ts b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/lib/read.ts index 933d4a3a80..4e5f2e6ccc 100644 --- a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/lib/read.ts +++ b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/lib/read.ts @@ -120,25 +120,21 @@ export async function getEntities( const pageCount = Math.ceil(entityCount / entityQuerySize); // The next line acts like range in python - const entityPromises = Array.from( - { length: pageCount }, - (_, i) => - entities - .find({ - realm: config.realm, - max: entityQuerySize, - first: i * entityQuerySize, - }) - .catch(err => - logger.warn('Failed to retieve Keycloak entities.', err), - ) as ReturnType, - ); - - const entityResults = (await Promise.all(entityPromises)).flat() as Awaited< - ReturnType - >; + const entityResults = []; + for (let i = 0; i < pageCount; i) { + try { + const entitiesPage = await entities.find({ + realm: config.realm, + max: entityQuerySize, + first: i * entityQuerySize, + }); + entityResults.push(...entitiesPage); + } catch (err) { + logger.warn(`Failed to retrieve Keycloak entities: ${err}`); + } + } - return entityResults; + return entityResults as Awaited>; } async function getAllGroupMembers( @@ -269,37 +265,31 @@ export const readKeycloakRealm = async ( [] as GroupRepresentationWithParent[], ); } - const kGroups = await Promise.all( - rawKGroups.map(async g => { - g.members = await getAllGroupMembers( - client.groups as Groups, - g.id!, - config, - options, - ); - - if (isVersion23orHigher) { - if (g.subGroupCount! > 0) { - g.subGroups = await client.groups.listSubGroups({ - parentId: g.id!, - first: 0, - max: g.subGroupCount, - briefRepresentation: false, - realm: config.realm, - }); - } - if (g.parentId) { - const groupParent = await client.groups.findOne({ - id: g.parentId, - realm: config.realm, - }); - g.parent = groupParent?.name; - } + const kGroups = []; + for (const g of rawKGroups) { + g.members = await getAllGroupMembers(client.groups, g.id!, config, options); + + if (isVersion23orHigher) { + if (g.subGroupCount! > 0) { + g.subGroups = await client.groups.listSubGroups({ + parentId: g.id!, + first: 0, + max: g.subGroupCount, + briefRepresentation: false, + realm: config.realm, + }); + } + if (g.parentId) { + const groupParent = await client.groups.findOne({ + id: g.parentId, + realm: config.realm, + }); + g.parent = groupParent?.name; } + } - return g; - }), - ); + kGroups.push(g); + } const parsedGroups = await kGroups.reduce(async (promise, g) => { const partial = await promise; diff --git a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/module/catalogModuleKeycloakEntityProvider.ts b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/module/catalogModuleKeycloakEntityProvider.ts index 6673846613..439af300c9 100644 --- a/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/module/catalogModuleKeycloakEntityProvider.ts +++ b/workspaces/keycloak/plugins/catalog-backend-module-keycloak/src/module/catalogModuleKeycloakEntityProvider.ts @@ -28,7 +28,7 @@ import { KeycloakOrgEntityProvider } from '../providers'; /** * Registers the `KeycloakEntityProvider` with the catalog processing extension point. * - * @alpha + * @public */ export const catalogModuleKeycloakEntityProvider = createBackendModule({ pluginId: 'catalog', diff --git a/workspaces/keycloak/yarn.lock b/workspaces/keycloak/yarn.lock index 712dc847a1..5be8719e1e 100644 --- a/workspaces/keycloak/yarn.lock +++ b/workspaces/keycloak/yarn.lock @@ -1091,7 +1091,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.9": version: 7.26.0 resolution: "@babel/core@npm:7.26.0" dependencies: @@ -1114,7 +1114,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.7.2": version: 7.26.2 resolution: "@babel/generator@npm:7.26.2" dependencies: @@ -1353,7 +1353,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": version: 7.26.2 resolution: "@babel/parser@npm:7.26.2" dependencies: @@ -2436,7 +2436,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.24.0, @babel/traverse@npm:^7.25.7, @babel/traverse@npm:^7.25.9": +"@babel/traverse@npm:^7.25.7, @babel/traverse@npm:^7.25.9": version: 7.25.9 resolution: "@babel/traverse@npm:7.25.9" dependencies: @@ -2451,7 +2451,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.26.0 resolution: "@babel/types@npm:7.26.0" dependencies: @@ -4153,26 +4153,6 @@ __metadata: languageName: node linkType: hard -"@ianvs/prettier-plugin-sort-imports@npm:^4.3.1": - version: 4.3.1 - resolution: "@ianvs/prettier-plugin-sort-imports@npm:4.3.1" - dependencies: - "@babel/core": ^7.24.0 - "@babel/generator": ^7.23.6 - "@babel/parser": ^7.24.0 - "@babel/traverse": ^7.24.0 - "@babel/types": ^7.24.0 - semver: ^7.5.2 - peerDependencies: - "@vue/compiler-sfc": 2.7.x || 3.x - prettier: 2 || 3 - peerDependenciesMeta: - "@vue/compiler-sfc": - optional: true - checksum: 50af027d8b182893f247efa4c197259919c4796bea216b2a2323d0ced327c9f22785d7f8866b084566491fe7943640bb75457a724957bda92ee4c633fb2be9e6 - languageName: node - linkType: hard - "@internal/keycloak@workspace:.": version: 0.0.0-use.local resolution: "@internal/keycloak@workspace:." @@ -4181,7 +4161,6 @@ __metadata: "@backstage/e2e-test-utils": ^0.1.1 "@backstage/repo-tools": ^0.10.0 "@changesets/cli": ^2.27.1 - "@ianvs/prettier-plugin-sort-imports": ^4.3.1 "@spotify/prettier-config": ^12.0.0 knip: ^5.27.4 node-gyp: ^9.0.0 @@ -20326,7 +20305,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:7.6.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: