diff --git a/backend/package-lock.json b/backend/package-lock.json index 5403fb59..716b4168 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -31,7 +31,7 @@ "socket.io": "^4.8.3", "swagger-jsdoc": "6.2.8", "swagger-ui-express": "5.0.1", - "uuid": "^10.0.0", + "uuid": "^14.0.2", "zod": "^3.25.76" }, "devDependencies": { @@ -8623,17 +8623,16 @@ } }, "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", + "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/v8-to-istanbul": { diff --git a/backend/package.json b/backend/package.json index 6f33a1fa..2f7daa53 100644 --- a/backend/package.json +++ b/backend/package.json @@ -38,7 +38,7 @@ "socket.io": "^4.8.3", "swagger-jsdoc": "6.2.8", "swagger-ui-express": "5.0.1", - "uuid": "^10.0.0", + "uuid": "^14.0.2", "zod": "^3.25.76" }, "devDependencies": { diff --git a/backend/src/eventSourcing/commandBus.js b/backend/src/eventSourcing/commandBus.js index 6c13aaa0..2e23413b 100644 --- a/backend/src/eventSourcing/commandBus.js +++ b/backend/src/eventSourcing/commandBus.js @@ -1,6 +1,6 @@ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { ProjectAggregate, DonorAggregate, MatchAggregate, JobAggregate, round7 } = require("./aggregates"); const { eventStore } = require("./eventStore"); diff --git a/backend/src/eventSourcing/commands.js b/backend/src/eventSourcing/commands.js index 5751c3dc..87cefd8b 100644 --- a/backend/src/eventSourcing/commands.js +++ b/backend/src/eventSourcing/commands.js @@ -1,6 +1,6 @@ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { xlmToStroops, stroopsToXlm } = require("../utils/xlm"); const { isValidStellarAddress } = require("../../../shared/validators/stellarValidator"); diff --git a/backend/src/eventSourcing/events.js b/backend/src/eventSourcing/events.js index 0ae3c169..ad942c2c 100644 --- a/backend/src/eventSourcing/events.js +++ b/backend/src/eventSourcing/events.js @@ -1,6 +1,6 @@ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { getCorrelationId } = require("../utils/logger"); const { xlmToStroops, stroopsToXlm } = require("../utils/xlm"); diff --git a/backend/src/eventSourcing/migrate.js b/backend/src/eventSourcing/migrate.js index 8708b022..706ed388 100644 --- a/backend/src/eventSourcing/migrate.js +++ b/backend/src/eventSourcing/migrate.js @@ -1,7 +1,7 @@ "use strict"; const pool = require("../db/pool"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { LEGACY_DONATION_MIGRATED, MigratedDonationEvent, diff --git a/backend/src/middleware/correlationId.js b/backend/src/middleware/correlationId.js index 17ec5696..0f25b47d 100644 --- a/backend/src/middleware/correlationId.js +++ b/backend/src/middleware/correlationId.js @@ -35,7 +35,7 @@ */ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { runWithCorrelationId } = require("../utils/logger"); /** Maximum character length accepted from the X-Correlation-ID header. */ diff --git a/backend/src/middleware/correlationId.test.js b/backend/src/middleware/correlationId.test.js index 7435401c..db60f917 100644 --- a/backend/src/middleware/correlationId.test.js +++ b/backend/src/middleware/correlationId.test.js @@ -3,7 +3,7 @@ */ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { correlationIdMiddleware, sanitiseCorrelationId, diff --git a/backend/src/routes/donations.js b/backend/src/routes/donations.js index e7b2fc04..a9581fb3 100644 --- a/backend/src/routes/donations.js +++ b/backend/src/routes/donations.js @@ -4,7 +4,7 @@ "use strict"; const express = require("express"); const router = express.Router(); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { createLayeredRateLimiter } = require("../middleware/rateLimiter"); const { createApiError } = require("../middleware/apiEnvelope"); diff --git a/backend/src/routes/impact.js b/backend/src/routes/impact.js index 55511aec..95abb375 100644 --- a/backend/src/routes/impact.js +++ b/backend/src/routes/impact.js @@ -8,7 +8,7 @@ "use strict"; const express = require("express"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const router = express.Router(); const pool = require("../db/pool"); const cache = require("../services/cache"); diff --git a/backend/src/routes/integrity.js b/backend/src/routes/integrity.js index b1e59268..d69e44a2 100644 --- a/backend/src/routes/integrity.js +++ b/backend/src/routes/integrity.js @@ -2,7 +2,7 @@ const crypto = require("crypto"); const express = require("express"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const cache = require("../services/cache"); const { adminRequired } = require("../middleware/auth"); diff --git a/backend/src/routes/leaderboard.integration.test.js b/backend/src/routes/leaderboard.integration.test.js index 645966d8..f96ccaa6 100644 --- a/backend/src/routes/leaderboard.integration.test.js +++ b/backend/src/routes/leaderboard.integration.test.js @@ -18,7 +18,7 @@ const path = require("path"); const express = require("express"); const request = require("supertest"); const { execFileSync } = require("child_process"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { createHash } = require("crypto"); const pool = require("../db/pool"); diff --git a/backend/src/routes/notifications.js b/backend/src/routes/notifications.js index d7724b3d..8473a12b 100644 --- a/backend/src/routes/notifications.js +++ b/backend/src/routes/notifications.js @@ -10,7 +10,7 @@ "use strict"; const express = require("express"); const router = express.Router(); -const { v4: uuidv4 } = require("uuid"); +const { randomUUID: uuidv4 } = require("crypto"); const pool = require("../db/pool"); const { createLayeredRateLimiter } = require("../middleware/rateLimiter"); const { createApiError } = require("../middleware/apiEnvelope"); diff --git a/backend/src/routes/pagination.integration.test.js b/backend/src/routes/pagination.integration.test.js index 6999453b..cd788fac 100644 --- a/backend/src/routes/pagination.integration.test.js +++ b/backend/src/routes/pagination.integration.test.js @@ -15,7 +15,7 @@ const path = require("path"); const express = require("express"); const request = require("supertest"); const { execFileSync } = require("child_process"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { apiEnvelope, errorHandler } = require("../middleware/apiEnvelope"); diff --git a/backend/src/routes/projects.js b/backend/src/routes/projects.js index 205b2152..b031496e 100644 --- a/backend/src/routes/projects.js +++ b/backend/src/routes/projects.js @@ -5,7 +5,7 @@ const express = require("express"); const crypto = require("crypto"); const router = express.Router(); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { adminRequired } = require("../middleware/auth"); const { createLayeredRateLimiter } = require("../middleware/rateLimiter"); diff --git a/backend/src/routes/ratings.js b/backend/src/routes/ratings.js index 1599a728..06f4b71b 100644 --- a/backend/src/routes/ratings.js +++ b/backend/src/routes/ratings.js @@ -4,7 +4,7 @@ "use strict"; const express = require("express"); const router = express.Router(); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { mapProjectRatingRow } = require("../services/store"); const { createApiError } = require("../middleware/apiEnvelope"); diff --git a/backend/src/routes/subscriptions.js b/backend/src/routes/subscriptions.js index b9a85996..889b02cc 100644 --- a/backend/src/routes/subscriptions.js +++ b/backend/src/routes/subscriptions.js @@ -18,7 +18,7 @@ "use strict"; const express = require("express"); const router = express.Router(); -const { v4: uuidv4 } = require("uuid"); +const { randomUUID: uuidv4 } = require("crypto"); const pool = require("../db/pool"); const { createRateLimiter } = require("../middleware/rateLimiter"); const { createApiError } = require("../middleware/apiEnvelope"); diff --git a/backend/src/routes/updates.js b/backend/src/routes/updates.js index f71d5d71..ceca9d08 100644 --- a/backend/src/routes/updates.js +++ b/backend/src/routes/updates.js @@ -8,7 +8,7 @@ "use strict"; const express = require("express"); -const { v4: uuidv4 } = require("uuid"); +const { randomUUID: uuidv4 } = require("crypto"); const pool = require("../db/pool"); const { adminRequired } = require("../middleware/auth"); const { createApiError } = require("../middleware/apiEnvelope"); diff --git a/backend/src/services/audit.js b/backend/src/services/audit.js index aa8a5a9b..e572e600 100644 --- a/backend/src/services/audit.js +++ b/backend/src/services/audit.js @@ -1,6 +1,6 @@ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); async function logAdminAction({ actor, action, targetType, targetId, metadata, ipAddress }) { diff --git a/backend/src/services/donationIntegrity.integration.test.js b/backend/src/services/donationIntegrity.integration.test.js index 8320cfd7..4b862776 100644 --- a/backend/src/services/donationIntegrity.integration.test.js +++ b/backend/src/services/donationIntegrity.integration.test.js @@ -5,7 +5,7 @@ const path = require("path"); const { createHash } = require("crypto"); const { execFileSync } = require("child_process"); const { Keypair } = require("@stellar/stellar-sdk"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const express = require("express"); const request = require("supertest"); const pool = require("../db/pool"); diff --git a/backend/src/services/donationIntegrity.js b/backend/src/services/donationIntegrity.js index a36b0ae8..7b3cb096 100644 --- a/backend/src/services/donationIntegrity.js +++ b/backend/src/services/donationIntegrity.js @@ -1,6 +1,6 @@ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { Keypair } = require("@stellar/stellar-sdk"); const { stroopsToXlm } = require("../utils/xlm"); diff --git a/backend/src/services/indexerService.integration.test.js b/backend/src/services/indexerService.integration.test.js index 0e672ccf..853d787f 100644 --- a/backend/src/services/indexerService.integration.test.js +++ b/backend/src/services/indexerService.integration.test.js @@ -16,7 +16,7 @@ const fs = require("fs"); const path = require("path"); const { createHash } = require("crypto"); const { execFileSync } = require("child_process"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const indexerService = require("./indexerService"); diff --git a/backend/src/services/indexerService.js b/backend/src/services/indexerService.js index 7bf6824e..449bb0e9 100644 --- a/backend/src/services/indexerService.js +++ b/backend/src/services/indexerService.js @@ -5,7 +5,7 @@ const { server: stellarServer, rpcServer, CONTRACT_ID } = require("./stellar"); const pool = require("../db/pool"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const { execute } = require("../eventSourcing/commandBus"); const { DonationRecordedEvent, MatchAppliedEvent } = require("../eventSourcing/events"); const { stroopsToXlm, xlmToStroops } = require("../utils/xlm"); diff --git a/backend/src/services/notificationFailures.js b/backend/src/services/notificationFailures.js index 14fcfb3b..724d8131 100644 --- a/backend/src/services/notificationFailures.js +++ b/backend/src/services/notificationFailures.js @@ -8,7 +8,7 @@ */ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../db/pool"); const { logger: rootLogger } = require("../utils/logger"); diff --git a/backend/src/services/onboarding/accountUpgrade.js b/backend/src/services/onboarding/accountUpgrade.js index f30cb4fb..bf477d91 100644 --- a/backend/src/services/onboarding/accountUpgrade.js +++ b/backend/src/services/onboarding/accountUpgrade.js @@ -31,7 +31,7 @@ const crypto = require("crypto"); const { Keypair, Networks, StrKey, Transaction } = require("@stellar/stellar-sdk"); const { env } = require("../../config/env"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../../db/pool"); const { logger: rootLogger } = require("../../utils/logger"); diff --git a/backend/src/services/onboarding/funnel.js b/backend/src/services/onboarding/funnel.js index 7796c686..5af9f69c 100644 --- a/backend/src/services/onboarding/funnel.js +++ b/backend/src/services/onboarding/funnel.js @@ -21,7 +21,7 @@ */ "use strict"; -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../../db/pool"); const { logger: rootLogger } = require("../../utils/logger"); diff --git a/backend/src/services/onboarding/sponsoredAccounts.js b/backend/src/services/onboarding/sponsoredAccounts.js index 54bcd5f8..03256d96 100644 --- a/backend/src/services/onboarding/sponsoredAccounts.js +++ b/backend/src/services/onboarding/sponsoredAccounts.js @@ -45,7 +45,7 @@ const { BASE_FEE, } = require("@stellar/stellar-sdk"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const pool = require("../../db/pool"); const { env } = require("../../config/env"); const { logger: rootLogger } = require("../../utils/logger"); diff --git a/backend/src/services/projectSearch.integration.test.js b/backend/src/services/projectSearch.integration.test.js index 8ee88a6b..45845d88 100644 --- a/backend/src/services/projectSearch.integration.test.js +++ b/backend/src/services/projectSearch.integration.test.js @@ -12,12 +12,23 @@ const path = require("path"); const express = require("express"); const request = require("supertest"); const { execFileSync } = require("child_process"); -const { v4: uuid, v5: uuidv5 } = require("uuid"); +const crypto = require("crypto"); +const { randomUUID: uuid } = crypto; const FIXTURE_NAMESPACE = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"; +// RFC 4122 UUID v5 (namespace + name, SHA-1 based) — deterministic fixture ids. +// Reimplemented here because the removal of the `uuid` package dependency +// left no CommonJS-compatible v5 generator; crypto.randomUUID() only covers v4. function fixtureId(key) { - return uuidv5(key, FIXTURE_NAMESPACE); + const namespaceBytes = Buffer.from(FIXTURE_NAMESPACE.replace(/-/g, ""), "hex"); + const nameBytes = Buffer.from(key, "utf8"); + const hash = crypto.createHash("sha1").update(Buffer.concat([namespaceBytes, nameBytes])).digest(); + const bytes = Buffer.from(hash.subarray(0, 16)); + bytes[6] = (bytes[6] & 0x0f) | 0x50; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + const hex = bytes.toString("hex"); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; } const pool = require("../db/pool"); diff --git a/backend/src/services/summaryQueue.js b/backend/src/services/summaryQueue.js index c0683c82..fe490600 100644 --- a/backend/src/services/summaryQueue.js +++ b/backend/src/services/summaryQueue.js @@ -7,7 +7,7 @@ "use strict"; const crypto = require("crypto"); -const { v4: uuid } = require("uuid"); +const { randomUUID: uuid } = require("crypto"); const PgBoss = require("pg-boss"); const pool = require("../db/pool"); const { env } = require("../config/env"); diff --git a/backend/src/services/turrets.js b/backend/src/services/turrets.js index 072b78a7..97dea74f 100644 --- a/backend/src/services/turrets.js +++ b/backend/src/services/turrets.js @@ -29,7 +29,7 @@ */ const { Server, TransactionBuilder, Networks, Memo, Operation, Asset } = require("@stellar/stellar-sdk"); -const { v4: uuidv4 } = require("uuid"); +const { randomUUID: uuidv4 } = require("crypto"); const pool = require("../db/pool"); const { env } = require("../config/env"); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..771c9315 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "GreenPay", + "lockfileVersion": 3, + "requires": true, + "packages": {} +}