From e9b78e9698912a67c4af5f8469a6a70e73759370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 23 Apr 2026 10:51:43 +0200 Subject: [PATCH] Remove uuid dependency in favor of crypto.randomUUID() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The uuid package dropped its CommonJS entry point in v14, making it incompatible with Backstage's CJS build output and Jest test runner. Rather than working around the ESM-only issue, replace all usage with the built-in crypto.randomUUID() which has been available in Node.js since v16.7 and in all major browsers since March 2022. Signed-off-by: Fredrik Adelöw Made-with: Cursor --- .changeset/remove-uuid-dependency.md | 33 +++++++++++++++++++ packages/backend-defaults/package.json | 1 - .../external/ExternalAuthTokenHandler.test.ts | 2 +- .../entrypoints/auth/external/jwks.test.ts | 2 +- .../plugin/keys/DatabasePluginKeySource.ts | 2 +- .../entrypoints/scheduler/lib/TaskWorker.ts | 2 +- packages/backend-test-utils/package.json | 1 - .../backend-test-utils/src/cache/helpers.ts | 2 +- .../src/cache/memcache.test.ts | 2 +- .../src/cache/redis.test.ts | 2 +- .../src/cache/valkey.test.ts | 2 +- .../backend-test-utils/src/database/mysql.ts | 2 +- .../src/database/postgres.ts | 2 +- .../src/provider/{{providerClass}}.ts.hbs | 4 +-- .../package.json | 3 +- .../src/helpers.test.ts | 2 +- plugins/auth-backend/package.json | 1 - .../auth-backend/src/identity/TokenFactory.ts | 2 +- .../src/service/OfflineAccessService.ts | 2 +- plugins/auth-node/package.json | 3 +- .../identity/DefaultIdentityClient.test.ts | 2 +- .../src/identity/IdentityClient.test.ts | 2 +- .../catalog-backend-module-aws/package.json | 3 +- .../src/providers/AwsS3EntityProvider.ts | 4 +-- .../catalog-backend-module-azure/package.json | 3 +- .../AzureBlobStorageEntityProvider.ts | 4 +-- .../providers/AzureDevOpsEntityProvider.ts | 4 +-- .../package.json | 1 - .../InternalOpenApiDocumentationProvider.ts | 4 +-- .../package.json | 3 +- .../providers/BitbucketCloudEntityProvider.ts | 4 +-- .../package.json | 3 +- .../BitbucketServerEntityProvider.ts | 4 +-- .../package.json | 3 +- .../src/providers/GerritEntityProvider.ts | 4 +-- .../catalog-backend-module-gitea/package.json | 3 +- .../src/providers/GiteaEntityProvider.test.ts | 9 +++-- .../src/providers/GiteaEntityProvider.ts | 4 +-- .../package.json | 3 +- .../src/providers/GithubEntityProvider.ts | 4 +-- .../providers/GithubMultiOrgEntityProvider.ts | 4 +-- .../src/providers/GithubOrgEntityProvider.ts | 4 +-- .../package.json | 3 +- .../GitlabDiscoveryEntityProvider.ts | 4 +-- .../GitlabOrgDiscoveryEntityProvider.ts | 4 +-- .../package.json | 3 +- ...ncrementalIngestionDatabaseManager.test.ts | 2 +- .../IncrementalIngestionDatabaseManager.ts | 2 +- .../src/engine/IncrementalIngestionEngine.ts | 2 +- .../catalog-backend-module-ldap/package.json | 3 +- .../src/processors/LdapOrgEntityProvider.ts | 4 +-- .../package.json | 3 +- .../MicrosoftGraphOrgEntityProvider.ts | 4 +-- .../package.json | 3 +- .../src/providers/PuppetDbEntityProvider.ts | 4 +-- .../20200809202832_add_bootstrap_location.js | 2 +- plugins/catalog-backend/package.json | 1 - .../DefaultProcessingDatabase.test.ts | 4 +-- .../database/DefaultProviderDatabase.test.ts | 6 ++-- .../src/database/DefaultProviderDatabase.ts | 2 +- .../deleteWithEagerPruningOfChildren.test.ts | 4 +-- .../provider/refreshByRefreshKeys.test.ts | 6 ++-- .../refreshState/insertUnprocessedEntity.ts | 2 +- .../operations/stitcher/markForStitching.ts | 2 +- .../providers/DefaultLocationStore.test.ts | 2 +- .../src/providers/DefaultLocationStore.ts | 2 +- .../service/DefaultEntitiesCatalog.test.ts | 10 +++--- .../src/service/DefaultRefreshService.test.ts | 2 +- .../request/applyEntityFilterToQuery.test.ts | 2 +- .../applyPredicateEntityFilterToQuery.test.ts | 2 +- .../example-todo-list-backend/package.json | 3 +- .../src/service/todos.ts | 2 +- plugins/notifications-backend/package.json | 3 +- .../src/service/router.test.ts | 2 +- .../src/service/router.ts | 2 +- plugins/permission-common/package.json | 1 - .../permission-common/src/PermissionClient.ts | 8 ++--- plugins/scaffolder-backend/package.json | 1 - .../src/scaffolder/dryrun/createDryRunner.ts | 2 +- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 2 +- .../scaffolder-backend/src/service/router.ts | 2 +- .../package.json | 3 +- .../engines/ElasticSearchSearchEngine.test.ts | 5 ++- .../src/engines/ElasticSearchSearchEngine.ts | 2 +- plugins/search-backend-module-pg/package.json | 3 +- .../src/PgSearchEngine/PgSearchEngine.test.ts | 5 ++- .../src/PgSearchEngine/PgSearchEngine.ts | 2 +- .../database/DatabaseDocumentStore.test.ts | 2 +- plugins/search-backend-node/package.json | 3 +- .../src/engines/LunrSearchEngine.ts | 2 +- plugins/search-react/package.json | 1 - .../components/SearchFilter/SearchFilter.tsx | 4 +-- plugins/signals-backend/package.json | 1 - .../src/service/SignalManager.ts | 2 +- plugins/signals/package.json | 3 +- plugins/signals/src/api/SignalClient.ts | 3 +- yarn.lock | 31 +---------------- 97 files changed, 162 insertions(+), 179 deletions(-) create mode 100644 .changeset/remove-uuid-dependency.md diff --git a/.changeset/remove-uuid-dependency.md b/.changeset/remove-uuid-dependency.md new file mode 100644 index 0000000000..b32c5a846d --- /dev/null +++ b/.changeset/remove-uuid-dependency.md @@ -0,0 +1,33 @@ +--- +'@backstage/backend-defaults': patch +'@backstage/backend-test-utils': patch +'@backstage/cli-module-new': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +'@backstage/plugin-auth-node': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend-module-backstage-openapi': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-gitea': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-permission-common': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/plugin-search-backend-node': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-signals': patch +'@backstage/plugin-signals-backend': patch +--- + +Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 7bd7d55918..73bfad1dbe 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -192,7 +192,6 @@ "selfsigned": "^2.0.0", "tar": "^7.5.6", "triple-beam": "^1.4.1", - "uuid": "^11.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.2.1", diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index 349ad9bc19..97eb72e36c 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -25,7 +25,7 @@ import { import { randomBytes } from 'node:crypto'; import { SignJWT, exportJWK, generateKeyPair } from 'jose'; import { DateTime } from 'luxon'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts index 327173fdee..f8164dae19 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts @@ -19,7 +19,7 @@ import { ConfigReader } from '@backstage/config'; import { SignJWT, exportJWK, generateKeyPair } from 'jose'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { jwksTokenHandler } from './jwks'; // Simplified copy of TokenFactory in @backstage/plugin-auth-backend diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts index 562086a07f..40a47c4ea2 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts @@ -17,7 +17,7 @@ import { DatabaseService, LoggerService } from '@backstage/backend-plugin-api'; import { HumanDuration, durationToMilliseconds } from '@backstage/types'; import { JWK, exportJWK, generateKeyPair } from 'jose'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DatabaseKeyStore } from './DatabaseKeyStore'; import { InternalKey, KeyPayload, KeyStore } from './types'; import { PluginKeySource } from './types'; diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts index 4f32dc6863..8481302ba3 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts @@ -19,7 +19,7 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; import { CronTime } from 'cron'; import { Knex } from 'knex'; import { DateTime, Duration } from 'luxon'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DB_TASKS_TABLE, DbTasksRow } from '../database/tables'; import { TaskSettingsV2, diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 200f975238..bfc8a3a448 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -77,7 +77,6 @@ "pg-connection-string": "^2.3.0", "testcontainers": "^11.9.0", "text-extensions": "^2.4.0", - "uuid": "^11.0.0", "yn": "^4.0.0", "zod": "^3.25.76 || ^4.0.0", "zod-to-json-schema": "^3.25.1" diff --git a/packages/backend-test-utils/src/cache/helpers.ts b/packages/backend-test-utils/src/cache/helpers.ts index 7a18240fc8..6f339fc326 100644 --- a/packages/backend-test-utils/src/cache/helpers.ts +++ b/packages/backend-test-utils/src/cache/helpers.ts @@ -15,7 +15,7 @@ */ import Keyv, { type KeyvStoreAdapter } from 'keyv'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { waitForReady } from '../util/waitForReady'; import { Instance } from './types'; diff --git a/packages/backend-test-utils/src/cache/memcache.test.ts b/packages/backend-test-utils/src/cache/memcache.test.ts index bd912ce9d2..95522a5b65 100644 --- a/packages/backend-test-utils/src/cache/memcache.test.ts +++ b/packages/backend-test-utils/src/cache/memcache.test.ts @@ -16,7 +16,7 @@ import { isDockerDisabledForTests } from '../util/isDockerDisabledForTests'; import { startMemcachedContainer } from './memcache'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; diff --git a/packages/backend-test-utils/src/cache/redis.test.ts b/packages/backend-test-utils/src/cache/redis.test.ts index 6555a26677..d003a4f449 100644 --- a/packages/backend-test-utils/src/cache/redis.test.ts +++ b/packages/backend-test-utils/src/cache/redis.test.ts @@ -16,7 +16,7 @@ import { isDockerDisabledForTests } from '../util/isDockerDisabledForTests'; import { startRedisContainer } from './redis'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; diff --git a/packages/backend-test-utils/src/cache/valkey.test.ts b/packages/backend-test-utils/src/cache/valkey.test.ts index d706458659..0f1ee3e834 100644 --- a/packages/backend-test-utils/src/cache/valkey.test.ts +++ b/packages/backend-test-utils/src/cache/valkey.test.ts @@ -15,7 +15,7 @@ */ import { isDockerDisabledForTests } from '../util/isDockerDisabledForTests'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { startValkeyContainer } from './valkey'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; diff --git a/packages/backend-test-utils/src/database/mysql.ts b/packages/backend-test-utils/src/database/mysql.ts index 042aa74405..b4d677bd1f 100644 --- a/packages/backend-test-utils/src/database/mysql.ts +++ b/packages/backend-test-utils/src/database/mysql.ts @@ -16,7 +16,7 @@ import { randomBytes } from 'node:crypto'; import knexFactory, { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import yn from 'yn'; import { waitForReady } from '../util/waitForReady'; import { Engine, LARGER_POOL_CONFIG, TestDatabaseProperties } from './types'; diff --git a/packages/backend-test-utils/src/database/postgres.ts b/packages/backend-test-utils/src/database/postgres.ts index 8d85470252..e9a8086230 100644 --- a/packages/backend-test-utils/src/database/postgres.ts +++ b/packages/backend-test-utils/src/database/postgres.ts @@ -17,7 +17,7 @@ import { randomBytes } from 'node:crypto'; import knexFactory, { Knex } from 'knex'; import { parse as parsePgConnectionString } from 'pg-connection-string'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { waitForReady } from '../util/waitForReady'; import { Engine, LARGER_POOL_CONFIG, TestDatabaseProperties } from './types'; diff --git a/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs b/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs index 3e4c5718ae..443091e81a 100644 --- a/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs +++ b/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs @@ -4,7 +4,7 @@ import { EntityProvider, EntityProviderConnection, } from '@backstage/plugin-catalog-node'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { readProviderConfigs } from './readProviderConfigs'; import { LoggerService, @@ -74,7 +74,7 @@ export class {{providerClass}} implements EntityProvider { fn: async () => { const logger = this.#logger.child({ taskId: id, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index ad1979fae4..226b7737d1 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -49,8 +49,7 @@ "@backstage/plugin-auth-backend": "workspace:^", "@backstage/types": "workspace:^", "msw": "^2.0.0", - "node-mocks-http": "^1.0.0", - "uuid": "^11.0.0" + "node-mocks-http": "^1.0.0" }, "configSchema": "config.d.ts" } diff --git a/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.test.ts b/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.test.ts index 07e9860d98..84236a5f14 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.test.ts +++ b/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.test.ts @@ -23,7 +23,7 @@ import { SignJWT, exportJWK, generateKeyPair } from 'jose'; import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { createRequest } from 'node-mocks-http'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { AuthHelper } from './helpers'; import { CF_JWT_HEADER, CloudflareAccessIdentityProfile } from './types'; diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index a44188cca4..a142ebca6d 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -65,7 +65,6 @@ "matcher": "^4.0.0", "minimatch": "^10.2.1", "passport": "^0.7.0", - "uuid": "^11.0.0", "zod": "^3.25.76 || ^4.0.0", "zod-validation-error": "^5.0.0" }, diff --git a/plugins/auth-backend/src/identity/TokenFactory.ts b/plugins/auth-backend/src/identity/TokenFactory.ts index d94825e322..457f9b793c 100644 --- a/plugins/auth-backend/src/identity/TokenFactory.ts +++ b/plugins/auth-backend/src/identity/TokenFactory.ts @@ -16,7 +16,7 @@ import { exportJWK, generateKeyPair, JWK } from 'jose'; import { DateTime } from 'luxon'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { LoggerService } from '@backstage/backend-plugin-api'; import { BackstageSignInResult, diff --git a/plugins/auth-backend/src/service/OfflineAccessService.ts b/plugins/auth-backend/src/service/OfflineAccessService.ts index e8a8cae1f1..f9883fce3a 100644 --- a/plugins/auth-backend/src/service/OfflineAccessService.ts +++ b/plugins/auth-backend/src/service/OfflineAccessService.ts @@ -23,7 +23,7 @@ import { import { AuthenticationError } from '@backstage/errors'; import { readDurationFromConfig } from '@backstage/config'; import { durationToMilliseconds } from '@backstage/types'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { OfflineSessionDatabase } from '../database/OfflineSessionDatabase'; import { generateRefreshToken, diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 8aa8a711a7..34dfab67d5 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -61,7 +61,6 @@ "cookie-parser": "^1.4.6", "express-promise-router": "^4.1.1", "msw": "^1.0.0", - "supertest": "^7.0.0", - "uuid": "^11.0.0" + "supertest": "^7.0.0" } } diff --git a/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts b/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts index 68765c6bef..4feec0d32c 100644 --- a/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts +++ b/plugins/auth-node/src/identity/DefaultIdentityClient.test.ts @@ -23,7 +23,7 @@ import { import { cloneDeep } from 'lodash'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DefaultIdentityClient } from './DefaultIdentityClient'; import { IdentityApiGetIdentityRequest } from './IdentityApi'; diff --git a/plugins/auth-node/src/identity/IdentityClient.test.ts b/plugins/auth-node/src/identity/IdentityClient.test.ts index 91cd1759aa..a0c32d6a82 100644 --- a/plugins/auth-node/src/identity/IdentityClient.test.ts +++ b/plugins/auth-node/src/identity/IdentityClient.test.ts @@ -24,7 +24,7 @@ import { import { cloneDeep } from 'lodash'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { IdentityClient } from './IdentityClient'; import { DiscoveryService } from '@backstage/backend-plugin-api'; diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index a9482910fc..38374c6b73 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -66,8 +66,7 @@ "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", - "p-limit": "^3.0.2", - "uuid": "^11.0.0" + "p-limit": "^3.0.2" }, "devDependencies": { "@aws-sdk/util-stream-node": "^3.350.0", diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts index fa73188213..a522a7904a 100644 --- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts +++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts @@ -29,7 +29,7 @@ import { ListObjectsV2Output, S3, } from '@aws-sdk/client-s3'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { getEndpointFromInstructions } from '@aws-sdk/middleware-endpoint'; import { AwsCredentialsManager, @@ -137,7 +137,7 @@ export class AwsS3EntityProvider implements EntityProvider { const logger = this.logger.child({ class: AwsS3EntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 544ec7e677..a1df8542af 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -59,8 +59,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", - "@backstage/plugin-events-node": "workspace:^", - "uuid": "^11.0.0" + "@backstage/plugin-events-node": "workspace:^" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts index fdb05b0781..c9e5489326 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts @@ -32,7 +32,7 @@ import { locationSpecToLocationEntity, } from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { readAzureBlobStorageConfigs } from './config'; import { AzureBlobStorageIntergation, @@ -134,7 +134,7 @@ export class AzureBlobStorageEntityProvider implements EntityProvider { const logger = this.logger.child({ class: AzureBlobStorageEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 5869d0e2ba..3e626f282f 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -29,7 +29,7 @@ import { import { LocationSpec } from '@backstage/plugin-catalog-common'; import { readAzureDevOpsConfigs } from './config'; import { AzureDevOpsConfig } from './types'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { codeSearch, CodeSearchResultItem } from '../lib'; import { SchedulerService, @@ -129,7 +129,7 @@ export class AzureDevOpsEntityProvider implements EntityProvider { const logger = this.logger.child({ class: AzureDevOpsEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index c1927c5912..e42ee5ed55 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -42,7 +42,6 @@ "cross-fetch": "^4.0.0", "lodash": "^4.17.21", "openapi-merge": "^1.3.2", - "uuid": "^11.0.0", "yaml": "^2.7.0" }, "devDependencies": { diff --git a/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts b/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts index d488831ec6..9c9316f686 100644 --- a/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts +++ b/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts @@ -40,7 +40,7 @@ import { SchedulerService, SchedulerServiceTaskRunner, } from '@backstage/backend-plugin-api'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import lodash from 'lodash'; const HTTP_VERBS: (keyof PathItemObject)[] = [ @@ -238,7 +238,7 @@ export class InternalOpenApiDocumentationProvider implements EntityProvider { class: InternalOpenApiDocumentationProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); await this.refresh(logger); }, diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 63905bd97f..2641d77e4b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -59,8 +59,7 @@ "@backstage/plugin-bitbucket-cloud-common": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", - "@backstage/plugin-events-node": "workspace:^", - "uuid": "^11.0.0" + "@backstage/plugin-events-node": "workspace:^" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts index 33327e1f33..7a059f8793 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts @@ -44,7 +44,7 @@ import { BitbucketCloudEntityProviderConfig, readProviderConfigs, } from './BitbucketCloudEntityProviderConfig'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; const DEFAULT_BRANCH = 'master'; const TOPIC_REPO_PUSH = 'bitbucketCloud.repo:push'; @@ -154,7 +154,7 @@ export class BitbucketCloudEntityProvider implements EntityProvider { const logger = this.logger.child({ class: BitbucketCloudEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index da623fd60d..e5ad23324f 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -53,8 +53,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", - "@backstage/plugin-events-node": "workspace:^", - "uuid": "^11.0.0" + "@backstage/plugin-events-node": "workspace:^" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts index 4b02632892..809c2276f2 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts @@ -27,7 +27,7 @@ import { DeferredEntity, CatalogService, } from '@backstage/plugin-catalog-node'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { BitbucketServerClient, paginated } from '../lib'; import { BitbucketServerEntityProviderConfig, @@ -157,7 +157,7 @@ export class BitbucketServerEntityProvider implements EntityProvider { const logger = this.logger.child({ class: BitbucketServerEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 87317eec00..30a7aca3d6 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -54,8 +54,7 @@ "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "fs-extra": "^11.2.0", - "p-limit": "^3.1.0", - "uuid": "^11.0.0" + "p-limit": "^3.1.0" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts index bd23c4b59c..8bfa6a9fe0 100644 --- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts +++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts @@ -29,7 +29,7 @@ import { parseGerritJsonResponse, ScmIntegrations, } from '@backstage/integration'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import pLimit from 'p-limit'; import { readGerritConfigs } from './config'; @@ -128,7 +128,7 @@ export class GerritEntityProvider implements EntityProvider { const logger = this.logger.child({ class: GerritEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json index 7e6c01ce68..80a2cead6b 100644 --- a/plugins/catalog-backend-module-gitea/package.json +++ b/plugins/catalog-backend-module-gitea/package.json @@ -39,8 +39,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", - "p-limit": "^3.0.2", - "uuid": "^11.0.0" + "p-limit": "^3.0.2" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.test.ts b/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.test.ts index 539d432793..fbc59a0b1c 100644 --- a/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.test.ts @@ -17,14 +17,17 @@ import { mockServices } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GiteaEntityProvider } from './GiteaEntityProvider'; -import * as uuid from 'uuid'; +import * as nodeCrypto from 'node:crypto'; import { readGiteaConfigs } from './config'; import { getGiteaApiUrl } from './core'; import { GiteaIntegration } from '@backstage/integration'; jest.mock('./config'); jest.mock('./core'); -jest.mock('uuid'); +jest.mock('node:crypto', () => ({ + ...jest.requireActual('node:crypto'), + randomUUID: jest.fn(), +})); describe('GiteaEntityProvider', () => { const logger = mockServices.logger.mock(); @@ -59,7 +62,7 @@ describe('GiteaEntityProvider', () => { 'https://gitea.example.com/api/v1/', ); mockScheduler.createScheduledTaskRunner.mockReturnValue(mockTaskRunner); - (uuid.v4 as jest.Mock).mockReturnValue('test-uuid'); + (nodeCrypto.randomUUID as jest.Mock).mockReturnValue('test-uuid'); // Mock global fetch global.fetch = jest.fn(); diff --git a/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.ts b/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.ts index 2f9475af26..a1cf506f52 100644 --- a/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.ts +++ b/plugins/catalog-backend-module-gitea/src/providers/GiteaEntityProvider.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { Config } from '@backstage/config'; import { InputError } from '@backstage/errors'; import { @@ -141,7 +141,7 @@ export class GiteaEntityProvider implements EntityProvider { const logger = this.logger.child({ class: GiteaEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index a64968c981..768052ec4e 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -70,8 +70,7 @@ "git-url-parse": "^15.0.0", "lodash": "^4.17.21", "minimatch": "^10.2.1", - "octokit": "^3.0.0", - "uuid": "^11.0.0" + "octokit": "^3.0.0" }, "devDependencies": { "@backstage/backend-defaults": "workspace:^", diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts index 5a830c20b5..a89845465f 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts @@ -32,7 +32,7 @@ import { import { LocationSpec } from '@backstage/plugin-catalog-common'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { GithubEntityProviderConfig, readProviderConfigs, @@ -189,7 +189,7 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { const logger = this.logger.child({ class: GithubEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { await this.refresh(logger); diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts index 28d598b5b1..426a67eadb 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts @@ -52,7 +52,7 @@ import { TeamEvent, } from '@octokit/webhooks-types'; import { merge } from 'lodash'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { assignGroupsToUsers, @@ -894,7 +894,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { const logger = this.options.logger.child({ class: GithubMultiOrgEntityProvider.prototype.constructor.name, taskId: id, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts index d13520f112..ce9ae13af6 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts @@ -41,7 +41,7 @@ import { TeamEditedEvent, TeamEvent, } from '@octokit/webhooks-types'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { defaultOrganizationTeamTransformer, defaultUserTransformer, @@ -653,7 +653,7 @@ export class GithubOrgEntityProvider implements EntityProvider { const logger = this.options.logger.child({ class: GithubOrgEntityProvider.prototype.constructor.name, taskId: id, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 8d413c5210..86a01cf350 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -61,8 +61,7 @@ "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", "@gitbeaker/rest": "^40.0.3", - "lodash": "^4.17.21", - "uuid": "^11.0.0" + "lodash": "^4.17.21" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index 92f4ac797a..c171e66801 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -30,7 +30,7 @@ import { } from '@backstage/plugin-catalog-node'; import { EventsService } from '@backstage/plugin-events-node'; import { WebhookProjectSchema, WebhookPushEventSchema } from '@gitbeaker/rest'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { GitLabClient, GitLabGroup, @@ -180,7 +180,7 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { const logger = this.logger.child({ class: GitlabDiscoveryEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index 37b446fd95..7e0f1aed27 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -31,7 +31,7 @@ import { } from '@backstage/plugin-catalog-node'; import { EventsService } from '@backstage/plugin-events-node'; import { merge } from 'lodash'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { GitLabClient, @@ -340,7 +340,7 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { const logger = this.logger.child({ class: GitlabOrgDiscoveryEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 8fa3963d35..49ec3eb415 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -59,8 +59,7 @@ "express": "^4.22.0", "express-promise-router": "^4.1.0", "knex": "^3.0.0", - "luxon": "^3.0.0", - "uuid": "^11.0.0" + "luxon": "^3.0.0" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.test.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.test.ts index 03a0488cb0..a99ca1cb94 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.test.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.test.ts @@ -16,7 +16,7 @@ import { TestDatabases } from '@backstage/backend-test-utils'; import { IncrementalIngestionDatabaseManager } from './IncrementalIngestionDatabaseManager'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DeferredEntity } from '@backstage/plugin-catalog-node'; const migrationsDir = `${__dirname}/../../migrations`; diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts index d5f6487c5d..ff1b98508f 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts @@ -18,7 +18,7 @@ import { Knex } from 'knex'; import type { DeferredEntity } from '@backstage/plugin-catalog-node'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { Duration } from 'luxon'; -import { v4 } from 'uuid'; +import { randomUUID as v4 } from 'node:crypto'; import { IngestionRecord, IngestionRecordUpdate, diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts index 2cfa5904f4..0907648be0 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts @@ -20,7 +20,7 @@ import { IterationEngine, IterationEngineOptions } from '../types'; import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager'; import { performance } from 'node:perf_hooks'; import { Duration } from 'luxon'; -import { v4 } from 'uuid'; +import { randomUUID as v4 } from 'node:crypto'; import { stringifyError, toError } from '@backstage/errors'; import { EventParams } from '@backstage/plugin-events-node'; import { HumanDuration } from '@backstage/types'; diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index b634b020ec..7b2ea60ada 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -46,8 +46,7 @@ "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "ldapts": "^8.0.6", - "lodash": "^4.17.21", - "uuid": "^11.0.0" + "lodash": "^4.17.21" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts index 5edd3b06d0..ccfb5d17d6 100644 --- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts @@ -25,7 +25,7 @@ import { EntityProviderConnection, } from '@backstage/plugin-catalog-node'; import { merge } from 'lodash'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { GroupTransformer, LdapClient, @@ -324,7 +324,7 @@ export class LdapOrgEntityProvider implements EntityProvider { const logger = this.options.logger.child({ class: LdapOrgEntityProvider.prototype.constructor.name, taskId: id, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index b016f3ce7b..8133c04ea8 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -60,8 +60,7 @@ "@microsoft/microsoft-graph-types": "^2.6.0", "lodash": "^4.17.21", "p-limit": "^3.0.2", - "qs": "^6.9.4", - "uuid": "^11.0.0" + "qs": "^6.9.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts index a6f2ee78d7..572931537d 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts @@ -25,7 +25,7 @@ import { EntityProviderConnection, } from '@backstage/plugin-catalog-node'; import { merge } from 'lodash'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { GroupTransformer, MICROSOFT_GRAPH_GROUP_ID_ANNOTATION, @@ -391,7 +391,7 @@ export class MicrosoftGraphOrgEntityProvider implements EntityProvider { const logger = this.options.logger.child({ class: MicrosoftGraphOrgEntityProvider.prototype.constructor.name, taskId: id, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 8adf244bff..a5443faae1 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -55,8 +55,7 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", - "lodash": "^4.17.21", - "uuid": "^11.0.0" + "lodash": "^4.17.21" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts index 8849e32c16..d44c447832 100644 --- a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts +++ b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts @@ -23,7 +23,7 @@ import { readProviderConfigs, } from './PuppetDbEntityProviderConfig'; import { Config } from '@backstage/config'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { defaultResourceTransformer, ResourceTransformer } from '../puppet'; import { ANNOTATION_LOCATION, @@ -145,7 +145,7 @@ export class PuppetDbEntityProvider implements EntityProvider { const logger = this.logger.child({ class: PuppetDbEntityProvider.prototype.constructor.name, taskId, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { await this.refresh(logger); diff --git a/plugins/catalog-backend/migrations/20200809202832_add_bootstrap_location.js b/plugins/catalog-backend/migrations/20200809202832_add_bootstrap_location.js index 5afb069d49..6adf798b07 100644 --- a/plugins/catalog-backend/migrations/20200809202832_add_bootstrap_location.js +++ b/plugins/catalog-backend/migrations/20200809202832_add_bootstrap_location.js @@ -23,7 +23,7 @@ exports.up = async function up(knex) { // Adds a single 'bootstrap' location that can be used to trigger work in processors. // This is primarily here to fulfill foreign key constraints. await knex('locations').insert({ - id: require('uuid').v4(), + id: require('node:crypto').randomUUID(), type: 'bootstrap', target: 'bootstrap', }); diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index d28fb2befe..47d9da1650 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -94,7 +94,6 @@ "minimatch": "^10.2.1", "p-limit": "^3.0.2", "prom-client": "^15.0.0", - "uuid": "^11.0.0", "yaml": "^2.0.0", "yn": "^4.0.0", "zod": "^3.25.76 || ^4.0.0", diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index b9f3599b19..d1501c073d 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-test-utils'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { Knex } from 'knex'; -import * as uuid from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { Logger } from 'winston'; import { DateTime } from 'luxon'; import { applyDatabaseMigrations } from './migrations'; @@ -80,7 +80,7 @@ describe('DefaultProcessingDatabase', () => { let processedEntity: Entity; beforeEach(() => { - id = uuid.v4(); + id = uuid(); processedEntity = { apiVersion: '1', kind: 'Location', diff --git a/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts index d9465b27a6..b193564102 100644 --- a/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-test-utils'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { Knex } from 'knex'; -import * as uuid from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DefaultProviderDatabase } from './DefaultProviderDatabase'; import { applyDatabaseMigrations } from './migrations'; import { DbRefreshStateReferencesRow, DbRefreshStateRow } from './tables'; @@ -62,7 +62,7 @@ describe('DefaultProviderDatabase', () => { const createLocations = async (db: Knex, entityRefs: string[]) => { for (const ref of entityRefs) { await insertRefreshStateRow(db, { - entity_id: uuid.v4(), + entity_id: uuid(), entity_ref: ref, unprocessed_entity: '{}', processed_entity: '{}', @@ -501,7 +501,7 @@ describe('DefaultProviderDatabase', () => { const { knex, db } = await createDatabase(databaseId); await createLocations(knex, ['location:default/removed']); await insertRefreshStateRow(knex, { - entity_id: uuid.v4(), + entity_id: uuid(), entity_ref: 'location:default/replaced', unprocessed_entity: '{}', processed_entity: '{}', diff --git a/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts b/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts index f6f89d066c..fd844ca5e7 100644 --- a/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts @@ -18,7 +18,7 @@ import { stringifyEntityRef } from '@backstage/catalog-model'; import { DeferredEntity } from '@backstage/plugin-catalog-node'; import { Knex } from 'knex'; import lodash from 'lodash'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { rethrowError } from './conversion'; import { deleteWithEagerPruningOfChildren } from './operations/provider/deleteWithEagerPruningOfChildren'; import { refreshByRefreshKeys } from './operations/provider/refreshByRefreshKeys'; diff --git a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts index 451f7bc1ac..1ec0611347 100644 --- a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts +++ b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts @@ -16,7 +16,7 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { Knex } from 'knex'; -import * as uuid from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { applyDatabaseMigrations } from '../../migrations'; import { DbRefreshStateReferencesRow, @@ -64,7 +64,7 @@ describe('deleteWithEagerPruningOfChildren', () => { async function insertEntity(knex: Knex, ...entityRefs: string[]) { for (const ref of entityRefs) { await knex('refresh_state').insert({ - entity_id: uuid.v4(), + entity_id: uuid(), entity_ref: ref, unprocessed_entity: '{}', processed_entity: '{}', diff --git a/plugins/catalog-backend/src/database/operations/provider/refreshByRefreshKeys.test.ts b/plugins/catalog-backend/src/database/operations/provider/refreshByRefreshKeys.test.ts index cd3a3c717e..e37f764ce0 100644 --- a/plugins/catalog-backend/src/database/operations/provider/refreshByRefreshKeys.test.ts +++ b/plugins/catalog-backend/src/database/operations/provider/refreshByRefreshKeys.test.ts @@ -15,7 +15,7 @@ */ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; -import * as uuid from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { applyDatabaseMigrations } from '../../migrations'; import { DbRefreshKeysRow, DbRefreshStateRow } from '../../tables'; import { generateTargetKey } from '../../util'; @@ -37,7 +37,7 @@ describe('refreshByRefreshKeys', () => { async databaseId => { const knex = await createDatabase(databaseId); - const eid1 = uuid.v4(); + const eid1 = uuid(); await knex('refresh_state').insert({ entity_id: eid1, entity_ref: 'k:ns/n1', @@ -48,7 +48,7 @@ describe('refreshByRefreshKeys', () => { last_discovery_at: '2021-04-01 13:37:00', }); - const eid2 = uuid.v4(); + const eid2 = uuid(); await knex('refresh_state').insert({ entity_id: eid2, entity_ref: 'k:ns/n2', diff --git a/plugins/catalog-backend/src/database/operations/refreshState/insertUnprocessedEntity.ts b/plugins/catalog-backend/src/database/operations/refreshState/insertUnprocessedEntity.ts index 54067c3f2e..83675d05a2 100644 --- a/plugins/catalog-backend/src/database/operations/refreshState/insertUnprocessedEntity.ts +++ b/plugins/catalog-backend/src/database/operations/refreshState/insertUnprocessedEntity.ts @@ -17,7 +17,7 @@ import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { Knex } from 'knex'; import { DbRefreshStateRow } from '../../tables'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { LoggerService, isDatabaseConflictError, diff --git a/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts b/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts index 9e22a65e7b..f0dfc5db71 100644 --- a/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts +++ b/plugins/catalog-backend/src/database/operations/stitcher/markForStitching.ts @@ -16,7 +16,7 @@ import { Knex } from 'knex'; import splitToChunks from 'lodash/chunk'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { StitchingStrategy } from '../../../stitching/types'; import { DbFinalEntitiesRow, diff --git a/plugins/catalog-backend/src/providers/DefaultLocationStore.test.ts b/plugins/catalog-backend/src/providers/DefaultLocationStore.test.ts index b11687e33f..91b6f7b29f 100644 --- a/plugins/catalog-backend/src/providers/DefaultLocationStore.test.ts +++ b/plugins/catalog-backend/src/providers/DefaultLocationStore.test.ts @@ -19,7 +19,7 @@ import { ANNOTATION_ORIGIN_LOCATION, stringifyEntityRef, } from '@backstage/catalog-model'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { applyDatabaseMigrations } from '../database/migrations'; import { DbFinalEntitiesRow, diff --git a/plugins/catalog-backend/src/providers/DefaultLocationStore.ts b/plugins/catalog-backend/src/providers/DefaultLocationStore.ts index 519835439f..7ebbd47aa1 100644 --- a/plugins/catalog-backend/src/providers/DefaultLocationStore.ts +++ b/plugins/catalog-backend/src/providers/DefaultLocationStore.ts @@ -17,7 +17,7 @@ import { Location } from '@backstage/catalog-client'; import { ConflictError, InputError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DbLocationsRow, DbRefreshStateRow, diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index e714d6e3a7..2bc70a6e94 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -22,7 +22,7 @@ import { } from '@backstage/backend-test-utils'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { Knex } from 'knex'; -import { v4 as uuid, v4 } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { QueryEntitiesCursorRequest, QueryEntitiesInitialRequest, @@ -99,7 +99,7 @@ describe('DefaultEntitiesCatalog', () => { } async function addEntityToSearch(entity: Entity) { - const id = entity.metadata.uid || v4(); + const id = entity.metadata.uid || uuid(); const entityRef = stringifyEntityRef(entity); const entityJson = JSON.stringify(entity); @@ -1518,7 +1518,7 @@ describe('DefaultEntitiesCatalog', () => { addEntityToSearch({ apiVersion: 'a', kind: 'k', - metadata: { name: v4() }, + metadata: { name: uuid() }, }), ), ); @@ -1554,7 +1554,7 @@ describe('DefaultEntitiesCatalog', () => { addEntityToSearch({ apiVersion: 'a', kind: 'k', - metadata: { name: v4() }, + metadata: { name: uuid() }, }), ), ); @@ -2465,7 +2465,7 @@ describe('DefaultEntitiesCatalog', () => { // Insert an unstitched entity: final_entity is NULL but search // rows exist. This simulates a race or future tombstone state. - const unstitchedId = v4(); + const unstitchedId = uuid(); await knex('refresh_state').insert({ entity_id: unstitchedId, entity_ref: 'component:default/unstitched', diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index 00ce749b4a..d659f8394e 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -23,7 +23,7 @@ import { import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { createHash } from 'node:crypto'; import { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DefaultCatalogDatabase } from '../database/DefaultCatalogDatabase'; import { DefaultProcessingDatabase } from '../database/DefaultProcessingDatabase'; import { applyDatabaseMigrations } from '../database/migrations'; diff --git a/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts index 92b1cd093f..eac85635c1 100644 --- a/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyEntityFilterToQuery.test.ts @@ -25,7 +25,7 @@ import { Knex } from 'knex'; import { applyDatabaseMigrations } from '../../database/migrations'; import { EntityFilter } from '@backstage/plugin-catalog-node'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { buildEntitySearch } from '../../database/operations/stitcher/buildEntitySearch'; jest.setTimeout(60_000); diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index 6755ed5cc2..0a9eb4560c 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -25,7 +25,7 @@ import { Knex } from 'knex'; import { applyDatabaseMigrations } from '../../database/migrations'; import { FilterPredicate } from '@backstage/filter-predicates'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { buildEntitySearch } from '../../database/operations/stitcher/buildEntitySearch'; jest.setTimeout(60_000); diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 7d541db65a..7d61b9f43f 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -42,8 +42,7 @@ "@backstage/errors": "workspace:^", "@types/express": "^4.17.6", "express": "^4.22.0", - "express-promise-router": "^4.1.0", - "uuid": "^11.0.0" + "express-promise-router": "^4.1.0" }, "devDependencies": { "@backstage/backend-defaults": "workspace:^", diff --git a/plugins/example-todo-list-backend/src/service/todos.ts b/plugins/example-todo-list-backend/src/service/todos.ts index 75de25b845..69fec8a73f 100644 --- a/plugins/example-todo-list-backend/src/service/todos.ts +++ b/plugins/example-todo-list-backend/src/service/todos.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { NotFoundError } from '@backstage/errors'; export type Todo = { diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 13275fbfb3..cffd331ef6 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -54,8 +54,7 @@ "express": "^4.22.0", "express-promise-router": "^4.1.0", "knex": "^3.0.0", - "p-throttle": "^4.1.1", - "uuid": "^11.0.0" + "p-throttle": "^4.1.1" }, "devDependencies": { "@backstage/backend-defaults": "workspace:^", diff --git a/plugins/notifications-backend/src/service/router.test.ts b/plugins/notifications-backend/src/service/router.test.ts index b15f753e1b..4ea63a9554 100644 --- a/plugins/notifications-backend/src/service/router.test.ts +++ b/plugins/notifications-backend/src/service/router.test.ts @@ -32,7 +32,7 @@ import { } from '@backstage/plugin-notifications-node'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; import { DatabaseService } from '@backstage/backend-plugin-api'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DatabaseNotificationsStore, generateSettingsHash } from '../database'; const databases = TestDatabases.create(); diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index 3bdd4d4c6a..6867eb9bbc 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -22,7 +22,7 @@ import { NotificationsStore, TopicGetOptions, } from '../database'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { CatalogService } from '@backstage/plugin-catalog-node'; import { NotificationProcessor, diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index a06de5ab42..dc7f80b0d8 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -52,7 +52,6 @@ "@backstage/errors": "workspace:^", "@backstage/types": "workspace:^", "cross-fetch": "^4.0.0", - "uuid": "^11.0.0", "zod": "^3.25.76 || ^4.0.0", "zod-to-json-schema": "^3.25.1" }, diff --git a/plugins/permission-common/src/PermissionClient.ts b/plugins/permission-common/src/PermissionClient.ts index d178dcf2af..6f311b71be 100644 --- a/plugins/permission-common/src/PermissionClient.ts +++ b/plugins/permission-common/src/PermissionClient.ts @@ -17,7 +17,7 @@ import { Config } from '@backstage/config'; import { ResponseError } from '@backstage/errors'; import fetch from 'cross-fetch'; -import * as uuid from 'uuid'; + import { z } from 'zod/v3'; import { AuthorizeResult, @@ -181,7 +181,7 @@ export class PermissionClient implements PermissionEvaluator { ) { const request: PermissionMessageBatch = { items: queries.map(query => ({ - id: uuid.v4(), + id: globalThis.crypto.randomUUID(), ...query, })), }; @@ -213,7 +213,7 @@ export class PermissionClient implements PermissionEvaluator { request[permission.name] ||= { permission, resourceRef: [], - id: uuid.v4(), + id: globalThis.crypto.randomUUID(), }; if (resourceRef) { @@ -222,7 +222,7 @@ export class PermissionClient implements PermissionEvaluator { } else { request[permission.name] ||= { permission, - id: uuid.v4(), + id: globalThis.crypto.randomUUID(), }; } } diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 68073451da..5aa2596dd6 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -93,7 +93,6 @@ "p-queue": "^6.6.2", "prom-client": "^15.0.0", "triple-beam": "^1.4.1", - "uuid": "^11.0.0", "winston": "^3.2.1", "winston-transport": "^4.7.0", "yaml": "^2.0.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts index 1c56248081..197ea1b0c1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts @@ -42,7 +42,7 @@ import { JsonObject } from '@backstage/types'; import fs from 'fs-extra'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner'; import { DecoratedActionsRegistry } from './DecoratedActionsRegistry'; import { TemplateActionRegistry } from '../actions'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 22ce3e83b7..b899350b79 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; import { ConflictError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { TaskStore, TaskStoreCreateTaskOptions, diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 10d81cc515..623067eddc 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -84,7 +84,7 @@ import { HumanDuration, JsonObject } from '@backstage/types'; import express from 'express'; import { Duration } from 'luxon'; import { pathToFileURL } from 'node:url'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { z } from 'zod/v3'; import { DatabaseTaskStore, diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 06aae55aa7..279a3fc3f0 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -57,8 +57,7 @@ "@opensearch-project/opensearch": "^2.2.1", "aws4": "^1.12.0", "elastic-builder": "^2.16.0", - "lodash": "^4.17.21", - "uuid": "^11.0.0" + "lodash": "^4.17.21" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts index a17d6850ab..9c17a46d10 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts @@ -27,7 +27,10 @@ import { import { ElasticSearchSearchEngineIndexer } from './ElasticSearchSearchEngineIndexer'; import { mockServices } from '@backstage/backend-test-utils'; -jest.mock('uuid', () => ({ v4: () => 'tag' })); +jest.mock('node:crypto', () => ({ + ...jest.requireActual('node:crypto'), + randomUUID: () => 'tag', +})); class ElasticSearchSearchEngineForTranslatorTests extends ElasticSearchSearchEngine { getTranslator() { diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index 96c2b99d84..175e82af5a 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -35,7 +35,7 @@ import { ElasticSearchCustomIndexTemplate } from './types'; import { ElasticSearchSearchEngineIndexer } from './ElasticSearchSearchEngineIndexer'; import { MissingIndexError } from '@backstage/plugin-search-backend-node'; import esb from 'elastic-builder'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { AwsCredentialProvider, DefaultAwsCredentialsManager, diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 5d687c87fc..e1ac76534e 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -54,8 +54,7 @@ "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "knex": "^3.0.0", - "lodash": "^4.17.21", - "uuid": "^11.0.0" + "lodash": "^4.17.21" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts index 9c77a04e44..e3da8f28f8 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts @@ -36,7 +36,10 @@ const highlightOptions: PgSearchHighlightOptions = { fragmentDelimiter: ' ... ', }; -jest.mock('uuid', () => ({ v4: () => 'tag' })); +jest.mock('node:crypto', () => ({ + ...jest.requireActual('node:crypto'), + randomUUID: () => 'tag', +})); jest.mock('./PgSearchEngineIndexer', () => ({ PgSearchEngineIndexer: jest diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index ea75b1a739..3e993bcdf8 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -26,7 +26,7 @@ import { DatabaseStore, PgSearchQuery, } from '../database'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { Config } from '@backstage/config'; import { DatabaseService, LoggerService } from '@backstage/backend-plugin-api'; diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts index 7ef48d8398..ac7c72cbfb 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts @@ -22,7 +22,7 @@ import { import { IndexableDocument } from '@backstage/plugin-search-common'; import { PgSearchHighlightOptions } from '../PgSearchEngine'; import { DatabaseDocumentStore } from './DatabaseDocumentStore'; -import { v4 as uuidv4 } from 'uuid'; +import { randomUUID as uuidv4 } from 'node:crypto'; const highlightOptions: PgSearchHighlightOptions = { preTag: '', diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 70c9415050..a9b0c0a9f6 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -61,8 +61,7 @@ "@types/lunr": "^2.3.3", "lodash": "^4.17.21", "lunr": "^2.3.9", - "ndjson": "^2.0.0", - "uuid": "^11.0.0" + "ndjson": "^2.0.0" }, "devDependencies": { "@backstage/backend-defaults": "workspace:^", diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index 1786d07a9d..03e87c7b12 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -22,7 +22,7 @@ import { import { QueryTranslator, SearchEngine } from '../types'; import { MissingIndexError } from '../errors'; import lunr from 'lunr'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { LunrSearchEngineIndexer } from './LunrSearchEngineIndexer'; import { LoggerService } from '@backstage/backend-plugin-api'; diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index c75e03a216..74926da6bd 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -69,7 +69,6 @@ "lodash": "^4.17.21", "qs": "^6.9.4", "react-use": "^17.3.2", - "uuid": "^11.0.2", "zod": "^4.0.0" }, "devDependencies": { diff --git a/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx b/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx index 1d0ce79f75..3e5dc33854 100644 --- a/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx +++ b/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx @@ -16,7 +16,7 @@ import { ReactElement, ChangeEvent, useRef } from 'react'; import { capitalize } from 'lodash'; -import { v4 as uuid } from 'uuid'; + import FormControl from '@material-ui/core/FormControl'; import FormControlLabel from '@material-ui/core/FormControlLabel'; import Checkbox from '@material-ui/core/Checkbox'; @@ -181,7 +181,7 @@ export const SelectFilter = (props: SearchFilterComponentProps) => { defaultValues, valuesDebounceMs, ); - const allOptionValue = useRef(uuid()); + const allOptionValue = useRef(globalThis.crypto.randomUUID()); const allOption = { value: allOptionValue.current, label: t('searchFilter.allOptionTitle'), diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 06ce3bbbee..95a59db530 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -44,7 +44,6 @@ "@backstage/types": "workspace:^", "express": "^4.22.0", "express-promise-router": "^4.1.0", - "uuid": "^11.0.0", "ws": "^8.18.0" }, "devDependencies": { diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index 352d54d628..142278ec84 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -18,7 +18,7 @@ import { EventParams, EventsService } from '@backstage/plugin-events-node'; import { SignalPayload } from '@backstage/plugin-signals-node'; import crypto from 'node:crypto'; import { RawData, WebSocket } from 'ws'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { JsonObject } from '@backstage/types'; import { BackstageUserInfo, diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 262e86de9c..a5dedde0a7 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -58,8 +58,7 @@ "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.4", - "@remixicon/react": "^4.6.0", - "uuid": "^11.0.0" + "@remixicon/react": "^4.6.0" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/signals/src/api/SignalClient.ts b/plugins/signals/src/api/SignalClient.ts index 5a4362fdfd..02d3ba47c7 100644 --- a/plugins/signals/src/api/SignalClient.ts +++ b/plugins/signals/src/api/SignalClient.ts @@ -16,7 +16,6 @@ import { SignalApi, SignalSubscriber } from '@backstage/plugin-signals-react'; import { JsonObject } from '@backstage/types'; import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; -import { v4 as uuid } from 'uuid'; type Subscription = { channel: string; @@ -76,7 +75,7 @@ export class SignalClient implements SignalApi { channel: string, onMessage: (message: TMessage) => void, ): SignalSubscriber { - const subscriptionId = uuid(); + const subscriptionId = globalThis.crypto.randomUUID(); const exists = [...this.subscriptions.values()].find( sub => sub.channel === channel, ); diff --git a/yarn.lock b/yarn.lock index 8e6e449ac4..1f5038975f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2623,7 +2623,6 @@ __metadata: supertest: "npm:^7.0.0" tar: "npm:^7.5.6" triple-beam: "npm:^1.4.1" - uuid: "npm:^11.0.0" wait-for-expect: "npm:^4.0.0" winston: "npm:^3.2.1" winston-transport: "npm:^4.5.0" @@ -2779,7 +2778,6 @@ __metadata: supertest: "npm:^7.0.0" testcontainers: "npm:^11.9.0" text-extensions: "npm:^2.4.0" - uuid: "npm:^11.0.0" yn: "npm:^4.0.0" zod: "npm:^3.25.76 || ^4.0.0" zod-to-json-schema: "npm:^3.25.1" @@ -4340,7 +4338,6 @@ __metadata: jose: "npm:^5.0.0" msw: "npm:^2.0.0" node-mocks-http: "npm:^1.0.0" - uuid: "npm:^11.0.0" zod: "npm:^3.25.76 || ^4.0.0" languageName: unknown linkType: soft @@ -4652,7 +4649,6 @@ __metadata: msw: "npm:^1.0.0" passport: "npm:^0.7.0" supertest: "npm:^7.0.0" - uuid: "npm:^11.0.0" zod: "npm:^3.25.76 || ^4.0.0" zod-validation-error: "npm:^5.0.0" languageName: unknown @@ -4681,7 +4677,6 @@ __metadata: msw: "npm:^1.0.0" passport: "npm:^0.7.0" supertest: "npm:^7.0.0" - uuid: "npm:^11.0.0" zod: "npm:^3.25.76 || ^4.0.0" zod-to-json-schema: "npm:^3.25.1" zod-validation-error: "npm:^4.0.2" @@ -4789,7 +4784,6 @@ __metadata: aws-sdk-client-mock: "npm:^4.0.0" aws-sdk-client-mock-jest: "npm:^4.0.0" p-limit: "npm:^3.0.2" - uuid: "npm:^11.0.0" yaml: "npm:^2.0.0" languageName: unknown linkType: soft @@ -4810,7 +4804,6 @@ __metadata: "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-events-node": "workspace:^" msw: "npm:^1.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -4829,7 +4822,6 @@ __metadata: lodash: "npm:^4.17.21" openapi-merge: "npm:^1.3.2" openapi3-ts: "npm:^3.1.2" - uuid: "npm:^11.0.0" yaml: "npm:^2.7.0" languageName: unknown linkType: soft @@ -4851,7 +4843,6 @@ __metadata: "@backstage/plugin-events-backend-test-utils": "workspace:^" "@backstage/plugin-events-node": "workspace:^" msw: "npm:^1.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -4871,7 +4862,6 @@ __metadata: "@backstage/plugin-events-backend-test-utils": "workspace:^" "@backstage/plugin-events-node": "workspace:^" msw: "npm:^1.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -4906,7 +4896,6 @@ __metadata: fs-extra: "npm:^11.2.0" msw: "npm:^1.0.0" p-limit: "npm:^3.1.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -4923,7 +4912,6 @@ __metadata: "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" p-limit: "npm:^3.0.2" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -4974,7 +4962,6 @@ __metadata: minimatch: "npm:^10.2.1" msw: "npm:^2.0.0" octokit: "npm:^3.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -5012,7 +4999,6 @@ __metadata: "@types/lodash": "npm:^4.14.151" lodash: "npm:^4.17.21" msw: "npm:^1.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -5036,7 +5022,6 @@ __metadata: express-promise-router: "npm:^4.1.0" knex: "npm:^3.0.0" luxon: "npm:^3.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -5055,7 +5040,6 @@ __metadata: "@types/lodash": "npm:^4.14.151" ldapts: "npm:^8.0.6" lodash: "npm:^4.17.21" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -5090,7 +5074,6 @@ __metadata: msw: "npm:^1.0.0" p-limit: "npm:^3.0.2" qs: "npm:^6.9.4" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -5127,7 +5110,6 @@ __metadata: "@types/lodash": "npm:^4.14.151" lodash: "npm:^4.17.21" msw: "npm:^1.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -5211,7 +5193,6 @@ __metadata: p-limit: "npm:^3.0.2" prom-client: "npm:^15.0.0" supertest: "npm:^7.0.0" - uuid: "npm:^11.0.0" wait-for-expect: "npm:^4.0.0" winston: "npm:^3.13.0" yaml: "npm:^2.0.0" @@ -6279,7 +6260,6 @@ __metadata: knex: "npm:^3.0.0" p-throttle: "npm:^4.1.1" supertest: "npm:^7.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -6480,7 +6460,6 @@ __metadata: "@backstage/types": "workspace:^" cross-fetch: "npm:^4.0.0" msw: "npm:^1.0.0" - uuid: "npm:^11.0.0" zod: "npm:^3.25.76 || ^4.0.0" zod-to-json-schema: "npm:^3.25.1" languageName: unknown @@ -6876,7 +6855,6 @@ __metadata: strip-ansi: "npm:^7.1.0" supertest: "npm:^7.0.0" triple-beam: "npm:^1.4.1" - uuid: "npm:^11.0.0" wait-for-expect: "npm:^4.0.0" winston: "npm:^3.2.1" winston-transport: "npm:^4.7.0" @@ -7165,7 +7143,6 @@ __metadata: aws4: "npm:^1.12.0" elastic-builder: "npm:^2.16.0" lodash: "npm:^4.17.21" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -7196,7 +7173,6 @@ __metadata: "@backstage/plugin-search-common": "workspace:^" knex: "npm:^3.0.0" lodash: "npm:^4.17.21" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -7254,7 +7230,6 @@ __metadata: lodash: "npm:^4.17.21" lunr: "npm:^2.3.9" ndjson: "npm:^2.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -7326,7 +7301,6 @@ __metadata: react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.30.2" react-use: "npm:^17.3.2" - uuid: "npm:^11.0.2" zod: "npm:^4.0.0" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -7403,7 +7377,6 @@ __metadata: express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" supertest: "npm:^7.0.0" - uuid: "npm:^11.0.0" ws: "npm:^8.18.0" languageName: unknown linkType: soft @@ -7468,7 +7441,6 @@ __metadata: react: "npm:^18.0.2" react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.30.2" - uuid: "npm:^11.0.0" wait-for-expect: "npm:^4.0.0" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -10076,7 +10048,6 @@ __metadata: express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" supertest: "npm:^7.0.0" - uuid: "npm:^11.0.0" languageName: unknown linkType: soft @@ -47882,7 +47853,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^11.0.0, uuid@npm:^11.0.2, uuid@npm:^11.0.3": +"uuid@npm:^11.0.3": version: 11.1.0 resolution: "uuid@npm:11.1.0" bin: