From 67e37a8d0e9e5a4ff3f99944f4c24355fb94f172 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Tue, 21 Apr 2026 12:05:58 +0100 Subject: [PATCH 01/12] chore: rename utilities to utils --- .../installation/github.controller.ts | 4 +-- .../installation/index.controller.ts | 4 +-- .../installation/team.controller.ts | 4 +-- api/controllers/internal/index.controller.ts | 6 ++-- api/controllers/task/activities.controller.ts | 4 +-- .../task/contributor.controller.ts | 4 +-- api/controllers/task/index.controller.ts | 4 +-- .../task/installation.controller.ts | 4 +-- api/controllers/task/{taskId}.controller.ts | 4 +-- api/controllers/user/index.controller.ts | 22 ++++++------- api/controllers/user/sumsub.controller.ts | 4 +-- api/controllers/wallet/index.controller.ts | 4 +-- .../wallet/transactions.controller.ts | 4 +-- api/controllers/webhook/github.controller.ts | 4 +-- api/controllers/webhook/sumsub.controller.ts | 4 +-- api/index.ts | 2 +- api/middlewares/auth.middleware.ts | 4 +-- api/middlewares/error.middleware.ts | 4 +-- api/middlewares/rate-limit.middleware.ts | 2 +- api/middlewares/request.middleware.ts | 4 +-- api/middlewares/webhook.middleware.ts | 4 +-- api/models/error.model.ts | 4 +-- api/routes/_test_/general.test.route.ts | 4 +-- api/routes/_test_/octokit.test.route.ts | 4 +-- api/routes/agent.route.ts | 4 +-- api/routes/installation.route.ts | 2 +- api/routes/internal.route.ts | 2 +- api/routes/task.route.ts | 2 +- api/routes/user.route.ts | 2 +- api/routes/wallet.route.ts | 32 +++++++++---------- api/routes/webhook.route.ts | 2 +- api/services/cloud-tasks.service.ts | 16 +++++----- .../installation-webhook.service.ts | 4 +-- ...stallation_repositories-webhook.service.ts | 4 +-- .../issue_comment-webhook.service.ts | 14 ++++---- .../pull_request-webhook.service.ts | 4 +-- .../github-webhook/push-webhook.service.ts | 4 +-- api/services/octokit.service.ts | 2 +- api/services/socket.service.ts | 12 +++---- api/{utilities => utils}/data.ts | 0 api/{utilities => utils}/helper.ts | 0 tests/helpers/test-utils.ts | 2 +- .../api/installation/github.api.test.ts | 2 +- .../api/installation/index.api.test.ts | 2 +- .../api/installation/team.api.test.ts | 2 +- .../api/internal/index.api.test.ts | 4 +-- .../api/task/activities.api.test.ts | 2 +- .../api/task/contributor.api.test.ts | 2 +- tests/integration/api/task/index.api.test.ts | 2 +- .../api/task/installation.api.test.ts | 2 +- .../integration/api/task/{taskId}.api.test.ts | 2 +- tests/integration/api/user/index.api.test.ts | 2 +- tests/integration/api/user/sumsub.api.test.ts | 2 +- .../integration/api/wallet/index.api.test.ts | 2 +- .../api/wallet/transactions.api.test.ts | 2 +- .../api/webhook/github.api.test.ts | 2 +- .../api/webhook/sumsub.api.test.ts | 2 +- .../middlewares/auth.middleware.test.ts | 2 +- .../middlewares/error.middleware.test.ts | 2 +- .../middlewares/rate-limit.middleware.test.ts | 2 +- .../middlewares/request.middleware.test.ts | 2 +- .../middlewares/webhook.middleware.test.ts | 2 +- tests/unit/helper.test.ts | 2 +- 63 files changed, 132 insertions(+), 132 deletions(-) rename api/{utilities => utils}/data.ts (100%) rename api/{utilities => utils}/helper.ts (100%) diff --git a/api/controllers/installation/github.controller.ts b/api/controllers/installation/github.controller.ts index c5f075d..9538261 100644 --- a/api/controllers/installation/github.controller.ts +++ b/api/controllers/installation/github.controller.ts @@ -1,8 +1,8 @@ import { Request, Response, NextFunction } from "express"; import { OctokitService } from "../../services/octokit.service.js"; import { IssueFilters } from "../../models/github.model.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; /** * Retrieves repositories accessible by a specific GitHub App installation. diff --git a/api/controllers/installation/index.controller.ts b/api/controllers/installation/index.controller.ts index f87a970..db81f96 100644 --- a/api/controllers/installation/index.controller.ts +++ b/api/controllers/installation/index.controller.ts @@ -1,8 +1,8 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; import { stellarService } from "../../services/stellar.service.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { OctokitService } from "../../services/octokit.service.js"; import { NotFoundError, ValidationError } from "../../models/error.model.js"; import { ContractService } from "../../services/contract.service.js"; diff --git a/api/controllers/installation/team.controller.ts b/api/controllers/installation/team.controller.ts index 3687754..9b9368e 100644 --- a/api/controllers/installation/team.controller.ts +++ b/api/controllers/installation/team.controller.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { AuthorizationError, NotFoundError } from "../../models/error.model.js"; import { OctokitService } from "../../services/octokit.service.js"; diff --git a/api/controllers/internal/index.controller.ts b/api/controllers/internal/index.controller.ts index a8b6a73..8ffe1c5 100644 --- a/api/controllers/internal/index.controller.ts +++ b/api/controllers/internal/index.controller.ts @@ -1,8 +1,8 @@ import { Request, Response, NextFunction } from "express"; import { statsigService } from "../../services/statsig.service.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { dataLogger } from "../../config/logger.config.js"; -import { responseWrapper, stellarTimestampToDate } from "../../utilities/helper.js"; +import { responseWrapper, stellarTimestampToDate } from "../../utils/helper.js"; import { prisma } from "../../config/database.config.js"; import { KMSService } from "../../services/kms.service.js"; import { ContractService } from "../../services/contract.service.js"; @@ -86,7 +86,7 @@ export const handleBountyPayoutJob = async (req: Request, res: Response, next: N // Decrypt installation wallet secret const decryptedWalletSecret = await KMSService.decryptWallet(relatedTask.installation.wallet); - + // Approve completion via smart contract const transactionResponse = await ContractService.approveCompletion( decryptedWalletSecret, diff --git a/api/controllers/task/activities.controller.ts b/api/controllers/task/activities.controller.ts index 87f3dc0..7ab0ce9 100644 --- a/api/controllers/task/activities.controller.ts +++ b/api/controllers/task/activities.controller.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { NotFoundError } from "../../models/error.model.js"; /** diff --git a/api/controllers/task/contributor.controller.ts b/api/controllers/task/contributor.controller.ts index 1875a4f..e4963a8 100644 --- a/api/controllers/task/contributor.controller.ts +++ b/api/controllers/task/contributor.controller.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { FilterTasks } from "../../models/task.model.js"; import { Prisma, TaskStatus } from "../../../prisma_client/index.js"; import { NotFoundError } from "../../models/error.model.js"; diff --git a/api/controllers/task/index.controller.ts b/api/controllers/task/index.controller.ts index cc5600f..04f6391 100644 --- a/api/controllers/task/index.controller.ts +++ b/api/controllers/task/index.controller.ts @@ -1,8 +1,8 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; import { stellarService } from "../../services/stellar.service.js"; -import { responseWrapper, stellarTimestampToDate } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper, stellarTimestampToDate } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { CreateTask, TaskIssue, FilterTasks } from "../../models/task.model.js"; import { HorizonApi } from "../../models/horizonapi.model.js"; import { Prisma, TaskStatus, TransactionCategory } from "../../../prisma_client/index.js"; diff --git a/api/controllers/task/installation.controller.ts b/api/controllers/task/installation.controller.ts index 7ef32b5..42864e9 100644 --- a/api/controllers/task/installation.controller.ts +++ b/api/controllers/task/installation.controller.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { FilterTasks } from "../../models/task.model.js"; import { Prisma, TaskStatus } from "../../../prisma_client/index.js"; import { NotFoundError } from "../../models/error.model.js"; diff --git a/api/controllers/task/{taskId}.controller.ts b/api/controllers/task/{taskId}.controller.ts index 0937e34..5142aaf 100644 --- a/api/controllers/task/{taskId}.controller.ts +++ b/api/controllers/task/{taskId}.controller.ts @@ -2,8 +2,8 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; import { FirebaseService } from "../../services/firebase.service.js"; import { stellarService } from "../../services/stellar.service.js"; -import { responseWrapper, stellarTimestampToDate } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper, stellarTimestampToDate } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { MessageType, TaskIssue } from "../../models/task.model.js"; import { HorizonApi } from "../../models/horizonapi.model.js"; import { TaskStatus, TransactionCategory } from "../../../prisma_client/index.js"; diff --git a/api/controllers/user/index.controller.ts b/api/controllers/user/index.controller.ts index 30972d7..d7e5a01 100644 --- a/api/controllers/user/index.controller.ts +++ b/api/controllers/user/index.controller.ts @@ -2,8 +2,8 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; import { InputJsonValue } from "@prisma/client/runtime/library"; import { stellarService } from "../../services/stellar.service.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { NotFoundError, ValidationError } from "../../models/error.model.js"; import { dataLogger } from "../../config/logger.config.js"; import { Prisma } from "../../../prisma_client/index.js"; @@ -316,10 +316,10 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = statsigUser, "wallet_creation_failed", undefined, - { - error: error instanceof Error ? error.message : "Unknown error", - operation: "get_user", - githubUsername: user.username + { + error: error instanceof Error ? error.message : "Unknown error", + operation: "get_user", + githubUsername: user.username } ); @@ -355,13 +355,13 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = statsigUser, "usdc_trustline_failed", undefined, - { - error: error instanceof Error ? error.message : "Unknown error", - operation: "get_user", - githubUsername: user.username + { + error: error instanceof Error ? error.message : "Unknown error", + operation: "get_user", + githubUsername: user.username } ); - + // Log and return user info and notify user USDC trustline addition failed dataLogger.warn("Failed to add USDC trustline", { error }); return responseWrapper({ diff --git a/api/controllers/user/sumsub.controller.ts b/api/controllers/user/sumsub.controller.ts index cbd78e5..7c94359 100644 --- a/api/controllers/user/sumsub.controller.ts +++ b/api/controllers/user/sumsub.controller.ts @@ -1,8 +1,8 @@ import { Request, Response, NextFunction } from "express"; import axios from "axios"; import crypto from "crypto-js"; -import { STATUS_CODES } from "../../utilities/data.js"; -import { responseWrapper } from "../../utilities/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; +import { responseWrapper } from "../../utils/helper.js"; import { ErrorClass } from "../../models/error.model.js"; import { statsigService } from "../../services/statsig.service.js"; diff --git a/api/controllers/wallet/index.controller.ts b/api/controllers/wallet/index.controller.ts index 0356eae..bc41d1a 100644 --- a/api/controllers/wallet/index.controller.ts +++ b/api/controllers/wallet/index.controller.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { HorizonApi } from "../../models/horizonapi.model.js"; import { TransactionCategory } from "../../../prisma_client/index.js"; import { usdcAssetId, xlmAssetId } from "../../config/stellar.config.js"; diff --git a/api/controllers/wallet/transactions.controller.ts b/api/controllers/wallet/transactions.controller.ts index 3998554..9162221 100644 --- a/api/controllers/wallet/transactions.controller.ts +++ b/api/controllers/wallet/transactions.controller.ts @@ -1,7 +1,7 @@ import { NextFunction, Request, Response } from "express"; import { prisma } from "../../config/database.config.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { HorizonApi } from "../../models/horizonapi.model.js"; import { Prisma, TransactionCategory } from "../../../prisma_client/index.js"; import { stellarService } from "../../services/stellar.service.js"; diff --git a/api/controllers/webhook/github.controller.ts b/api/controllers/webhook/github.controller.ts index 2f09a9f..ae0789c 100644 --- a/api/controllers/webhook/github.controller.ts +++ b/api/controllers/webhook/github.controller.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { dataLogger } from "../../config/logger.config.js"; import { PullRequestWebhookService } from "../../services/github-webhook/pull_request-webhook.service.js"; import { InstallationWebhookService } from "../../services/github-webhook/installation-webhook.service.js"; diff --git a/api/controllers/webhook/sumsub.controller.ts b/api/controllers/webhook/sumsub.controller.ts index 153ae42..93bf614 100644 --- a/api/controllers/webhook/sumsub.controller.ts +++ b/api/controllers/webhook/sumsub.controller.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; -import { STATUS_CODES } from "../../utilities/data.js"; -import { responseWrapper } from "../../utilities/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; +import { responseWrapper } from "../../utils/helper.js"; import { prisma } from "../../config/database.config.js"; import { dataLogger } from "../../config/logger.config.js"; import { statsigService } from "../../services/statsig.service.js"; diff --git a/api/index.ts b/api/index.ts index 30811c0..732b226 100644 --- a/api/index.ts +++ b/api/index.ts @@ -27,7 +27,7 @@ import { } from "./routes/index.js"; import { ErrorHandlerService } from "./services/error-handler.service.js"; import { dataLogger, messageLogger } from "./config/logger.config.js"; -import { ALLOWED_ORIGINS, ENDPOINTS, STATUS_CODES } from "./utilities/data.js"; +import { ALLOWED_ORIGINS, ENDPOINTS, STATUS_CODES } from "./utils/data.js"; import { ErrorClass } from "./models/error.model.js"; import { statsigService } from "./services/statsig.service.js"; import { SocketService } from "./services/socket.service.js"; diff --git a/api/middlewares/auth.middleware.ts b/api/middlewares/auth.middleware.ts index 924db55..59f2a19 100644 --- a/api/middlewares/auth.middleware.ts +++ b/api/middlewares/auth.middleware.ts @@ -1,8 +1,8 @@ import { prisma } from "../config/database.config.js"; import { firebaseAdmin } from "../config/firebase.config.js"; import { OAuth2Client } from "google-auth-library"; -import { STATUS_CODES } from "../utilities/data.js"; -import { getFieldFromUnknownObject } from "../utilities/helper.js"; +import { STATUS_CODES } from "../utils/data.js"; +import { getFieldFromUnknownObject } from "../utils/helper.js"; import { Request, Response, NextFunction } from "express"; import { AuthorizationError, ErrorClass, ValidationError } from "../models/error.model.js"; import { dataLogger } from "../config/logger.config.js"; diff --git a/api/middlewares/error.middleware.ts b/api/middlewares/error.middleware.ts index ff95796..b047af0 100644 --- a/api/middlewares/error.middleware.ts +++ b/api/middlewares/error.middleware.ts @@ -1,7 +1,7 @@ import { ErrorClass, ErrorUtils } from "../models/error.model.js"; import { Request, Response, ErrorRequestHandler, NextFunction } from "express"; -import { STATUS_CODES } from "../utilities/data.js"; -import { getFieldFromUnknownObject } from "../utilities/helper.js"; +import { STATUS_CODES } from "../utils/data.js"; +import { getFieldFromUnknownObject } from "../utils/helper.js"; import { dataLogger } from "../config/logger.config.js"; import { Prisma } from "../../prisma_client/index.js"; diff --git a/api/middlewares/rate-limit.middleware.ts b/api/middlewares/rate-limit.middleware.ts index 12f2dd1..6bafaba 100644 --- a/api/middlewares/rate-limit.middleware.ts +++ b/api/middlewares/rate-limit.middleware.ts @@ -1,5 +1,5 @@ import rateLimit from "express-rate-limit"; -import { STATUS_CODES, ENDPOINTS } from "../utilities/data.js"; +import { STATUS_CODES, ENDPOINTS } from "../utils/data.js"; import { messageLogger } from "../config/logger.config.js"; /** diff --git a/api/middlewares/request.middleware.ts b/api/middlewares/request.middleware.ts index 7c98451..88270bb 100644 --- a/api/middlewares/request.middleware.ts +++ b/api/middlewares/request.middleware.ts @@ -1,9 +1,9 @@ import { Request, Response, NextFunction } from "express"; -import { STATUS_CODES } from "../utilities/data.js"; +import { STATUS_CODES } from "../utils/data.js"; import * as z from "zod"; import { ValidationError } from "../models/error.model.js"; import { dataLogger } from "../config/logger.config.js"; -import { responseWrapper } from "../utilities/helper.js"; +import { responseWrapper } from "../utils/helper.js"; /** * Middleware to prevent caching on dynamic routes diff --git a/api/middlewares/webhook.middleware.ts b/api/middlewares/webhook.middleware.ts index 13df60e..a14bb3f 100644 --- a/api/middlewares/webhook.middleware.ts +++ b/api/middlewares/webhook.middleware.ts @@ -2,9 +2,9 @@ import { Request, Response, NextFunction } from "express"; import crypto from "crypto"; import { GitHubWebhookError, SumsubWebhookError } from "../models/error.model.js"; import { OctokitService } from "../services/octokit.service.js"; -import { STATUS_CODES } from "../utilities/data.js"; +import { STATUS_CODES } from "../utils/data.js"; import { dataLogger } from "../config/logger.config.js"; -import { responseWrapper } from "../utilities/helper.js"; +import { responseWrapper } from "../utils/helper.js"; /** * Middleware to validate GitHub webhook signatures diff --git a/api/models/error.model.ts b/api/models/error.model.ts index 0211972..86a8e35 100644 --- a/api/models/error.model.ts +++ b/api/models/error.model.ts @@ -1,4 +1,4 @@ -import { STATUS_CODES } from "../utilities/data.js"; +import { STATUS_CODES } from "../utils/data.js"; /** * Base error class for general api errors @@ -225,7 +225,7 @@ export class GitHubAPIError extends ErrorClass { /** * Voyage API related errors */ -export class VoyageAPIError extends ErrorClass { +export class VoyageAPIError extends ErrorClass { constructor(message: string, details?: unknown) { super( "VOYAGE_API_ERROR", diff --git a/api/routes/_test_/general.test.route.ts b/api/routes/_test_/general.test.route.ts index 148fd19..68245fa 100644 --- a/api/routes/_test_/general.test.route.ts +++ b/api/routes/_test_/general.test.route.ts @@ -8,8 +8,8 @@ import { } from "./test.schema.js"; import { KMSService } from "../../services/kms.service.js"; import { prisma } from "../../config/database.config.js"; -import { STATUS_CODES } from "../../utilities/data.js"; -import { responseWrapper } from "../../utilities/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; +import { responseWrapper } from "../../utils/helper.js"; import { dataLogger } from "../../config/logger.config.js"; const router = Router(); diff --git a/api/routes/_test_/octokit.test.route.ts b/api/routes/_test_/octokit.test.route.ts index e410102..026e806 100644 --- a/api/routes/_test_/octokit.test.route.ts +++ b/api/routes/_test_/octokit.test.route.ts @@ -1,7 +1,7 @@ import { Router, Request, Response, NextFunction, RequestHandler } from "express"; import { OctokitService } from "../../services/octokit.service.js"; -import { STATUS_CODES } from "../../utilities/data.js"; -import { responseWrapper } from "../../utilities/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; +import { responseWrapper } from "../../utils/helper.js"; const router = Router(); diff --git a/api/routes/agent.route.ts b/api/routes/agent.route.ts index fb2b2e7..b0b4992 100644 --- a/api/routes/agent.route.ts +++ b/api/routes/agent.route.ts @@ -3,8 +3,8 @@ import { cloudTasksService } from "../services/cloud-tasks.service.js"; import { paymentMiddlewareFromConfig } from "@x402/express"; import { HTTPFacilitatorClient, RoutesConfig } from "@x402/core/server"; import { ExactStellarScheme } from "@x402/stellar/exact/server"; -import { ENDPOINTS, STATUS_CODES } from "../utilities/data.js"; -import { responseWrapper } from "../utilities/helper.js"; +import { ENDPOINTS, STATUS_CODES } from "../utils/data.js"; +import { responseWrapper } from "../utils/helper.js"; import { ValidationError } from "../models/error.model.js"; // const network = `stellar:${process.env.STELLAR_NETWORK === "testnet" ? "testnet" : "pubnet"}` as `${string}:${string}`; diff --git a/api/routes/installation.route.ts b/api/routes/installation.route.ts index 85955fe..dddf399 100644 --- a/api/routes/installation.route.ts +++ b/api/routes/installation.route.ts @@ -26,7 +26,7 @@ import { getRepositoryResourcesSchema, getOrCreateBountyLabelSchema } from "../schemas/installation.schema.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; import { validateRequestParameters } from "../middlewares/request.middleware.js"; export const installationRoutes = Router(); diff --git a/api/routes/internal.route.ts b/api/routes/internal.route.ts index b2ea50e..9755fed 100644 --- a/api/routes/internal.route.ts +++ b/api/routes/internal.route.ts @@ -1,6 +1,6 @@ import { Router, RequestHandler } from "express"; import { handleBountyPayoutJob } from "../controllers/internal/index.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; export const internalRoutes = Router(); diff --git a/api/routes/task.route.ts b/api/routes/task.route.ts index 38620a8..b08d206 100644 --- a/api/routes/task.route.ts +++ b/api/routes/task.route.ts @@ -44,7 +44,7 @@ import { getContributorTaskSchema, markActivityAsViewedSchema } from "../schemas/task.schema.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; import { validateRequestParameters } from "../middlewares/request.middleware.js"; export const taskRoutes = Router(); diff --git a/api/routes/user.route.ts b/api/routes/user.route.ts index 2a98fdb..fa1324a 100644 --- a/api/routes/user.route.ts +++ b/api/routes/user.route.ts @@ -6,7 +6,7 @@ import { generateSumsubSdkToken } from "../controllers/user/index.js"; import { createUserSchema, updateAddressBookSchema } from "../schemas/user.schema.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; import { validateRequestParameters } from "../middlewares/request.middleware.js"; export const userRoutes = Router(); diff --git a/api/routes/wallet.route.ts b/api/routes/wallet.route.ts index cec5cef..7a6f899 100644 --- a/api/routes/wallet.route.ts +++ b/api/routes/wallet.route.ts @@ -1,7 +1,7 @@ import { RequestHandler, Router } from "express"; -import { - withdrawAsset, - swapAsset, +import { + withdrawAsset, + swapAsset, getWalletInfo, recordWalletTopups, getInstallationTransactions, @@ -14,29 +14,29 @@ import { getInstallationTransactionsSchema, getUserTransactionsSchema } from "../schemas/wallet.schema.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; import { validateRequestParameters } from "../middlewares/request.middleware.js"; export const walletRoutes = Router(); // Get wallet info walletRoutes.get( - ENDPOINTS.WALLET.GET_ACCOUNT, - validateRequestParameters(walletInstallationIdSchema), + ENDPOINTS.WALLET.GET_ACCOUNT, + validateRequestParameters(walletInstallationIdSchema), getWalletInfo as RequestHandler ); // Withdraw asset walletRoutes.post( - ENDPOINTS.WALLET.WITHDRAW, - validateRequestParameters(withdrawAssetSchema), + ENDPOINTS.WALLET.WITHDRAW, + validateRequestParameters(withdrawAssetSchema), withdrawAsset as RequestHandler ); // Swap assets (XLM and USDC) walletRoutes.post( - ENDPOINTS.WALLET.SWAP, - validateRequestParameters(swapAssetSchema), + ENDPOINTS.WALLET.SWAP, + validateRequestParameters(swapAssetSchema), swapAsset as RequestHandler ); @@ -45,21 +45,21 @@ walletRoutes.post( // Get user transactions walletRoutes.get( - ENDPOINTS.WALLET.TRANSACTIONS.GET_ALL_USER, - validateRequestParameters(getUserTransactionsSchema), + ENDPOINTS.WALLET.TRANSACTIONS.GET_ALL_USER, + validateRequestParameters(getUserTransactionsSchema), getUserTransactions as RequestHandler ); // Get installation transactions walletRoutes.get( - ENDPOINTS.WALLET.TRANSACTIONS.GET_ALL_INSTALLATION, - validateRequestParameters(getInstallationTransactionsSchema), + ENDPOINTS.WALLET.TRANSACTIONS.GET_ALL_INSTALLATION, + validateRequestParameters(getInstallationTransactionsSchema), getInstallationTransactions as RequestHandler ); // Record wallet topups walletRoutes.post( - ENDPOINTS.WALLET.TRANSACTIONS.RECORD_TOPUPS, - validateRequestParameters(walletInstallationIdSchema), + ENDPOINTS.WALLET.TRANSACTIONS.RECORD_TOPUPS, + validateRequestParameters(walletInstallationIdSchema), recordWalletTopups as RequestHandler ); diff --git a/api/routes/webhook.route.ts b/api/routes/webhook.route.ts index 484c44e..cdcc411 100644 --- a/api/routes/webhook.route.ts +++ b/api/routes/webhook.route.ts @@ -2,7 +2,7 @@ import { Router, RequestHandler } from "express"; import { handleGitHubWebhook, handleSumsubWebhook } from "../controllers/webhook/index.js"; import { validateGitHubWebhook, validateGitHubWebhookEvent, validateSumsubWebhook } from "../middlewares/webhook.middleware.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; export const webhookRoutes = Router(); diff --git a/api/services/cloud-tasks.service.ts b/api/services/cloud-tasks.service.ts index 8298482..9d09a3b 100644 --- a/api/services/cloud-tasks.service.ts +++ b/api/services/cloud-tasks.service.ts @@ -2,17 +2,17 @@ import { CloudTasksClient } from "@google-cloud/tasks"; import { GitHubWebhookPayload, LinkedIssue } from "../models/ai-review.model.js"; import { dataLogger } from "../config/logger.config.js"; import { CloudTasksError } from "../models/error.model.js"; -import { ENDPOINTS } from "../utilities/data.js"; +import { ENDPOINTS } from "../utils/data.js"; /** * Types of background jobs supported by the Cloud Tasks integration. */ -export type JobType = "pr-analysis" +export type JobType = "pr-analysis" | "manual-pr-analysis" - | "repository-indexing" - | "repository-incremental-indexing" - | "bounty-payout" - | "clear-installation" + | "repository-indexing" + | "repository-incremental-indexing" + | "bounty-payout" + | "clear-installation" | "clear-repo"; /** @@ -178,8 +178,8 @@ export class CloudTasksService { dispatchDeadline: { seconds: (type === "pr-analysis" || type === "manual-pr-analysis") ? 600 // 10 minutes : type === "bounty-payout" - || type === "clear-installation" - || type === "clear-repo" + || type === "clear-installation" + || type === "clear-repo" ? 300 // 5 minutes : 1800 // 30 minutes (indexing) } diff --git a/api/services/github-webhook/installation-webhook.service.ts b/api/services/github-webhook/installation-webhook.service.ts index 9b79a96..7761931 100644 --- a/api/services/github-webhook/installation-webhook.service.ts +++ b/api/services/github-webhook/installation-webhook.service.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { prisma } from "../../config/database.config.js"; import { dataLogger } from "../../config/logger.config.js"; import { Task } from "../../../prisma_client/index.js"; diff --git a/api/services/github-webhook/installation_repositories-webhook.service.ts b/api/services/github-webhook/installation_repositories-webhook.service.ts index aa2cdf0..28e73ca 100644 --- a/api/services/github-webhook/installation_repositories-webhook.service.ts +++ b/api/services/github-webhook/installation_repositories-webhook.service.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { dataLogger } from "../../config/logger.config.js"; import { cloudTasksService } from "../cloud-tasks.service.js"; diff --git a/api/services/github-webhook/issue_comment-webhook.service.ts b/api/services/github-webhook/issue_comment-webhook.service.ts index 11db9c3..529accb 100644 --- a/api/services/github-webhook/issue_comment-webhook.service.ts +++ b/api/services/github-webhook/issue_comment-webhook.service.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { GitHubWebhookPayload } from "../../models/ai-review.model.js"; -import { responseWrapper, stellarTimestampToDate } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper, stellarTimestampToDate } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { prisma } from "../../config/database.config.js"; import { dataLogger } from "../../config/logger.config.js"; import { OctokitService } from "../octokit.service.js"; @@ -431,7 +431,7 @@ export class IssueCommentWebhookService { { taskId: task.id, installationId, issueId: issue.id, error } ); } - + await this.bountyFailureComment(installationId, repository.full_name, issue.number); return; } @@ -514,10 +514,10 @@ export class IssueCommentWebhookService { { userID: creator.userId }, "bounty_creation_github_failed", amount, - { - error: err instanceof Error ? err.message : "Unknown error", - installationId, - issueUrl: issue.html_url + { + error: err instanceof Error ? err.message : "Unknown error", + installationId, + issueUrl: issue.html_url } ); dataLogger.error( diff --git a/api/services/github-webhook/pull_request-webhook.service.ts b/api/services/github-webhook/pull_request-webhook.service.ts index acd811a..dd4c441 100644 --- a/api/services/github-webhook/pull_request-webhook.service.ts +++ b/api/services/github-webhook/pull_request-webhook.service.ts @@ -1,7 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { GitHubWebhookPayload } from "../../models/ai-review.model.js"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { dataLogger } from "../../config/logger.config.js"; import { cloudTasksService } from "../cloud-tasks.service.js"; import { TaskStatus } from "../../../prisma_client/index.js"; diff --git a/api/services/github-webhook/push-webhook.service.ts b/api/services/github-webhook/push-webhook.service.ts index 8ae7e5c..999a7c2 100644 --- a/api/services/github-webhook/push-webhook.service.ts +++ b/api/services/github-webhook/push-webhook.service.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; -import { responseWrapper } from "../../utilities/helper.js"; -import { STATUS_CODES } from "../../utilities/data.js"; +import { responseWrapper } from "../../utils/helper.js"; +import { STATUS_CODES } from "../../utils/data.js"; import { dataLogger } from "../../config/logger.config.js"; import { cloudTasksService } from "../cloud-tasks.service.js"; diff --git a/api/services/octokit.service.ts b/api/services/octokit.service.ts index a5977ea..edb5b9e 100644 --- a/api/services/octokit.service.ts +++ b/api/services/octokit.service.ts @@ -10,7 +10,7 @@ import { IssueMilestone, RepositoryDto } from "../models/github.model.js"; -import { getFieldFromUnknownObject, moneyFormat } from "../utilities/helper.js"; +import { getFieldFromUnknownObject, moneyFormat } from "../utils/helper.js"; import { GitHubAPIError } from "../models/error.model.js"; import { dataLogger, messageLogger } from "../config/logger.config.js"; import { LinkedIssue } from "../models/ai-review.model.js"; diff --git a/api/services/socket.service.ts b/api/services/socket.service.ts index 567b85b..bb6168f 100644 --- a/api/services/socket.service.ts +++ b/api/services/socket.service.ts @@ -1,6 +1,6 @@ import { Server as SocketIOServer } from "socket.io"; import { Server as HttpServer } from "http"; -import { ALLOWED_ORIGINS } from "../utilities/data.js"; +import { ALLOWED_ORIGINS } from "../utils/data.js"; import { messageLogger } from "../config/logger.config.js"; /** @@ -51,15 +51,15 @@ export class SocketService { this.io.on("connection", (socket) => { messageLogger.info(`Client connected to WebSockets: ${socket.id}`); - + socket.on("join", (room: string) => { socket.join(room); }); - + socket.on("leave", (room: string) => { socket.leave(room); }); - + socket.on("disconnect", () => { messageLogger.info(`Client disconnected from WebSockets: ${socket.id}`); }); @@ -87,7 +87,7 @@ export class SocketService { */ static async updateAppActivity(activity: Activity) { if (!this.io) return; - + switch (activity.type) { case "task": this.io.to(`task_${activity.taskId}`).emit("activity_update", activity); @@ -109,7 +109,7 @@ export class SocketService { */ static async deleteAppActivity(activity: Partial) { if (!this.io) return; - + switch (activity.type) { case "task": this.io.to(`task_${activity.taskId}`).emit("activity_deleted", activity); diff --git a/api/utilities/data.ts b/api/utils/data.ts similarity index 100% rename from api/utilities/data.ts rename to api/utils/data.ts diff --git a/api/utilities/helper.ts b/api/utils/helper.ts similarity index 100% rename from api/utilities/helper.ts rename to api/utils/helper.ts diff --git a/tests/helpers/test-utils.ts b/tests/helpers/test-utils.ts index ef9e8a0..0cea8eb 100644 --- a/tests/helpers/test-utils.ts +++ b/tests/helpers/test-utils.ts @@ -1,6 +1,6 @@ import { vi, Mock, expect } from "vitest"; import { Request, Response } from "express"; -import { ENDPOINTS } from "../../api/utilities/data.js"; +import { ENDPOINTS } from "../../api/utils/data.js"; /** * Creates a mock Express request object for testing diff --git a/tests/integration/api/installation/github.api.test.ts b/tests/integration/api/installation/github.api.test.ts index deee98c..3289bd5 100644 --- a/tests/integration/api/installation/github.api.test.ts +++ b/tests/integration/api/installation/github.api.test.ts @@ -6,7 +6,7 @@ import { installationRoutes } from "../../../../api/routes/installation.route.js import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { validateUser } from "../../../../api/middlewares/auth.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { apiLimiter } from "../../../../api/middlewares/rate-limit.middleware.js"; diff --git a/tests/integration/api/installation/index.api.test.ts b/tests/integration/api/installation/index.api.test.ts index 7af44fc..be61210 100644 --- a/tests/integration/api/installation/index.api.test.ts +++ b/tests/integration/api/installation/index.api.test.ts @@ -6,7 +6,7 @@ import { installationRoutes } from "../../../../api/routes/installation.route.js import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { validateUser } from "../../../../api/middlewares/auth.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { apiLimiter } from "../../../../api/middlewares/rate-limit.middleware.js"; diff --git a/tests/integration/api/installation/team.api.test.ts b/tests/integration/api/installation/team.api.test.ts index 755694b..e06512e 100644 --- a/tests/integration/api/installation/team.api.test.ts +++ b/tests/integration/api/installation/team.api.test.ts @@ -6,7 +6,7 @@ import { installationRoutes } from "../../../../api/routes/installation.route.js import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { validateUser } from "../../../../api/middlewares/auth.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { generateRandomString, getEndpointWithPrefix, generateRandomCUID } from "../../../helpers/test-utils.js"; import { apiLimiter } from "../../../../api/middlewares/rate-limit.middleware.js"; diff --git a/tests/integration/api/internal/index.api.test.ts b/tests/integration/api/internal/index.api.test.ts index f60882b..0329159 100644 --- a/tests/integration/api/internal/index.api.test.ts +++ b/tests/integration/api/internal/index.api.test.ts @@ -3,7 +3,7 @@ import request from "supertest"; import express from "express"; import { internalRoutes } from "../../../../api/routes/internal.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; import { TestDataFactory } from "../../../helpers/test-data-factory.js"; @@ -61,7 +61,7 @@ describe("Internal Routes API Integration Tests", () => { prisma = await DatabaseTestHelper.setupTestDatabase(); app = express(); app.use(express.json()); - + // Mount internal routes app.use(ENDPOINTS.INTERNAL.PREFIX, internalRoutes); app.use(errorHandler); diff --git a/tests/integration/api/task/activities.api.test.ts b/tests/integration/api/task/activities.api.test.ts index bae9ec9..7c953c5 100644 --- a/tests/integration/api/task/activities.api.test.ts +++ b/tests/integration/api/task/activities.api.test.ts @@ -5,7 +5,7 @@ import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { taskRoutes } from "../../../../api/routes/task.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/task/contributor.api.test.ts b/tests/integration/api/task/contributor.api.test.ts index c426c85..1b37003 100644 --- a/tests/integration/api/task/contributor.api.test.ts +++ b/tests/integration/api/task/contributor.api.test.ts @@ -5,7 +5,7 @@ import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { taskRoutes } from "../../../../api/routes/task.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix, generateRandomCUID } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/task/index.api.test.ts b/tests/integration/api/task/index.api.test.ts index cd2757f..b1a6c12 100644 --- a/tests/integration/api/task/index.api.test.ts +++ b/tests/integration/api/task/index.api.test.ts @@ -6,7 +6,7 @@ import { taskRoutes, publicTaskRoutes } from "../../../../api/routes/task.route. import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { validateUser } from "../../../../api/middlewares/auth.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { dataLogger } from "../../../../api/config/logger.config.js"; diff --git a/tests/integration/api/task/installation.api.test.ts b/tests/integration/api/task/installation.api.test.ts index 7f3b56d..6bbb53c 100644 --- a/tests/integration/api/task/installation.api.test.ts +++ b/tests/integration/api/task/installation.api.test.ts @@ -5,7 +5,7 @@ import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { taskRoutes } from "../../../../api/routes/task.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix, generateRandomCUID } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/task/{taskId}.api.test.ts b/tests/integration/api/task/{taskId}.api.test.ts index 659a3f2..63f9945 100644 --- a/tests/integration/api/task/{taskId}.api.test.ts +++ b/tests/integration/api/task/{taskId}.api.test.ts @@ -5,7 +5,7 @@ import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { taskRoutes } from "../../../../api/routes/task.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { generateRandomString, getEndpointWithPrefix, generateRandomCUID } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/user/index.api.test.ts b/tests/integration/api/user/index.api.test.ts index 6728a20..4c0ce6a 100644 --- a/tests/integration/api/user/index.api.test.ts +++ b/tests/integration/api/user/index.api.test.ts @@ -6,7 +6,7 @@ import { userRoutes } from "../../../../api/routes/user.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { validateUser } from "../../../../api/middlewares/auth.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { apiLimiter } from "../../../../api/middlewares/rate-limit.middleware.js"; diff --git a/tests/integration/api/user/sumsub.api.test.ts b/tests/integration/api/user/sumsub.api.test.ts index 5ac4e8c..41ff43e 100644 --- a/tests/integration/api/user/sumsub.api.test.ts +++ b/tests/integration/api/user/sumsub.api.test.ts @@ -6,7 +6,7 @@ import { statsigService } from "../../../../api/services/statsig.service.js"; import { userRoutes } from "../../../../api/routes/user.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/wallet/index.api.test.ts b/tests/integration/api/wallet/index.api.test.ts index b729993..eecebc3 100644 --- a/tests/integration/api/wallet/index.api.test.ts +++ b/tests/integration/api/wallet/index.api.test.ts @@ -5,7 +5,7 @@ import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { walletRoutes } from "../../../../api/routes/wallet.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { TransactionCategory } from "../../../../prisma_client/index.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/wallet/transactions.api.test.ts b/tests/integration/api/wallet/transactions.api.test.ts index 8454235..311ed04 100644 --- a/tests/integration/api/wallet/transactions.api.test.ts +++ b/tests/integration/api/wallet/transactions.api.test.ts @@ -5,7 +5,7 @@ import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { walletRoutes } from "../../../../api/routes/wallet.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { TransactionCategory } from "../../../../prisma_client/index.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/api/webhook/github.api.test.ts b/tests/integration/api/webhook/github.api.test.ts index fbb124c..039e3c3 100644 --- a/tests/integration/api/webhook/github.api.test.ts +++ b/tests/integration/api/webhook/github.api.test.ts @@ -6,7 +6,7 @@ import { webhookRoutes } from "../../../../api/routes/webhook.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../../tests/helpers/database-test-helper.js"; import { TestDataFactory } from "../../../../tests/helpers/test-data-factory.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { BOUNTY_LABEL } from "../../../../api/models/github.model.js"; diff --git a/tests/integration/api/webhook/sumsub.api.test.ts b/tests/integration/api/webhook/sumsub.api.test.ts index 38dbc98..44e1376 100644 --- a/tests/integration/api/webhook/sumsub.api.test.ts +++ b/tests/integration/api/webhook/sumsub.api.test.ts @@ -6,7 +6,7 @@ import crypto from "crypto"; import { webhookRoutes } from "../../../../api/routes/webhook.route.js"; import { errorHandler } from "../../../../api/middlewares/error.middleware.js"; import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; -import { ENDPOINTS, STATUS_CODES } from "../../../../api/utilities/data.js"; +import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { TestDataFactory } from "../../../helpers/test-data-factory.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; diff --git a/tests/integration/middlewares/auth.middleware.test.ts b/tests/integration/middlewares/auth.middleware.test.ts index 7bcc55c..9ae15d4 100644 --- a/tests/integration/middlewares/auth.middleware.test.ts +++ b/tests/integration/middlewares/auth.middleware.test.ts @@ -4,7 +4,7 @@ import { DatabaseTestHelper } from "../../helpers/database-test-helper.js"; import { TestDataFactory } from "../../helpers/test-data-factory.js"; import { mockFirebaseAuth, FirebaseTestHelpers } from "../../mocks/firebase.service.mock.js"; import { validateUser, validateUserInstallation, validateCloudTasksRequest } from "../../../api/middlewares/auth.middleware.js"; -import { STATUS_CODES } from "../../../api/utilities/data.js"; +import { STATUS_CODES } from "../../../api/utils/data.js"; // Mock Firebase admin for authentication vi.mock("../../../api/config/firebase.config", () => { diff --git a/tests/integration/middlewares/error.middleware.test.ts b/tests/integration/middlewares/error.middleware.test.ts index b222885..23256d4 100644 --- a/tests/integration/middlewares/error.middleware.test.ts +++ b/tests/integration/middlewares/error.middleware.test.ts @@ -10,7 +10,7 @@ import { NotFoundError, ValidationError } from "../../../api/models/error.model.js"; -import { STATUS_CODES } from "../../../api/utilities/data.js"; +import { STATUS_CODES } from "../../../api/utils/data.js"; vi.mock("../../../api/services/octokit.service", () => ({ OctokitService: { diff --git a/tests/integration/middlewares/rate-limit.middleware.test.ts b/tests/integration/middlewares/rate-limit.middleware.test.ts index 7d28b09..daf43c2 100644 --- a/tests/integration/middlewares/rate-limit.middleware.test.ts +++ b/tests/integration/middlewares/rate-limit.middleware.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach } from "vitest"; import request from "supertest"; import express, { Request, Response } from "express"; import { apiLimiter, webhookLimiter } from "../../../api/middlewares/rate-limit.middleware.js"; -import { STATUS_CODES, ENDPOINTS } from "../../../api/utilities/data.js"; +import { STATUS_CODES, ENDPOINTS } from "../../../api/utils/data.js"; describe("Rate Limit Middleware", () => { let app: express.Application; diff --git a/tests/integration/middlewares/request.middleware.test.ts b/tests/integration/middlewares/request.middleware.test.ts index 6037891..23b6009 100644 --- a/tests/integration/middlewares/request.middleware.test.ts +++ b/tests/integration/middlewares/request.middleware.test.ts @@ -3,7 +3,7 @@ import { Request, Response, NextFunction } from "express"; import * as z from "zod"; import { dynamicRoute, localhostOnly, validateRequestParameters } from "../../../api/middlewares/request.middleware.js"; import { ValidationError } from "../../../api/models/error.model.js"; -import { STATUS_CODES } from "../../../api/utilities/data.js"; +import { STATUS_CODES } from "../../../api/utils/data.js"; describe("Request Middleware", () => { let mockRequest: Partial; diff --git a/tests/integration/middlewares/webhook.middleware.test.ts b/tests/integration/middlewares/webhook.middleware.test.ts index 917851d..7db1298 100644 --- a/tests/integration/middlewares/webhook.middleware.test.ts +++ b/tests/integration/middlewares/webhook.middleware.test.ts @@ -2,7 +2,7 @@ import { vi, describe, it, expect, beforeAll, beforeEach, afterAll } from "vites import { Request, Response, NextFunction } from "express"; import crypto from "crypto"; import { validateGitHubWebhook, validateGitHubWebhookEvent, validateSumsubWebhook } from "../../../api/middlewares/webhook.middleware.js"; -import { STATUS_CODES } from "../../../api/utilities/data.js"; +import { STATUS_CODES } from "../../../api/utils/data.js"; import { OctokitService } from "../../../api/services/octokit.service.js"; import { GitHubWebhookError, SumsubWebhookError } from "../../../api/models/error.model.js"; diff --git a/tests/unit/helper.test.ts b/tests/unit/helper.test.ts index 27c3c3f..c93470c 100644 --- a/tests/unit/helper.test.ts +++ b/tests/unit/helper.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { moneyFormat, getFieldFromUnknownObject, stellarTimestampToDate } from "../../api/utilities/helper.js"; +import { moneyFormat, getFieldFromUnknownObject, stellarTimestampToDate } from "../../api/utils/helper.js"; describe("Helper Functions Unit Tests", () => { describe("moneyFormat", () => { From f15f03956c76bef981ff414f4a67f81f7eefa771 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Tue, 21 Apr 2026 16:49:44 +0100 Subject: [PATCH 02/12] refactor: remove stellar-typescript-wallet-sdk package --- api/config/stellar.config.ts | 46 +- api/controllers/wallet/index.controller.ts | 14 +- api/routes/_test_/stellar.test.route.ts | 13 +- api/services/stellar.service.ts | 360 +-- package-lock.json | 2491 ++++---------------- package.json | 1 - 6 files changed, 709 insertions(+), 2216 deletions(-) diff --git a/api/config/stellar.config.ts b/api/config/stellar.config.ts index 60d5416..5455e66 100644 --- a/api/config/stellar.config.ts +++ b/api/config/stellar.config.ts @@ -1,37 +1,23 @@ -import swSdk from "@stellar/typescript-wallet-sdk"; -const { - ApplicationConfiguration, - DefaultSigner, - Wallet, - StellarConfiguration, - IssuedAssetId, - NativeAssetId -} = swSdk; -import axios from "axios"; +import { Horizon, Asset, Networks } from "@stellar/stellar-sdk"; -const customClient = axios.create({ - timeout: 20000 -}); -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const appConfig = new ApplicationConfiguration(DefaultSigner, customClient as any); +export const isMainnet = process.env.STELLAR_NETWORK === "public"; -export const wallet = new Wallet({ - stellarConfiguration: process.env.STELLAR_NETWORK === "public" - ? StellarConfiguration.MainNet() - : StellarConfiguration.TestNet(), - applicationConfiguration: appConfig -}); +export const horizonUrl = isMainnet + ? "https://horizon.stellar.org" + : "https://horizon-testnet.stellar.org"; -export const stellar = wallet.stellar(); -export const account = stellar.account(); -export const anchor = wallet.anchor({ - homeDomain: process.env.STELLAR_NETWORK === "public" - ? "anchor.stellar.org" - : "testanchor.stellar.org" -}); +export const networkPassphrase = isMainnet + ? Networks.PUBLIC + : Networks.TESTNET; -export const xlmAssetId = new NativeAssetId(); -export const usdcAssetId = new IssuedAssetId( +export const stellarServer = new Horizon.Server(horizonUrl); + +export const anchorHomeDomain = isMainnet + ? "anchor.stellar.org" + : "testanchor.stellar.org"; + +export const xlmAsset = Asset.native(); +export const usdcAsset = new Asset( "USDC", process.env.USDC_ASSET_ID! ); diff --git a/api/controllers/wallet/index.controller.ts b/api/controllers/wallet/index.controller.ts index bc41d1a..fd7093c 100644 --- a/api/controllers/wallet/index.controller.ts +++ b/api/controllers/wallet/index.controller.ts @@ -4,7 +4,7 @@ import { responseWrapper } from "../../utils/helper.js"; import { STATUS_CODES } from "../../utils/data.js"; import { HorizonApi } from "../../models/horizonapi.model.js"; import { TransactionCategory } from "../../../prisma_client/index.js"; -import { usdcAssetId, xlmAssetId } from "../../config/stellar.config.js"; +import { usdcAsset, xlmAsset } from "../../config/stellar.config.js"; import { stellarService } from "../../services/stellar.service.js"; import { NotFoundError, ValidationError } from "../../models/error.model.js"; import { KMSService } from "../../services/kms.service.js"; @@ -135,8 +135,8 @@ export const withdrawAsset = async (req: Request, res: Response, next: NextFunct ({ txHash } = await stellarService.transferAsset( walletSecret, destinationAddress, - assetType === "USDC" ? usdcAssetId : xlmAssetId, - assetType === "USDC" ? usdcAssetId : xlmAssetId, + assetType === "USDC" ? usdcAsset : xlmAsset, + assetType === "USDC" ? usdcAsset : xlmAsset, amount, memo )); @@ -147,8 +147,8 @@ export const withdrawAsset = async (req: Request, res: Response, next: NextFunct masterSecret, walletSecret, destinationAddress, - assetType === "USDC" ? usdcAssetId : xlmAssetId, - assetType === "USDC" ? usdcAssetId : xlmAssetId, + assetType === "USDC" ? usdcAsset : xlmAsset, + assetType === "USDC" ? usdcAsset : xlmAsset, amount, memo )); @@ -287,8 +287,8 @@ export const swapAsset = async (req: Request, res: Response, next: NextFunction) result = await stellarService.swapAsset( walletSecret, amount, - usdcAssetId, - xlmAssetId + usdcAsset, + xlmAsset ); } diff --git a/api/routes/_test_/stellar.test.route.ts b/api/routes/_test_/stellar.test.route.ts index 6193eb4..f081061 100644 --- a/api/routes/_test_/stellar.test.route.ts +++ b/api/routes/_test_/stellar.test.route.ts @@ -1,6 +1,6 @@ import { Router, Request, Response, NextFunction, RequestHandler } from "express"; import { prisma } from "../../config/database.config.js"; -import { xlmAssetId, usdcAssetId } from "../../config/stellar.config.js"; +import { xlmAsset } from "../../config/stellar.config.js"; import { stellarService } from "../../services/stellar.service.js"; import { validateRequestParameters } from "../../middlewares/request.middleware.js"; import { @@ -21,11 +21,10 @@ const router = Router(); router.post("/wallet", async (_req: Request, res: Response, next: NextFunction) => { try { const wallet = await stellarService.createWallet(); - const security = await KMSService.encryptWallet(wallet.secretKey); res.status(201).json({ message: "Wallet created successfully", - data: { wallet, security } + data: wallet }); } catch (error) { next(error); @@ -105,8 +104,8 @@ router.post("/transfer", const result = await stellarService.transferAsset( sourceSecret, destinationAddress, - xlmAssetId, - xlmAssetId, + xlmAsset, + xlmAsset, amount ); res.status(200).json({ @@ -129,8 +128,8 @@ router.post("/transfer/sponsor", sponsorSecret, accountSecret, destinationAddress, - usdcAssetId, - usdcAssetId, + xlmAsset, + xlmAsset, amount ); res.status(200).json({ diff --git a/api/services/stellar.service.ts b/api/services/stellar.service.ts index 8c980c1..5665c7d 100644 --- a/api/services/stellar.service.ts +++ b/api/services/stellar.service.ts @@ -1,15 +1,17 @@ -import swSdk, { - type AccountKeypair, - type StellarAssetId, - type SponsoringBuilder -} from "@stellar/typescript-wallet-sdk"; import { - stellar, - account, - usdcAssetId, - xlmAssetId + Keypair, + Asset, + Memo, + TransactionBuilder, + Operation +} from "@stellar/stellar-sdk"; +import { + stellarServer, + usdcAsset, + xlmAsset, + isMainnet, + networkPassphrase } from "../config/stellar.config.js"; -import { Memo } from "@stellar/stellar-sdk"; import { HorizonApi } from "../models/horizonapi.model.js"; import { StellarServiceError } from "../models/error.model.js"; @@ -21,7 +23,7 @@ import { StellarServiceError } from "../models/error.model.js"; * TODO: Implement deeper error handling (e.g., swapAsset: "No trustline present") */ export class StellarService { - private masterAccount: AccountKeypair; + private masterAccount: Keypair; readonly isMainnet: boolean; /** @@ -34,39 +36,16 @@ export class StellarService { throw new StellarServiceError("Missing Stellar master account credentials in environment variables"); } - this.isMainnet = process.env.STELLAR_NETWORK === "public"; + this.isMainnet = isMainnet; try { // Create keypair from the master secret key - const keypair = swSdk.Keypair.fromSecret(process.env.STELLAR_MASTER_SECRET_KEY); - this.masterAccount = new swSdk.AccountKeypair(keypair); + this.masterAccount = Keypair.fromSecret(process.env.STELLAR_MASTER_SECRET_KEY); } catch (error) { throw new StellarServiceError("Invalid Stellar master account credentials", error); } } - /** - * Helper method to check if two Stellar assets are identical. - * Compares both native (XLM) and issued assets (like USDC). - * @param asset1 - The first Stellar asset to compare - * @param asset2 - The second Stellar asset to compare - * @returns True if the assets are identical, false otherwise - */ - private isSameAsset(asset1: StellarAssetId, asset2: StellarAssetId): boolean { - // Both assets are native XLM - if (asset1 instanceof swSdk.NativeAssetId && asset2 instanceof swSdk.NativeAssetId) { - return true; - } - - // Both assets are issued assets - compare code and issuer - if (asset1 instanceof swSdk.IssuedAssetId && asset2 instanceof swSdk.IssuedAssetId) { - return asset1.code === asset2.code && asset1.issuer === asset2.issuer; - } - - // Assets are of different types - return false; - } - /** * Helper method to deduct the Memo type automatically from a string value. */ @@ -108,24 +87,34 @@ export class StellarService { async createWallet() { try { // Generate a new random keypair for the wallet - const accountKeyPair = account.createKeypair(); + const accountKeyPair = Keypair.random(); + + const sourceAccount = await stellarServer.loadAccount(this.masterAccount.publicKey()); // Build the account creation transaction - const txBuilder = await stellar.transaction({ - sourceAddress: this.masterAccount + const txBuilder = new TransactionBuilder(sourceAccount, { + fee: (await stellarServer.fetchBaseFee()).toString(), + networkPassphrase }); - const txCreateAccount = txBuilder.createAccount(accountKeyPair).build(); + + const txCreateAccount = txBuilder + .addOperation(Operation.createAccount({ + destination: accountKeyPair.publicKey(), + startingBalance: "1.5" + })) + .setTimeout(30) + .build(); // Sign the transaction with the master account - txCreateAccount.sign(this.masterAccount.keypair); + txCreateAccount.sign(this.masterAccount); // Submit the transaction to the network - await stellar.submitTransaction(txCreateAccount); + await stellarServer.submitTransaction(txCreateAccount); // Return the new wallet credentials and transaction hash return { - publicKey: accountKeyPair.publicKey, - secretKey: accountKeyPair.secretKey, + publicKey: accountKeyPair.publicKey(), + secretKey: accountKeyPair.secret(), txHash: txCreateAccount.hash().toString("hex") }; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -160,31 +149,42 @@ export class StellarService { async createWalletViaSponsor(sponsorSecret: string) { try { // Create keypairs for both sponsor and new account - const sponsorKeyPair = swSdk.Keypair.fromSecret(sponsorSecret); - const accountKeyPair = account.createKeypair(); + const sponsorKeyPair = Keypair.fromSecret(sponsorSecret); + const accountKeyPair = Keypair.random(); + + const sponsorAccount = await stellarServer.loadAccount(sponsorKeyPair.publicKey()); // Build the sponsored transaction - const txBuilder = await stellar.transaction({ - sourceAddress: new swSdk.AccountKeypair(sponsorKeyPair) + const txBuilder = new TransactionBuilder(sponsorAccount, { + fee: (await stellarServer.fetchBaseFee()).toString(), + networkPassphrase }); - // Define the sponsoring operation - const buildingFunction = (bldr: SponsoringBuilder) => bldr.createAccount(accountKeyPair); const txCreateAccount = txBuilder - .sponsoring(new swSdk.AccountKeypair(sponsorKeyPair), buildingFunction, accountKeyPair) + .addOperation(Operation.beginSponsoringFutureReserves({ + sponsoredId: accountKeyPair.publicKey() + })) + .addOperation(Operation.createAccount({ + destination: accountKeyPair.publicKey(), + startingBalance: "0" + })) + .addOperation(Operation.endSponsoringFutureReserves({ + source: accountKeyPair.publicKey() + })) + .setTimeout(30) .build(); // Sign with both the new account and sponsor - accountKeyPair.sign(txCreateAccount); txCreateAccount.sign(sponsorKeyPair); + txCreateAccount.sign(accountKeyPair); // Submit the sponsored transaction - await stellar.submitTransaction(txCreateAccount); + await stellarServer.submitTransaction(txCreateAccount); // Return the new wallet credentials return { - publicKey: accountKeyPair.publicKey, - secretKey: accountKeyPair.secretKey, + publicKey: accountKeyPair.publicKey(), + secretKey: accountKeyPair.secret(), txHash: txCreateAccount.hash().toString("hex") }; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -219,10 +219,13 @@ export class StellarService { if (this.isMainnet) { throw new StellarServiceError("Friendbot funding is only available on Testnet"); } - + try { // Request funding from Friendbot - await stellar.fundTestnetAccount(accountAddress); + const response = await fetch(`https://friendbot.stellar.org?addr=${encodeURIComponent(accountAddress)}`); + if (!response.ok) { + throw new Error(`Friendbot failed with status ${response.status}`); + } return "SUCCESS"; } catch (error) { throw new StellarServiceError("Failed to fund wallet", error); @@ -232,25 +235,31 @@ export class StellarService { /** * Adds a trust line for a specific asset to a wallet on the Stellar network. * @param sourceSecret - The secret key of the wallet to add the trust line to. - * @param assetId - The ID of the asset to add the trust line for. + * @param asset - The ID of the asset to add the trust line for. * @returns The hash of the transaction. */ - async addTrustLine(sourceSecret: string, assetId: StellarAssetId = usdcAssetId) { + async addTrustLine(sourceSecret: string, asset: Asset = usdcAsset) { try { // Create keypair from the source secret - const sourceKeypair = swSdk.Keypair.fromSecret(sourceSecret); + const sourceKeypair = Keypair.fromSecret(sourceSecret); + const sourceAccount = await stellarServer.loadAccount(sourceKeypair.publicKey()); // Build the transaction to add asset support - const assetTxBuilder = await stellar.transaction({ - sourceAddress: new swSdk.AccountKeypair(sourceKeypair) - }); - const txAddAssetSupport = assetTxBuilder.addAssetSupport(assetId).build(); + const txAddAssetSupport = new TransactionBuilder(sourceAccount, { + fee: (await stellarServer.fetchBaseFee()).toString(), + networkPassphrase + }) + .addOperation(Operation.changeTrust({ + asset + })) + .setTimeout(30) + .build(); // Sign the transaction with the source account txAddAssetSupport.sign(sourceKeypair); // Submit the transaction to the network - await stellar.submitTransaction(txAddAssetSupport); + await stellarServer.submitTransaction(txAddAssetSupport); // Return the transaction hash return { txHash: txAddAssetSupport.hash().toString("hex") }; @@ -279,32 +288,37 @@ export class StellarService { * Adds a trust line for a specific asset to a wallet on the Stellar network via sponsorship. * @param sponsorSecret - The secret key of the sponsor account. * @param accountSecret - The secret key of the wallet to add the trust line to. - * @param assetId - The ID of the asset to add the trust line for. + * @param asset - The ID of the asset to add the trust line for. * @returns The hash of the transaction. */ async addTrustLineViaSponsor( sponsorSecret: string, accountSecret: string, - assetId: StellarAssetId = usdcAssetId + asset: Asset = usdcAsset ) { try { // Create keypairs for both sponsor and account - const sponsorKeyPair = swSdk.Keypair.fromSecret(sponsorSecret); - const accountKeyPair = swSdk.Keypair.fromSecret(accountSecret); + const sponsorKeyPair = Keypair.fromSecret(sponsorSecret); + const accountKeyPair = Keypair.fromSecret(accountSecret); - // Build the sponsored transaction - const txBuilder = await stellar.transaction({ - sourceAddress: new swSdk.AccountKeypair(sponsorKeyPair) - }); + const sponsorAccount = await stellarServer.loadAccount(sponsorKeyPair.publicKey()); - // Define the sponsoring operation - const buildingFunction = (bldr: SponsoringBuilder) => bldr.addAssetSupport(assetId); - const txAddAssetSupport = txBuilder - .sponsoring( - new swSdk.AccountKeypair(sponsorKeyPair), - buildingFunction, - new swSdk.AccountKeypair(accountKeyPair) - ) + // Build the sponsored transaction + const txAddAssetSupport = new TransactionBuilder(sponsorAccount, { + fee: (await stellarServer.fetchBaseFee()).toString(), + networkPassphrase + }) + .addOperation(Operation.beginSponsoringFutureReserves({ + sponsoredId: accountKeyPair.publicKey() + })) + .addOperation(Operation.changeTrust({ + asset, + source: accountKeyPair.publicKey() + })) + .addOperation(Operation.endSponsoringFutureReserves({ + source: accountKeyPair.publicKey() + })) + .setTimeout(30) .build(); // Sign with both the account and sponsor @@ -312,7 +326,7 @@ export class StellarService { txAddAssetSupport.sign(sponsorKeyPair); // Submit the sponsored transaction - await stellar.submitTransaction(txAddAssetSupport); + await stellarServer.submitTransaction(txAddAssetSupport); // Return the transaction hash return { txHash: txAddAssetSupport.hash().toString("hex") }; @@ -341,8 +355,8 @@ export class StellarService { * Transfers an asset from one wallet to another on the Stellar network. * @param sourceSecret - The secret key of the wallet to transfer the asset from. * @param destinationAddress - The address of the wallet to transfer the asset to. - * @param sendAssetId - The ID of the asset to transfer. - * @param destAssetId - The ID of the asset to receive. + * @param sendAsset - The ID of the asset to transfer. + * @param destAsset - The ID of the asset to receive. * @param amount - The amount of the asset to transfer. * @param memo - Optional memo to include with the transaction. * @returns The hash of the transaction. @@ -350,50 +364,52 @@ export class StellarService { async transferAsset( sourceSecret: string, destinationAddress: string, - sendAssetId: StellarAssetId, - destAssetId: StellarAssetId, + sendAsset: Asset, + destAsset: Asset, amount: string, memo?: string ) { try { // Derive the source keypair from the provided secret. - const sourceKeypair = swSdk.Keypair.fromSecret(sourceSecret); + const sourceKeypair = Keypair.fromSecret(sourceSecret); + const sourceAccount = await stellarServer.loadAccount(sourceKeypair.publicKey()); // Initialize a transaction builder for the source account. - const txBuilder = await stellar.transaction({ - sourceAddress: new swSdk.AccountKeypair(sourceKeypair) - }); - - let transaction; + let txBuilder = new TransactionBuilder(sourceAccount, { + fee: (await stellarServer.fetchBaseFee()).toString(), + networkPassphrase + }).setTimeout(30); + + const memoObj = this.createMemo(memo); + if (memoObj.type !== "none") { + txBuilder = txBuilder.addMemo(memoObj); + } // Determine if it's a direct transfer or a path payment (if assets are different). - if (this.isSameAsset(sendAssetId, destAssetId)) { + if (sendAsset.equals(destAsset)) { // Build a direct transfer operation. - transaction = txBuilder - .transfer( - destinationAddress, - sendAssetId, - amount - ) - .setMemo(this.createMemo(memo)) - .build(); + txBuilder = txBuilder.addOperation(Operation.payment({ + destination: destinationAddress, + asset: sendAsset, + amount + })); } else { // Build a path payment operation for different assets. - transaction = txBuilder - .pathPay({ - destinationAddress, - sendAsset: sendAssetId, - destAsset: destAssetId, - sendAmount: amount - }) - .setMemo(this.createMemo(memo)) - .build(); + txBuilder = txBuilder.addOperation(Operation.pathPaymentStrictSend({ + destination: destinationAddress, + sendAsset, + destAsset, + sendAmount: amount, + destMin: "0.0000001" // For simplicity, accepting any amount of destAsset. + })); } + const transaction = txBuilder.build(); + // Sign the transaction with the source keypair. transaction.sign(sourceKeypair); // Submit the signed transaction to the Stellar network. - await stellar.submitTransaction(transaction); + await stellarServer.submitTransaction(transaction); // Return the hash of the submitted transaction. return { txHash: transaction.hash().toString("hex") }; @@ -423,8 +439,8 @@ export class StellarService { * @param sponsorSecret - The secret key of the sponsor account. * @param accountSecret - The secret key of the wallet to transfer the asset from. * @param destinationAddress - The address of the wallet to transfer the asset to. - * @param sendAssetId - The ID of the asset to transfer. - * @param destAssetId - The ID of the asset to receive. + * @param sendAsset - The ID of the asset to transfer. + * @param destAsset - The ID of the asset to receive. * @param amount - The amount of the asset to transfer. * @param memo - Optional memo to include with the transaction. * @returns The hash of the transaction. @@ -433,61 +449,67 @@ export class StellarService { sponsorSecret: string, accountSecret: string, destinationAddress: string, - sendAssetId: StellarAssetId, - destAssetId: StellarAssetId, + sendAsset: Asset, + destAsset: Asset, amount: string, memo?: string ) { try { // Derive the sponsor and account keypair from the provided secret. - const sponsorKeyPair = swSdk.Keypair.fromSecret(sponsorSecret); - const accountKeyPair = swSdk.Keypair.fromSecret(accountSecret); + const sponsorKeyPair = Keypair.fromSecret(sponsorSecret); + const accountKeyPair = Keypair.fromSecret(accountSecret); - // Initialize a transaction builder for the source account. - const txBuilder = await stellar.transaction({ - sourceAddress: new swSdk.AccountKeypair(accountKeyPair) - }); + const accountAccount = await stellarServer.loadAccount(accountKeyPair.publicKey()); - let transaction; + // Initialize a transaction builder for the source account. + let txBuilder = new TransactionBuilder(accountAccount, { + fee: "0", + networkPassphrase + }).setTimeout(30); + + const memoObj = this.createMemo(memo); + if (memoObj.type !== "none") { + txBuilder = txBuilder.addMemo(memoObj); + } // Determine if it's a direct transfer or a path payment (if assets are different). - if (this.isSameAsset(sendAssetId, destAssetId)) { + if (sendAsset.equals(destAsset)) { // Build a direct transfer operation. - transaction = txBuilder - .transfer( - destinationAddress, - sendAssetId, - amount - ) - .setMemo(this.createMemo(memo)) - .build(); + txBuilder = txBuilder.addOperation(Operation.payment({ + destination: destinationAddress, + asset: sendAsset, + amount + })); } else { // Build a path payment operation for different assets. - transaction = txBuilder - .pathPay({ - destinationAddress, - sendAsset: sendAssetId, - destAsset: destAssetId, - sendAmount: amount - }) - .setMemo(this.createMemo(memo)) - .build(); + txBuilder = txBuilder.addOperation(Operation.pathPaymentStrictSend({ + destination: destinationAddress, + sendAsset, + destAsset, + sendAmount: amount, + destMin: "0.0000001" // For simplicity, accepting any amount of destAsset. + })); } + const transaction = txBuilder.build(); + // Sign the transaction with the account's keypair. transaction.sign(accountKeyPair); // Create a fee-bump transaction with the sponsor paying the fees. - const feeBump = stellar.makeFeeBump({ - feeAddress: new swSdk.AccountKeypair(sponsorKeyPair), - transaction - }); + const baseFee = (await stellarServer.fetchBaseFee()).toString(); + const feeBump = TransactionBuilder.buildFeeBumpTransaction( + sponsorKeyPair, + baseFee, + transaction, + networkPassphrase + ); // Sign the fee-bump transaction with the sponsor's keypair. feeBump.sign(sponsorKeyPair); // Submit the signed fee-bump transaction to the Stellar network. - await stellar.submitTransaction(feeBump); + await stellarServer.submitTransaction(feeBump); // Return the hash of both the original transaction and the fee-bump transaction. return { @@ -519,37 +541,45 @@ export class StellarService { * Swaps an asset for another on the Stellar network. * @param sourceSecret - The secret key of the wallet to swap the asset from. * @param amount - The amount of the asset to swap. - * @param fromAssetId - The ID of the asset to swap from. - * @param toAssetId - The ID of the asset to swap to. + * @param fromAsset - The ID of the asset to swap from. + * @param toAsset - The ID of the asset to swap to. * @returns The hash of the transaction. */ async swapAsset( sourceSecret: string, amount: string, - fromAssetId: StellarAssetId = xlmAssetId, - toAssetId: StellarAssetId = usdcAssetId + fromAsset: Asset = xlmAsset, + toAsset: Asset = usdcAsset ) { try { // Create a keypair from the source secret. - const sourceKeypair = swSdk.Keypair.fromSecret(sourceSecret); + const sourceKeypair = Keypair.fromSecret(sourceSecret); + const sourceAccount = await stellarServer.loadAccount(sourceKeypair.publicKey()); // Initialize a transaction builder for the source account. - const txBuilder = await stellar.transaction({ - sourceAddress: new swSdk.AccountKeypair(sourceKeypair) - }); - - // Build the swap transaction. - const txSwap = txBuilder.swap(fromAssetId, toAssetId, amount).build(); + const txSwap = new TransactionBuilder(sourceAccount, { + fee: (await stellarServer.fetchBaseFee()).toString(), + networkPassphrase + }) + .addOperation(Operation.pathPaymentStrictSend({ + destination: sourceKeypair.publicKey(), + sendAsset: fromAsset, + sendAmount: amount, + destAsset: toAsset, + destMin: "0.0000001" + })) + .setTimeout(30) + .build(); // Sign the transaction with the source keypair. txSwap.sign(sourceKeypair); // Submit the swap transaction to the network. - await stellar.submitTransaction(txSwap); + await stellarServer.submitTransaction(txSwap); const txHash = txSwap.hash().toString("hex"); // Fetch effects to get the actual amount received - const effects = await stellar.server.effects() + const effects = await stellarServer.effects() .forTransaction(txHash) .call(); @@ -558,12 +588,11 @@ export class StellarService { const creditEffect = effects.records.find((effect: any) => { if (effect.type !== "account_credited") return false; - if (toAssetId instanceof swSdk.NativeAssetId) { + if (toAsset.isNative()) { return effect.asset_type === "native"; - } else if (toAssetId instanceof swSdk.IssuedAssetId) { - return effect.asset_code === toAssetId.code && effect.asset_issuer === toAssetId.issuer; + } else { + return effect.asset_code === toAsset.code && effect.asset_issuer === toAsset.issuer; } - return false; }); if (!creditEffect) { @@ -604,7 +633,7 @@ export class StellarService { */ async getAccountInfo(publicKey: string) { try { - const accountInfo = await account.getInfo({ accountAddress: publicKey }); + const accountInfo = await stellarServer.loadAccount(publicKey); return accountInfo; // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { @@ -635,7 +664,7 @@ export class StellarService { */ async getTopUpTransactions(publicKey: string) { // Get all payments for the account - const allPayments = await stellar.server.payments() + const allPayments = await stellarServer.payments() .forAccount(publicKey) .order("desc") .limit(100) @@ -647,7 +676,8 @@ export class StellarService { case "payment": return (payment as HorizonApi.PaymentOperationResponse).to === publicKey; case "path_payment_strict_receive": - return (payment as HorizonApi.PathPaymentOperationResponse).to === publicKey; + case "path_payment_strict_send": + return (payment as HorizonApi.PaymentOperationResponse).to === publicKey; default: return false; } diff --git a/package-lock.json b/package-lock.json index 36d1172..fb7d646 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@prisma/client": "^6.13.0", "@prisma/extension-accelerate": "^1.2.2", "@stellar/stellar-sdk": "^14.5.0", - "@stellar/typescript-wallet-sdk": "^1.9.0", "@types/express": "^5.0.0", "@types/node": "^22.13.10", "@types/winston": "^2.4.4", @@ -69,20 +68,13 @@ "vitest": "^4.1.3" } }, - "fxp-builder": { - "extraneous": true - }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", "license": "MIT", "peer": true }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -91,8 +83,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -101,8 +91,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { @@ -117,8 +105,6 @@ }, "node_modules/@babel/types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -131,16 +117,14 @@ }, "node_modules/@colors/colors": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -150,8 +134,7 @@ }, "node_modules/@dabh/diagnostics": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -194,8 +177,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -213,8 +194,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -223,8 +202,6 @@ }, "node_modules/@eslint/config-array": { "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -238,8 +215,6 @@ }, "node_modules/@eslint/config-array/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -256,15 +231,11 @@ }, "node_modules/@eslint/config-array/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -276,8 +247,6 @@ }, "node_modules/@eslint/core": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -289,8 +258,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -313,8 +280,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -331,8 +296,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -344,8 +307,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -354,15 +315,11 @@ }, "node_modules/@eslint/eslintrc/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -374,8 +331,6 @@ }, "node_modules/@eslint/js": { "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -387,8 +342,6 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -397,8 +350,6 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -411,32 +362,22 @@ }, "node_modules/@fastify/busboy": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", - "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", "license": "MIT" }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", "license": "Apache-2.0" }, "node_modules/@firebase/app-types": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", "license": "Apache-2.0" }, "node_modules/@firebase/auth-interop-types": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", "license": "Apache-2.0" }, "node_modules/@firebase/component": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz", - "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==", "license": "Apache-2.0", "dependencies": { "@firebase/util": "1.13.0", @@ -448,8 +389,6 @@ }, "node_modules/@firebase/database": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz", - "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", @@ -466,8 +405,6 @@ }, "node_modules/@firebase/database-compat": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz", - "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.7.0", @@ -483,8 +420,6 @@ }, "node_modules/@firebase/database-types": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz", - "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==", "license": "Apache-2.0", "dependencies": { "@firebase/app-types": "0.9.3", @@ -493,8 +428,6 @@ }, "node_modules/@firebase/logger": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", - "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -505,8 +438,6 @@ }, "node_modules/@firebase/util": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz", - "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -518,8 +449,6 @@ }, "node_modules/@google-cloud/firestore": { "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", - "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -535,8 +464,6 @@ }, "node_modules/@google-cloud/kms": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/kms/-/kms-5.4.0.tgz", - "integrity": "sha512-+06zUCaJM+wyZISM3F6u/jSqoBs0iZ8Aj9rqOJFePoWkNN7FbR4mQpV7okGHA+Y7caVgq+4QtIDKiFd17SZT+A==", "license": "Apache-2.0", "dependencies": { "google-gax": "^5.0.0" @@ -547,8 +474,6 @@ }, "node_modules/@google-cloud/kms/node_modules/@grpc/proto-loader": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", @@ -565,8 +490,6 @@ }, "node_modules/@google-cloud/kms/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -577,8 +500,6 @@ }, "node_modules/@google-cloud/kms/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -594,8 +515,6 @@ }, "node_modules/@google-cloud/kms/node_modules/gaxios": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -609,8 +528,6 @@ }, "node_modules/@google-cloud/kms/node_modules/gcp-metadata": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -623,8 +540,6 @@ }, "node_modules/@google-cloud/kms/node_modules/google-auth-library": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", - "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -641,8 +556,6 @@ }, "node_modules/@google-cloud/kms/node_modules/google-gax": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.6.tgz", - "integrity": "sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.12.6", @@ -663,8 +576,6 @@ }, "node_modules/@google-cloud/kms/node_modules/google-logging-utils": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -672,8 +583,6 @@ }, "node_modules/@google-cloud/kms/node_modules/gtoken": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", - "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", "license": "MIT", "dependencies": { "gaxios": "^7.0.0", @@ -685,14 +594,10 @@ }, "node_modules/@google-cloud/kms/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/@google-cloud/kms/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -709,8 +614,6 @@ }, "node_modules/@google-cloud/kms/node_modules/retry-request": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.2.tgz", - "integrity": "sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==", "license": "MIT", "dependencies": { "extend": "^3.0.2", @@ -722,8 +625,6 @@ }, "node_modules/@google-cloud/kms/node_modules/rimraf": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "license": "ISC", "dependencies": { "glob": "^10.3.7" @@ -737,8 +638,6 @@ }, "node_modules/@google-cloud/kms/node_modules/teeny-request": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.0.tgz", - "integrity": "sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==", "license": "Apache-2.0", "dependencies": { "http-proxy-agent": "^5.0.0", @@ -752,8 +651,6 @@ }, "node_modules/@google-cloud/kms/node_modules/teeny-request/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -765,8 +662,6 @@ }, "node_modules/@google-cloud/paginator": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -779,8 +674,6 @@ }, "node_modules/@google-cloud/projectify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "license": "Apache-2.0", "optional": true, "engines": { @@ -789,8 +682,6 @@ }, "node_modules/@google-cloud/promisify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", "license": "Apache-2.0", "optional": true, "engines": { @@ -799,8 +690,6 @@ }, "node_modules/@google-cloud/storage": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.19.0.tgz", - "integrity": "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -826,8 +715,6 @@ }, "node_modules/@google-cloud/storage/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "optional": true, "bin": { @@ -836,8 +723,6 @@ }, "node_modules/@google-cloud/tasks": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@google-cloud/tasks/-/tasks-6.2.1.tgz", - "integrity": "sha512-Y21jNAdaUwZvYQijJSE9E27NA87c/Wl9fZxNDGx6WsWFFGEBmJmc1zg2fXLXTW0kPvKIxHQC+IcKa9SNgvIEsQ==", "license": "Apache-2.0", "dependencies": { "google-gax": "^5.0.0" @@ -848,8 +733,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/@grpc/proto-loader": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", @@ -866,8 +749,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -878,8 +759,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -895,8 +774,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/gaxios": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", - "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -909,8 +786,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/gcp-metadata": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -923,8 +798,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/google-auth-library": { "version": "10.6.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", - "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -940,8 +813,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/google-gax": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.6.tgz", - "integrity": "sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.12.6", @@ -962,8 +833,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/google-logging-utils": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -971,14 +840,10 @@ }, "node_modules/@google-cloud/tasks/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/@google-cloud/tasks/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -995,8 +860,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/retry-request": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.2.tgz", - "integrity": "sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==", "license": "MIT", "dependencies": { "extend": "^3.0.2", @@ -1008,8 +871,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/rimraf": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "license": "ISC", "dependencies": { "glob": "^10.3.7" @@ -1023,8 +884,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/teeny-request": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.0.tgz", - "integrity": "sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==", "license": "Apache-2.0", "dependencies": { "http-proxy-agent": "^5.0.0", @@ -1038,8 +897,6 @@ }, "node_modules/@google-cloud/tasks/node_modules/teeny-request/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -1051,8 +908,7 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz", - "integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==", + "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -1063,8 +919,7 @@ }, "node_modules/@grpc/proto-loader": { "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -1080,8 +935,6 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1090,8 +943,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1104,9 +955,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1117,8 +967,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1131,8 +979,6 @@ }, "node_modules/@isaacs/cliui": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", "license": "BlueOak-1.0.0", "engines": { "node": ">=18" @@ -1140,22 +986,18 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1163,17 +1005,16 @@ }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", - "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "dev": true, "license": "MIT", "optional": true, @@ -1191,8 +1032,6 @@ }, "node_modules/@noble/ciphers": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1203,8 +1042,6 @@ }, "node_modules/@noble/curves": { "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -1218,8 +1055,7 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -1229,8 +1065,7 @@ }, "node_modules/@octokit/app": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/app/-/app-14.1.0.tgz", - "integrity": "sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw==", + "license": "MIT", "dependencies": { "@octokit/auth-app": "^6.0.0", "@octokit/auth-unauthenticated": "^5.0.0", @@ -1246,16 +1081,14 @@ }, "node_modules/@octokit/app/node_modules/@octokit/auth-token": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/app/node_modules/@octokit/core": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", - "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -1271,21 +1104,18 @@ }, "node_modules/@octokit/app/node_modules/@octokit/core/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/core/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/app/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1296,21 +1126,18 @@ }, "node_modules/@octokit/app/node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/endpoint/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/app/node_modules/@octokit/graphql": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "license": "MIT", "dependencies": { "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", @@ -1322,26 +1149,22 @@ }, "node_modules/@octokit/app/node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/graphql/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/app/node_modules/@octokit/openapi-types": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" + "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/plugin-paginate-rest": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", - "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "license": "MIT", "dependencies": { "@octokit/types": "^12.6.0" }, @@ -1354,8 +1177,7 @@ }, "node_modules/@octokit/app/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -1368,8 +1190,7 @@ }, "node_modules/@octokit/app/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1381,52 +1202,44 @@ }, "node_modules/@octokit/app/node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/request-error/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/app/node_modules/@octokit/request/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/request/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/app/node_modules/@octokit/types": { "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@octokit/app/node_modules/before-after-hook": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + "license": "Apache-2.0" }, "node_modules/@octokit/app/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/auth-app": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.1.4.tgz", - "integrity": "sha512-QkXkSOHZK4dA5oUqY5Dk3S+5pN2s1igPjEASNQV8/vgJgW034fQWR16u7VsNOK/EljA00eyjYF5mWNxWKWhHRQ==", + "license": "MIT", "dependencies": { "@octokit/auth-oauth-app": "^7.1.0", "@octokit/auth-oauth-user": "^4.1.0", @@ -1444,8 +1257,7 @@ }, "node_modules/@octokit/auth-app/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1456,13 +1268,11 @@ }, "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/auth-app/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -1475,8 +1285,7 @@ }, "node_modules/@octokit/auth-app/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1488,8 +1297,7 @@ }, "node_modules/@octokit/auth-app/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } @@ -1497,21 +1305,18 @@ "node_modules/@octokit/auth-app/node_modules/lru-cache": { "name": "@wolfy1339/lru-cache", "version": "11.0.2-patch.1", - "resolved": "https://registry.npmjs.org/@wolfy1339/lru-cache/-/lru-cache-11.0.2-patch.1.tgz", - "integrity": "sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==", + "license": "ISC", "engines": { "node": "18 >=18.20 || 20 || >=22" } }, "node_modules/@octokit/auth-app/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/auth-oauth-app": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.1.0.tgz", - "integrity": "sha512-w+SyJN/b0l/HEb4EOPRudo7uUOSW51jcK1jwLa+4r7PA8FPFpoxEnHBHMITqCsc/3Vo2qqFjgQfz/xUUvsSQnA==", + "license": "MIT", "dependencies": { "@octokit/auth-oauth-device": "^6.1.0", "@octokit/auth-oauth-user": "^4.1.0", @@ -1527,8 +1332,7 @@ }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1539,13 +1343,11 @@ }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -1558,8 +1360,7 @@ }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1571,21 +1372,18 @@ }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/auth-oauth-app/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/auth-oauth-device": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.1.0.tgz", - "integrity": "sha512-FNQ7cb8kASufd6Ej4gnJ3f1QB5vJitkoV1O0/g6e6lUsQ7+VsSNRHRmFScN2tV4IgKA12frrr/cegUs0t+0/Lw==", + "license": "MIT", "dependencies": { "@octokit/oauth-methods": "^4.1.0", "@octokit/request": "^8.3.1", @@ -1598,8 +1396,7 @@ }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1610,13 +1407,11 @@ }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -1629,8 +1424,7 @@ }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1642,21 +1436,18 @@ }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/auth-oauth-device/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/auth-oauth-user": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.1.0.tgz", - "integrity": "sha512-FrEp8mtFuS/BrJyjpur+4GARteUCrPeR/tZJzD8YourzoVhRics7u7we/aDcKv+yywRNwNi/P4fRi631rG/OyQ==", + "license": "MIT", "dependencies": { "@octokit/auth-oauth-device": "^6.1.0", "@octokit/oauth-methods": "^4.1.0", @@ -1671,8 +1462,7 @@ }, "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1683,13 +1473,11 @@ }, "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -1702,8 +1490,7 @@ }, "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1715,29 +1502,25 @@ }, "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/auth-oauth-user/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/auth-token": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@octokit/auth-unauthenticated": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz", - "integrity": "sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==", + "license": "MIT", "dependencies": { "@octokit/request-error": "^5.0.0", "@octokit/types": "^12.0.0" @@ -1748,13 +1531,11 @@ }, "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/openapi-types": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" + "license": "MIT" }, "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1766,29 +1547,25 @@ }, "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/request-error/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/auth-unauthenticated/node_modules/@octokit/types": { "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@octokit/core": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz", - "integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.1", @@ -1804,8 +1581,7 @@ }, "node_modules/@octokit/endpoint": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", - "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", + "license": "MIT", "dependencies": { "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" @@ -1816,8 +1592,7 @@ }, "node_modules/@octokit/graphql": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", - "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", + "license": "MIT", "dependencies": { "@octokit/request": "^10.0.2", "@octokit/types": "^14.0.0", @@ -1829,8 +1604,7 @@ }, "node_modules/@octokit/oauth-app": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-6.1.0.tgz", - "integrity": "sha512-nIn/8eUJ/BKUVzxUXd5vpzl1rwaVxMyYbQkNZjHrF7Vk/yu98/YDF/N2KeWO7uZ0g3b5EyiFXFkZI8rJ+DH1/g==", + "license": "MIT", "dependencies": { "@octokit/auth-oauth-app": "^7.0.0", "@octokit/auth-oauth-user": "^4.0.0", @@ -1847,16 +1621,14 @@ }, "node_modules/@octokit/oauth-app/node_modules/@octokit/auth-token": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/oauth-app/node_modules/@octokit/core": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", - "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -1872,8 +1644,7 @@ }, "node_modules/@octokit/oauth-app/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1884,8 +1655,7 @@ }, "node_modules/@octokit/oauth-app/node_modules/@octokit/graphql": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "license": "MIT", "dependencies": { "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", @@ -1897,13 +1667,11 @@ }, "node_modules/@octokit/oauth-app/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/oauth-app/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -1916,8 +1684,7 @@ }, "node_modules/@octokit/oauth-app/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -1929,34 +1696,29 @@ }, "node_modules/@octokit/oauth-app/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/oauth-app/node_modules/before-after-hook": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + "license": "Apache-2.0" }, "node_modules/@octokit/oauth-app/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/oauth-authorization-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz", - "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==", + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/oauth-methods": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.1.0.tgz", - "integrity": "sha512-4tuKnCRecJ6CG6gr0XcEXdZtkTDbfbnD5oaHBmLERTjTMZNi2CbfEHZxPU41xXLDG4DfKf+sonu00zvKI9NSbw==", + "license": "MIT", "dependencies": { "@octokit/oauth-authorization-url": "^6.0.2", "@octokit/request": "^8.3.1", @@ -1970,8 +1732,7 @@ }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -1982,13 +1743,11 @@ }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -2001,8 +1760,7 @@ }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -2014,26 +1772,22 @@ }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/oauth-methods/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/@octokit/openapi-types": { "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-graphql": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.1.tgz", - "integrity": "sha512-R8ZQNmrIKKpHWC6V2gum4x9LG2qF1RxRjo27gjQcG3j+vf2tLsEfE7I/wRWEPzYMaenr1M+qDAtNcwZve1ce1A==", + "license": "MIT", "engines": { "node": ">= 18" }, @@ -2043,8 +1797,7 @@ }, "node_modules/@octokit/plugin-paginate-rest": { "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz", - "integrity": "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==", + "license": "MIT", "dependencies": { "@octokit/types": "^14.1.0" }, @@ -2057,8 +1810,7 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", - "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", + "license": "MIT", "engines": { "node": ">= 20" }, @@ -2068,8 +1820,7 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz", - "integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==", + "license": "MIT", "dependencies": { "@octokit/types": "^14.1.0" }, @@ -2082,8 +1833,7 @@ }, "node_modules/@octokit/request": { "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", - "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.0", "@octokit/request-error": "^7.0.0", @@ -2097,8 +1847,7 @@ }, "node_modules/@octokit/request-error": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", - "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", + "license": "MIT", "dependencies": { "@octokit/types": "^14.0.0" }, @@ -2108,8 +1857,7 @@ }, "node_modules/@octokit/rest": { "version": "22.0.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.0.tgz", - "integrity": "sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA==", + "license": "MIT", "dependencies": { "@octokit/core": "^7.0.2", "@octokit/plugin-paginate-rest": "^13.0.1", @@ -2122,16 +1870,14 @@ }, "node_modules/@octokit/types": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^25.1.0" } }, "node_modules/@octokit/webhooks": { "version": "12.3.2", - "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.3.2.tgz", - "integrity": "sha512-exj1MzVXoP7xnAcAB3jZ97pTvVPkQF9y6GA/dvYC47HV7vLv+24XRS6b/v/XnyikpEuvMhugEXdGtAlU086WkQ==", + "license": "MIT", "dependencies": { "@octokit/request-error": "^5.0.0", "@octokit/webhooks-methods": "^4.1.0", @@ -2144,26 +1890,22 @@ }, "node_modules/@octokit/webhooks-methods": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-4.1.0.tgz", - "integrity": "sha512-zoQyKw8h9STNPqtm28UGOYFE7O6D4Il8VJwhAtMHFt2C4L0VQT1qGKLeefUOqHNs1mNRYSadVv7x0z8U2yyeWQ==", + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/webhooks-types": { "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz", - "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==" + "license": "MIT" }, "node_modules/@octokit/webhooks/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/@octokit/webhooks/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -2175,16 +1917,13 @@ }, "node_modules/@octokit/webhooks/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@opentelemetry/api": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", "optional": true, "engines": { @@ -2193,8 +1932,6 @@ }, "node_modules/@oxc-project/types": { "version": "0.123.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.123.0.tgz", - "integrity": "sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==", "dev": true, "license": "MIT", "funding": { @@ -2203,15 +1940,11 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, "license": "MIT" }, "node_modules/@prisma/client": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.13.0.tgz", - "integrity": "sha512-8m2+I3dQovkV8CkDMluiwEV1TxV9EXdT6xaCz39O6jYw7mkf5gwfmi+cL4LJsEPwz5tG7sreBwkRpEMJedGYUQ==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -2232,8 +1965,6 @@ }, "node_modules/@prisma/config": { "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.12.0.tgz", - "integrity": "sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -2242,8 +1973,6 @@ }, "node_modules/@prisma/config/node_modules/jiti": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "devOptional": true, "license": "MIT", "bin": { @@ -2252,15 +1981,11 @@ }, "node_modules/@prisma/debug": { "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.12.0.tgz", - "integrity": "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.12.0.tgz", - "integrity": "sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -2273,15 +1998,11 @@ }, "node_modules/@prisma/engines-version": { "version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc.tgz", - "integrity": "sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/extension-accelerate": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@prisma/extension-accelerate/-/extension-accelerate-1.3.0.tgz", - "integrity": "sha512-W41D+kWejVJvMFEh45oYIU0VY+lIE3hh5vyHLHxgpyOfF+EHzSr8EIPT9kPRJg1FTYR7WGutXi64nyaNFUJ06A==", "engines": { "node": ">=16" }, @@ -2291,8 +2012,6 @@ }, "node_modules/@prisma/fetch-engine": { "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.12.0.tgz", - "integrity": "sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -2303,8 +2022,6 @@ }, "node_modules/@prisma/get-platform": { "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.12.0.tgz", - "integrity": "sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -2313,28 +2030,23 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -2342,28 +2054,23 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "license": "BSD-3-Clause" }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.0-rc.13", @@ -2607,8 +2314,6 @@ }, "node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.13.tgz", - "integrity": "sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==", "cpu": [ "x64" ], @@ -2624,15 +2329,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz", - "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==", "dev": true, "license": "MIT" }, "node_modules/@scure/base": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" @@ -2640,8 +2341,6 @@ }, "node_modules/@scure/bip32": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", "license": "MIT", "dependencies": { "@noble/curves": "~1.9.0", @@ -2654,8 +2353,6 @@ }, "node_modules/@scure/bip39": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", "license": "MIT", "dependencies": { "@noble/hashes": "~1.8.0", @@ -2667,8 +2364,7 @@ }, "node_modules/@so-ric/colorspace": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -2676,14 +2372,10 @@ }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "license": "MIT" }, "node_modules/@spruceid/siwe-parser": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@spruceid/siwe-parser/-/siwe-parser-2.1.2.tgz", - "integrity": "sha512-d/r3S1LwJyMaRAKQ0awmo9whfXeE88Qt00vRj91q5uv5ATtWIQEGJ67Yr5eSZw5zp1/fZCXZYuEckt8lSkereQ==", "license": "Apache-2.0", "dependencies": { "@noble/hashes": "^1.1.2", @@ -2692,15 +2384,8 @@ "valid-url": "^1.0.9" } }, - "node_modules/@stablelib/base64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-2.0.1.tgz", - "integrity": "sha512-P2z89A7N1ETt6RxgpVdDT2xlg8cnm3n6td0lY9gyK7EiWK3wdq388yFX/hLknkCC0we05OZAD1rfxlQJUbl5VQ==" - }, "node_modules/@stablelib/binary": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", - "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", "license": "MIT", "dependencies": { "@stablelib/int": "^1.0.1" @@ -2708,48 +2393,31 @@ }, "node_modules/@stablelib/int": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", - "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==", "license": "MIT" }, "node_modules/@stablelib/random": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", - "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", "license": "MIT", "dependencies": { "@stablelib/binary": "^1.0.1", "@stablelib/wipe": "^1.0.1" } }, - "node_modules/@stablelib/utf8": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/utf8/-/utf8-2.0.1.tgz", - "integrity": "sha512-7+C2Iap42fbLyoKMaEIIDSb1TrcQVo+lGDItYAwb2JoAJr7QffyuDnbtvV/qzTyokOIMBrJgT+Rpsp1bPR8SjA==" - }, "node_modules/@stablelib/wipe": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", - "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==", "license": "MIT" }, "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, "node_modules/@stellar/js-xdr": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", "license": "Apache-2.0" }, "node_modules/@stellar/stellar-base": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", - "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.9.6", @@ -2765,8 +2433,6 @@ }, "node_modules/@stellar/stellar-sdk": { "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.6.1.tgz", - "integrity": "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg==", "license": "Apache-2.0", "dependencies": { "@stellar/stellar-base": "^14.1.0", @@ -2788,93 +2454,13 @@ }, "node_modules/@stellar/stellar-sdk/node_modules/eventsource": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@stellar/typescript-wallet-sdk": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@stellar/typescript-wallet-sdk/-/typescript-wallet-sdk-1.9.0.tgz", - "integrity": "sha512-6iHTsXFP7Ndw6IkmibOi4HW8fiNgRgi78jn7q6ReO4cWyFXhkkfHrj7vkY1Q/WmV6CZtjuM9kppW1TpfG0PCOg==", - "license": "Apache-2.0", - "dependencies": { - "@stablelib/base64": "^2.0.0", - "@stablelib/utf8": "^2.0.0", - "@stellar/stellar-sdk": "13.0.0-beta.1", - "axios": "^1.4.0", - "base64url": "^3.0.1", - "https-browserify": "^1.0.0", - "jws": "^4.0.0", - "lodash": "^4.17.21", - "query-string": "^7.1.3", - "stream-http": "^3.2.0", - "tweetnacl": "^1.0.3", - "url": "^0.11.0", - "util": "^0.12.5", - "utility-types": "^3.10.0", - "vm-browserify": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@stellar/typescript-wallet-sdk/node_modules/@stellar/stellar-base": { - "version": "13.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.0.0-beta.1.tgz", - "integrity": "sha512-S5c2FyKwUOc28/3sDoOfPIcdzcbUyfiYRmcUlscZrEX/VVzV12216XRkdWy2MYa8KQNK60MpR7wrGp2MamvVGg==", - "license": "Apache-2.0", - "dependencies": { - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.1.2", - "buffer": "^6.0.3", - "sha.js": "^2.3.6", - "tweetnacl": "^1.0.3" - }, - "optionalDependencies": { - "sodium-native": "^4.1.1" - } - }, - "node_modules/@stellar/typescript-wallet-sdk/node_modules/@stellar/stellar-sdk": { - "version": "13.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-13.0.0-beta.1.tgz", - "integrity": "sha512-yJN2HzibhZFJsdLRU83bkUwb9dq1sZRRiQptTJyunVv0hQsF+tTldrP3hHst3LROv/2GWTn20tmAqnp0hkzOhg==", - "license": "Apache-2.0", - "dependencies": { - "@stellar/stellar-base": "13.0.0-beta.1", - "axios": "^1.7.7", - "bignumber.js": "^9.1.2", - "eventsource": "^2.0.2", - "feaxios": "^0.0.20", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - } - }, - "node_modules/@stellar/typescript-wallet-sdk/node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "license": "MIT", "engines": { "node": ">=12.0.0" } }, - "node_modules/@stellar/typescript-wallet-sdk/node_modules/feaxios": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.20.tgz", - "integrity": "sha512-g3hm2YDNffNxA3Re3Hd8ahbpmDee9Fv1Pb1C/NoWsjY7mtD8nyNeJytUzn+DK0Hyl9o6HppeWOrtnqgmhOYfWA==", - "license": "MIT", - "dependencies": { - "is-retry-allowed": "^3.0.0" - } - }, "node_modules/@tootallnate/once": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-3.0.1.tgz", - "integrity": "sha512-VyMVKRrpHTT8PnotUeV8L/mDaMwD5DaAKCFLP73zAqAtvF0FCqky+Ki7BYbFCYQmqFyTe9316Ed5zS70QUR9eg==", "license": "MIT", "engines": { "node": ">= 10" @@ -2882,23 +2468,19 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + "license": "MIT" }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", @@ -2913,13 +2495,11 @@ }, "node_modules/@types/aws-lambda": { "version": "8.10.152", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz", - "integrity": "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==" + "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2927,20 +2507,15 @@ }, "node_modules/@types/btoa-lite": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", - "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==" + "license": "MIT" }, "node_modules/@types/caseless": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "license": "MIT", "optional": true }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -2950,60 +2525,50 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cookiejar": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/cors": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/crypto-js": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", - "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/eventsource": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-3.0.0.tgz", - "integrity": "sha512-yEhFj31FTD29DtNeqePu+A+lD6loRef6YOM5XfN1kUwBHyy2DySGlA3jJU+FbQSkrfmlBVluf2Dub/OyReFGKA==", "deprecated": "This is a stub types definition. eventsource provides its own type definitions, so you do not need this installed.", "dev": true, + "license": "MIT", "dependencies": { "eventsource": "*" } }, "node_modules/@types/express": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz", - "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -3012,8 +2577,6 @@ }, "node_modules/@types/express-rate-limit": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@types/express-rate-limit/-/express-rate-limit-5.1.3.tgz", - "integrity": "sha512-H+TYy3K53uPU2TqPGFYaiWc2xJV6+bIFkDd/Ma2/h67Pa6ARk9kWE0p/K9OH1Okm0et9Sfm66fmXoAxsH2PHXg==", "dev": true, "license": "MIT", "dependencies": { @@ -3022,8 +2585,7 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3033,20 +2595,16 @@ }, "node_modules/@types/http-errors": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/jsonwebtoken": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", - "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "license": "MIT", "dependencies": { "@types/ms": "*", "@types/node": "*" @@ -3054,65 +2612,52 @@ }, "node_modules/@types/lodash": { "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "dev": true, "license": "MIT" }, "node_modules/@types/long": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "license": "MIT", "optional": true }, "node_modules/@types/methods": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "license": "MIT" }, "node_modules/@types/morgan": { "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", - "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + "license": "MIT" }, "node_modules/@types/node": { "version": "22.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", - "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==" + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "license": "MIT" }, "node_modules/@types/request": { "version": "2.48.13", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", - "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", "license": "MIT", "optional": true, "dependencies": { @@ -3124,8 +2669,6 @@ }, "node_modules/@types/request/node_modules/form-data": { "version": "2.5.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", - "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "license": "MIT", "optional": true, "dependencies": { @@ -3142,8 +2685,7 @@ }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3151,8 +2693,7 @@ }, "node_modules/@types/serve-static": { "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -3161,21 +2702,18 @@ }, "node_modules/@types/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/strip-json-comments": { "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/superagent": { "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", @@ -3185,9 +2723,8 @@ }, "node_modules/@types/supertest": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", "dev": true, + "license": "MIT", "dependencies": { "@types/methods": "^1.1.4", "@types/superagent": "^8.1.0" @@ -3195,29 +2732,22 @@ }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "license": "MIT", "optional": true }, "node_modules/@types/triple-beam": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + "license": "MIT" }, "node_modules/@types/winston": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==", - "deprecated": "This is a stub types definition. winston provides its own type definitions, so you do not need this installed.", + "license": "MIT", "dependencies": { "winston": "*" } }, "node_modules/@types/ws": { "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3225,8 +2755,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", - "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3254,8 +2782,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", - "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { @@ -3279,9 +2805,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3296,14 +2821,11 @@ }, "node_modules/@typescript-eslint/parser/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/project-service": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", - "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { @@ -3324,8 +2846,6 @@ }, "node_modules/@typescript-eslint/project-service/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -3342,15 +2862,11 @@ }, "node_modules/@typescript-eslint/project-service/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", - "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { @@ -3367,8 +2883,6 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", - "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -3384,8 +2898,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", - "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { @@ -3409,8 +2921,6 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -3427,15 +2937,11 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/types": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", - "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -3448,8 +2954,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", - "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3476,8 +2980,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -3494,15 +2996,11 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", - "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3525,8 +3023,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", - "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { @@ -3543,8 +3039,6 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3556,8 +3050,6 @@ }, "node_modules/@vitest/coverage-v8": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.3.tgz", - "integrity": "sha512-/MBdrkA8t6hbdCWFKs09dPik774xvs4Z6L4bycdCxYNLHM8oZuRyosumQMG19LUlBsB6GeVpL1q4kFFazvyKGA==", "dev": true, "license": "MIT", "dependencies": { @@ -3587,8 +3079,6 @@ }, "node_modules/@vitest/coverage-v8/node_modules/@bcoe/v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { @@ -3597,8 +3087,6 @@ }, "node_modules/@vitest/expect": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.3.tgz", - "integrity": "sha512-CW8Q9KMtXDGHj0vCsqui0M5KqRsu0zm0GNDW7Gd3U7nZ2RFpPKSCpeCXoT+/+5zr1TNlsoQRDEz+LzZUyq6gnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3615,8 +3103,6 @@ }, "node_modules/@vitest/mocker": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.3.tgz", - "integrity": "sha512-XN3TrycitDQSzGRnec/YWgoofkYRhouyVQj4YNsJ5r/STCUFqMrP4+oxEv3e7ZbLi4og5kIHrZwekDJgw6hcjw==", "dev": true, "license": "MIT", "dependencies": { @@ -3642,8 +3128,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.3.tgz", - "integrity": "sha512-hYqqwuMbpkkBodpRh4k4cQSOELxXky1NfMmQvOfKvV8zQHz8x8Dla+2wzElkMkBvSAJX5TRGHJAQvK0TcOafwg==", "dev": true, "license": "MIT", "dependencies": { @@ -3655,8 +3139,6 @@ }, "node_modules/@vitest/runner": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.3.tgz", - "integrity": "sha512-VwgOz5MmT0KhlUj40h02LWDpUBVpflZ/b7xZFA25F29AJzIrE+SMuwzFf0b7t4EXdwRNX61C3B6auIXQTR3ttA==", "dev": true, "license": "MIT", "dependencies": { @@ -3669,8 +3151,6 @@ }, "node_modules/@vitest/snapshot": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.3.tgz", - "integrity": "sha512-9l+k/J9KG5wPJDX9BcFFzhhwNjwkRb8RsnYhaT1vPY7OufxmQFc9sZzScRCPTiETzl37mrIWVY9zxzmdVeJwDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3685,8 +3165,6 @@ }, "node_modules/@vitest/spy": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.3.tgz", - "integrity": "sha512-ujj5Uwxagg4XUIfAUyRQxAg631BP6e9joRiN99mr48Bg9fRs+5mdUElhOoZ6rP5mBr8Bs3lmrREnkrQWkrsTCw==", "dev": true, "license": "MIT", "funding": { @@ -3695,8 +3173,6 @@ }, "node_modules/@vitest/ui": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.3.tgz", - "integrity": "sha512-xBPy+43o1fgMLUDlufUXh7tlT/Es8uS5eiyBY2PyPfFYSGpApZskLw65DROoDz+rgYkPuAmb20Mv9Z9g1WQE7w==", "dev": true, "license": "MIT", "dependencies": { @@ -3717,8 +3193,6 @@ }, "node_modules/@vitest/utils": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.3.tgz", - "integrity": "sha512-Pc/Oexse/khOWsGB+w3q4yzA4te7W4gpZZAvk+fr8qXfTURZUMj5i7kuxsNK5mP/dEB6ao3jfr0rs17fHhbHdw==", "dev": true, "license": "MIT", "dependencies": { @@ -3732,8 +3206,6 @@ }, "node_modules/@x402/core": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@x402/core/-/core-2.9.0.tgz", - "integrity": "sha512-IqPITHYx6XHlgLPtparuKKwoB+3wQdgt0F+WUH1e3WHMeiWdp+xTtQDy+6yOKuObNFI1S1iVbQFz0GivR/Vv3w==", "license": "Apache-2.0", "dependencies": { "zod": "^3.24.2" @@ -3741,8 +3213,6 @@ }, "node_modules/@x402/express": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@x402/express/-/express-2.9.0.tgz", - "integrity": "sha512-E236c188p7rkAILnzdd19FQZuTEOM9+DP/y/FG4B0oawiBXx5FGR5ez7EUKCG7V7FxXsGvMEjUFMJ0BjrQx8yw==", "license": "Apache-2.0", "dependencies": { "@x402/core": "~2.9.0", @@ -3762,8 +3232,6 @@ }, "node_modules/@x402/extensions": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@x402/extensions/-/extensions-2.9.0.tgz", - "integrity": "sha512-Fk7MJFWSQtsRGGZcNpgwv8V6IG38USNciA5ImkF0InceWDfjMBq6b8GmksM+cVHAXQsMQYxw3HV8uhfwTPEGAQ==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.9.0", @@ -3779,8 +3247,6 @@ }, "node_modules/@x402/extensions/node_modules/ajv": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3795,8 +3261,6 @@ }, "node_modules/@x402/extensions/node_modules/jose": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -3804,14 +3268,10 @@ }, "node_modules/@x402/extensions/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/@x402/stellar": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@x402/stellar/-/stellar-2.9.0.tgz", - "integrity": "sha512-VZ77WugghMuSeCsvDpK4cKt5OyDXqAnH2IPBG/FbAvwAkOyhPCPHWK/Q33NbqKDIyV8W2xB/vg12Nj7UMp/qRQ==", "license": "Apache-2.0", "dependencies": { "@stellar/stellar-sdk": "^14.6.1", @@ -3820,8 +3280,6 @@ }, "node_modules/abitype": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", - "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" @@ -3841,8 +3299,6 @@ }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "optional": true, "dependencies": { @@ -3854,8 +3310,7 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3866,8 +3321,6 @@ }, "node_modules/acorn": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3878,8 +3331,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3888,8 +3339,7 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -3899,23 +3349,19 @@ }, "node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT", "peer": true }, "node_modules/agent-base": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3926,8 +3372,6 @@ }, "node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -3943,16 +3387,14 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3965,8 +3407,7 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3977,8 +3418,6 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -3989,31 +3428,23 @@ }, "node_modules/apg-js": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/apg-js/-/apg-js-4.4.0.tgz", - "integrity": "sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==", "license": "BSD-2-Clause" }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "license": "MIT" }, "node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "license": "MIT", "optional": true, "engines": { @@ -4022,14 +3453,11 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -4038,8 +3466,6 @@ }, "node_modules/ast-v8-to-istanbul": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -4050,8 +3476,6 @@ }, "node_modules/ast-v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -4061,20 +3485,15 @@ }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + "license": "MIT" }, "node_modules/async-retry": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "license": "MIT", "optional": true, "dependencies": { @@ -4083,13 +3502,11 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4102,8 +3519,6 @@ }, "node_modules/axios": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -4113,61 +3528,13 @@ }, "node_modules/balanced-match": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "license": "MIT", "engines": { "node": "20 || >=22" } }, - "node_modules/bare-addon-resolve": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.9.6.tgz", - "integrity": "sha512-hvOQY1zDK6u0rSr27T6QlULoVLwi8J2k8HHHJlxSfT7XQdQ/7bsS+AnjYkHtu/TkL+gm3aMXAKucJkJAbrDG/g==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-module-resolve": "^1.10.0", - "bare-semver": "^1.0.0" - }, - "peerDependencies": { - "bare-url": "*" - }, - "peerDependenciesMeta": { - "bare-url": { - "optional": true - } - } - }, - "node_modules/bare-module-resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.0.tgz", - "integrity": "sha512-JrzrqlC3Tds0iKRwQs8xIIJ+FRieKA9ll0jaqpotDLZtjJPVevzRoeuUYZ5GIo1t1z7/pIRdk85Q3i/2xQLfEQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-semver": "^1.0.0" - }, - "peerDependencies": { - "bare-url": "*" - }, - "peerDependenciesMeta": { - "bare-url": { - "optional": true - } - } - }, - "node_modules/bare-semver": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.2.tgz", - "integrity": "sha512-ESVaN2nzWhcI5tf3Zzcq9aqCZ676VWzqw07eEZ0qxAcEOAFYBa0pWq8sK34OQeHLY3JsfKXZS9mDyzyxGjeLzA==", - "license": "Apache-2.0", - "optional": true - }, "node_modules/base32.js": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -4175,8 +3542,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4190,29 +3555,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64id": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" }, @@ -4222,18 +3577,14 @@ }, "node_modules/basic-auth/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/before-after-hook": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==" + "license": "Apache-2.0" }, "node_modules/bignumber.js": { "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", "engines": { "node": "*" @@ -4241,8 +3592,7 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -4252,8 +3602,6 @@ }, "node_modules/body-parser": { "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -4276,8 +3624,6 @@ }, "node_modules/body-parser/node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -4296,8 +3642,6 @@ }, "node_modules/body-parser/node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4305,13 +3649,10 @@ }, "node_modules/bottleneck": { "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + "license": "MIT" }, "node_modules/brace-expansion": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -4322,8 +3663,7 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4333,13 +3673,10 @@ }, "node_modules/btoa-lite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==" + "license": "MIT" }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -4362,25 +3699,15 @@ }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "dev": true, + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4388,8 +3715,7 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -4405,8 +3731,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -4417,8 +3742,7 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -4432,8 +3756,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -4442,8 +3764,6 @@ }, "node_modules/chai": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -4452,9 +3772,8 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4468,18 +3787,16 @@ }, "node_modules/chalk/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4489,8 +3806,7 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4512,16 +3828,14 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4533,8 +3847,7 @@ }, "node_modules/color": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz", - "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", + "license": "MIT", "dependencies": { "color-convert": "^3.0.1", "color-string": "^2.0.0" @@ -4545,8 +3858,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4556,13 +3868,11 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/color-string": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz", - "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", + "license": "MIT", "dependencies": { "color-name": "^2.0.0" }, @@ -4572,16 +3882,14 @@ }, "node_modules/color-string/node_modules/color-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/color/node_modules/color-convert": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz", - "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", + "license": "MIT", "dependencies": { "color-name": "^2.0.0" }, @@ -4591,16 +3899,14 @@ }, "node_modules/color/node_modules/color-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -4610,8 +3916,6 @@ }, "node_modules/commander": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", "engines": { "node": ">=20" @@ -4619,17 +3923,15 @@ }, "node_modules/component-emitter": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -4639,23 +3941,18 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4663,19 +3960,16 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "license": "MIT" }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -4686,13 +3980,11 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4704,20 +3996,14 @@ }, "node_modules/crypto-js": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "license": "MIT" }, "node_modules/cuid": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-3.0.0.tgz", - "integrity": "sha512-WZYYkHdIDnaxdeP8Misq3Lah5vFjJwGuItJuV+tvMafosMzw0nF297T7mrm8IOWiPJkV6gc7sa8pzx27+w25Zg==", - "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead.", "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", "engines": { "node": ">= 12" @@ -4725,30 +4011,19 @@ }, "node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4763,29 +4038,25 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/deprecation": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "license": "ISC" }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -4793,8 +4064,6 @@ }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4803,9 +4072,8 @@ }, "node_modules/dezalgo": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, + "license": "ISC", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -4813,8 +4081,6 @@ }, "node_modules/diff": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -4822,8 +4088,6 @@ }, "node_modules/dotenv": { "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -4834,8 +4098,7 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -4847,8 +4110,7 @@ }, "node_modules/duplexify": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -4858,56 +4120,47 @@ }, "node_modules/dynamic-dedupe": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", "dev": true, + "license": "MIT", "dependencies": { "xtend": "^4.0.0" } }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/enabled": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/engine.io": { "version": "6.6.6", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz", - "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==", "license": "MIT", "dependencies": { "@types/cors": "^2.8.12", @@ -4927,8 +4180,6 @@ }, "node_modules/engine.io-parser": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4936,8 +4187,6 @@ }, "node_modules/engine.io/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4953,14 +4202,10 @@ }, "node_modules/engine.io/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/engine.io/node_modules/ws": { "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4980,31 +4225,26 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -5014,8 +4254,7 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -5028,21 +4267,17 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "node_modules/eslint": { "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -5101,8 +4336,6 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5118,8 +4351,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5131,9 +4362,8 @@ }, "node_modules/eslint/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -5148,9 +4378,8 @@ }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5160,8 +4389,6 @@ }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5173,9 +4400,8 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5189,9 +4415,8 @@ }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -5201,8 +4426,6 @@ }, "node_modules/eslint/node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -5211,9 +4434,8 @@ }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5226,15 +4448,13 @@ }, "node_modules/eslint/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -5247,8 +4467,6 @@ }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5265,8 +4483,6 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5278,8 +4494,6 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5291,8 +4505,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5304,8 +4516,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5314,8 +4524,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -5324,8 +4532,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5334,16 +4540,13 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/ethers": { "version": "6.16.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", - "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", "funding": [ { "type": "individual", @@ -5371,8 +4574,6 @@ }, "node_modules/ethers/node_modules/@noble/curves": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "license": "MIT", "peer": true, "dependencies": { @@ -5384,8 +4585,6 @@ }, "node_modules/ethers/node_modules/@noble/hashes": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "license": "MIT", "peer": true, "engines": { @@ -5397,8 +4596,6 @@ }, "node_modules/ethers/node_modules/@types/node": { "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "license": "MIT", "peer": true, "dependencies": { @@ -5407,22 +4604,16 @@ }, "node_modules/ethers/node_modules/tslib": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD", "peer": true }, "node_modules/ethers/node_modules/undici-types": { "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT", "peer": true }, "node_modules/ethers/node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", "peer": true, "engines": { @@ -5443,8 +4634,6 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "optional": true, "engines": { @@ -5453,8 +4642,7 @@ }, "node_modules/eventsource": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.0.0.tgz", - "integrity": "sha512-fvIkb9qZzdMxgZrEQDyll+9oJsyaVvY92I2Re+qK0qEJ+w5s0X3dtz+M0VAPOjP1gtU3iqWyjQ0G3nvd5CLZ2g==", + "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" }, @@ -5464,16 +4652,13 @@ }, "node_modules/eventsource-parser": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", - "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/expect-type": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5482,8 +4667,6 @@ }, "node_modules/express": { "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -5528,8 +4711,6 @@ }, "node_modules/express-rate-limit": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.0.tgz", - "integrity": "sha512-KJzBawY6fB9FiZGdE/0aftepZ91YlaGIrV8vgblRM3J8X+dHx/aiowJWwkx6LIGyuqGiANsjSwwrbb8mifOJ4Q==", "license": "MIT", "dependencies": { "ip-address": "10.1.0" @@ -5546,13 +4727,10 @@ }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "license": "MIT" }, "node_modules/farmhash-modern": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", - "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -5560,8 +4738,6 @@ }, "node_modules/fast-content-type-parse": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", "funding": [ { "type": "github", @@ -5571,35 +4747,30 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -5614,8 +4785,6 @@ }, "node_modules/fast-xml-builder": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "funding": [ { "type": "github", @@ -5630,8 +4799,6 @@ }, "node_modules/fast-xml-parser": { "version": "5.5.9", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", - "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", "funding": [ { "type": "github", @@ -5651,8 +4818,6 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -5663,8 +4828,6 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -5681,8 +4844,6 @@ }, "node_modules/feaxios": { "version": "0.0.23", - "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", - "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==", "license": "MIT", "dependencies": { "is-retry-allowed": "^3.0.0" @@ -5690,13 +4851,10 @@ }, "node_modules/fecha": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + "license": "MIT" }, "node_modules/fetch-blob": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "funding": [ { "type": "github", @@ -5718,8 +4876,6 @@ }, "node_modules/fetch-blob/node_modules/web-streams-polyfill": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "license": "MIT", "engines": { "node": ">= 8" @@ -5727,15 +4883,11 @@ }, "node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, "license": "MIT" }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5747,8 +4899,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5756,18 +4907,9 @@ "node": ">=8" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/finalhandler": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -5783,8 +4925,6 @@ }, "node_modules/firebase-admin": { "version": "13.7.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.7.0.tgz", - "integrity": "sha512-o3qS8zCJbApe7aKzkO2Pa380t9cHISqeSd3blqYTtOuUUUua3qZTLwNWgGUOss3td6wbzrZhiHIj3c8+fC046Q==", "license": "Apache-2.0", "dependencies": { "@fastify/busboy": "^3.0.0", @@ -5808,8 +4948,6 @@ }, "node_modules/firebase-admin/node_modules/gaxios": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -5823,8 +4961,6 @@ }, "node_modules/firebase-admin/node_modules/gcp-metadata": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -5837,8 +4973,6 @@ }, "node_modules/firebase-admin/node_modules/google-auth-library": { "version": "10.6.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz", - "integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -5854,8 +4988,6 @@ }, "node_modules/firebase-admin/node_modules/google-logging-utils": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -5863,8 +4995,6 @@ }, "node_modules/firebase-admin/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -5881,8 +5011,6 @@ }, "node_modules/firebase-admin/node_modules/rimraf": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "license": "ISC", "dependencies": { "glob": "^10.3.7" @@ -5896,8 +5024,6 @@ }, "node_modules/firebase-admin/node_modules/uuid": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -5909,8 +5035,6 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -5923,20 +5047,17 @@ }, "node_modules/flatted": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/fn.name": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + "license": "MIT" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -5955,8 +5076,7 @@ }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -5969,8 +5089,7 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -5984,8 +5103,7 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -5995,8 +5113,6 @@ }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -6011,8 +5127,6 @@ }, "node_modules/formdata-polyfill": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" @@ -6023,9 +5137,8 @@ }, "node_modules/formidable": { "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, + "license": "MIT", "dependencies": { "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", @@ -6040,8 +5153,6 @@ }, "node_modules/formidable/node_modules/@paralleldrive/cuid2": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", "dev": true, "license": "MIT", "dependencies": { @@ -6050,16 +5161,14 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6080,23 +5189,19 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "license": "MIT", "optional": true }, "node_modules/gaxios": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", @@ -6110,8 +5215,7 @@ }, "node_modules/gcp-metadata": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", @@ -6123,16 +5227,14 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -6154,8 +5256,7 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -6166,9 +5267,6 @@ }, "node_modules/glob": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "BlueOak-1.0.0", "dependencies": { "foreground-child": "^3.3.1", @@ -6190,8 +5288,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6201,9 +5298,8 @@ }, "node_modules/globals": { "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -6213,8 +5309,6 @@ }, "node_modules/google-auth-library": { "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -6230,8 +5324,6 @@ }, "node_modules/google-gax": { "version": "4.6.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz", - "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -6254,8 +5346,6 @@ }, "node_modules/google-gax/node_modules/proto3-json-serializer": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -6267,16 +5357,14 @@ }, "node_modules/google-logging-utils": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", "engines": { "node": ">=14" } }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6286,8 +5374,7 @@ }, "node_modules/gtoken": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "license": "MIT", "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" @@ -6298,16 +5385,14 @@ }, "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -6317,8 +5402,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6328,8 +5412,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -6342,8 +5425,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -6353,16 +5435,13 @@ }, "node_modules/helmet": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", - "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", + "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/html-entities": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "funding": [ { "type": "github", @@ -6378,15 +5457,12 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -6400,14 +5476,11 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -6419,8 +5492,7 @@ }, "node_modules/http-proxy-agent/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -6430,8 +5502,7 @@ }, "node_modules/http-proxy-agent/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -6446,18 +5517,11 @@ }, "node_modules/http-proxy-agent/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -6468,8 +5532,7 @@ }, "node_modules/https-proxy-agent/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -6484,13 +5547,10 @@ }, "node_modules/https-proxy-agent/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -6501,8 +5561,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -6521,8 +5579,6 @@ }, "node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -6531,13 +5587,10 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + "license": "ISC" }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6553,30 +5606,25 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ip-address": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "license": "MIT", "engines": { "node": ">= 12" @@ -6584,37 +5632,18 @@ }, "node_modules/ip3country": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip3country/-/ip3country-5.0.0.tgz", - "integrity": "sha512-lcFLMFU4eO1Z7tIpbVFZkaZ5ltqpeaRx7L9NsAbA9uA7/O/rj3RF8+evE5gDitooaTTIqjdzZrenFO/OOxQ2ew==", "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6624,8 +5653,7 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6635,9 +5663,8 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -6650,41 +5677,21 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -6694,33 +5701,13 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-retry-allowed": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", - "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", "license": "MIT", "engines": { "node": ">=12" @@ -6731,8 +5718,7 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -6742,8 +5728,7 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -6756,19 +5741,14 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "license": "ISC" }, "node_modules/isows": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", - "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", "funding": [ { "type": "github", @@ -6782,8 +5762,6 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6792,8 +5770,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6807,8 +5783,6 @@ }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -6817,8 +5791,6 @@ }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -6830,8 +5802,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6844,8 +5814,6 @@ }, "node_modules/jackspeak": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^9.0.0" @@ -6859,25 +5827,21 @@ }, "node_modules/jiti": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz", - "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==", "dev": true, + "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, "node_modules/jose": { "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -6889,36 +5853,28 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" } }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsonwebtoken": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", "dependencies": { "jws": "^4.0.1", @@ -6939,13 +5895,10 @@ }, "node_modules/jsonwebtoken/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/jwa": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -6955,8 +5908,7 @@ }, "node_modules/jwks-rsa": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", - "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", + "license": "MIT", "dependencies": { "@types/express": "^4.17.20", "@types/jsonwebtoken": "^9.0.4", @@ -6971,8 +5923,7 @@ }, "node_modules/jwks-rsa/node_modules/@types/express": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -6982,8 +5933,7 @@ }, "node_modules/jwks-rsa/node_modules/@types/express-serve-static-core": { "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -6993,8 +5943,7 @@ }, "node_modules/jwks-rsa/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -7009,13 +5958,10 @@ }, "node_modules/jwks-rsa/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/jws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", "dependencies": { "jwa": "^2.0.1", @@ -7024,8 +5970,6 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -7034,14 +5978,12 @@ }, "node_modules/kuler": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + "license": "MIT" }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -7052,8 +5994,6 @@ }, "node_modules/lightningcss": { "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -7292,8 +6232,6 @@ }, "node_modules/lightningcss-win32-x64-msvc": { "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], @@ -7312,72 +6250,56 @@ } }, "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + "version": "1.1.5" }, "node_modules/lodash": { "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + "license": "MIT" }, "node_modules/logform": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -7392,18 +6314,15 @@ }, "node_modules/logform/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/long": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", - "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==" + "license": "Apache-2.0" }, "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7413,8 +6332,7 @@ }, "node_modules/lru-memoizer": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "license": "MIT", "dependencies": { "lodash.clonedeep": "^4.5.0", "lru-cache": "6.0.0" @@ -7422,8 +6340,6 @@ }, "node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7432,8 +6348,6 @@ }, "node_modules/magicast": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7444,8 +6358,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -7460,45 +6372,38 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "license": "ISC" }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "license": "MIT", "optional": true, "bin": { @@ -7510,16 +6415,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -7529,8 +6432,6 @@ }, "node_modules/minimatch": { "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" @@ -7544,26 +6445,23 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -7573,8 +6471,7 @@ }, "node_modules/morgan": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -7588,8 +6485,7 @@ }, "node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -7599,8 +6495,6 @@ }, "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "license": "MIT", "engines": { @@ -7609,13 +6503,10 @@ }, "node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -7633,23 +6524,18 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/node-domexception": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -7660,14 +6546,14 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7685,8 +6571,6 @@ }, "node_modules/node-forge": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", - "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -7694,8 +6578,6 @@ }, "node_modules/nodemon": { "version": "3.1.13", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.13.tgz", - "integrity": "sha512-nPN6L7A9cTA3BnJ3zZIibH5FiDh3GbmibeS17bl5YEU1IRO2mcfvR0ZJXH3ndoeKItjUcaX81FSKc/Kq/IiG6g==", "license": "MIT", "dependencies": { "chokidar": "^3.5.2", @@ -7722,8 +6604,7 @@ }, "node_modules/nodemon/node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -7738,37 +6619,32 @@ }, "node_modules/nodemon/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7778,8 +6654,6 @@ }, "node_modules/obug": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -7789,8 +6663,7 @@ }, "node_modules/octokit": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.2.2.tgz", - "integrity": "sha512-7Abo3nADdja8l/aglU6Y3lpnHSfv0tw7gFPiqzry/yCU+2gTAX7R1roJ8hJrxIK+S1j+7iqRJXtmuHJ/UDsBhQ==", + "license": "MIT", "dependencies": { "@octokit/app": "^14.0.2", "@octokit/core": "^5.0.0", @@ -7810,16 +6683,14 @@ }, "node_modules/octokit/node_modules/@octokit/auth-token": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/octokit/node_modules/@octokit/core": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", - "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -7835,8 +6706,7 @@ }, "node_modules/octokit/node_modules/@octokit/endpoint": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -7847,8 +6717,7 @@ }, "node_modules/octokit/node_modules/@octokit/graphql": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "license": "MIT", "dependencies": { "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", @@ -7860,13 +6729,11 @@ }, "node_modules/octokit/node_modules/@octokit/openapi-types": { "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "license": "MIT" }, "node_modules/octokit/node_modules/@octokit/plugin-paginate-rest": { "version": "11.4.4-cjs.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", - "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.7.0" }, @@ -7879,8 +6746,7 @@ }, "node_modules/octokit/node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "13.3.2-cjs.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", - "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.8.0" }, @@ -7893,8 +6759,7 @@ }, "node_modules/octokit/node_modules/@octokit/plugin-retry": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz", - "integrity": "sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==", + "license": "MIT", "dependencies": { "@octokit/request-error": "^5.0.0", "@octokit/types": "^13.0.0", @@ -7909,8 +6774,7 @@ }, "node_modules/octokit/node_modules/@octokit/plugin-throttling": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", - "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", + "license": "MIT", "dependencies": { "@octokit/types": "^12.2.0", "bottleneck": "^2.15.3" @@ -7924,21 +6788,18 @@ }, "node_modules/octokit/node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" + "license": "MIT" }, "node_modules/octokit/node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "node_modules/octokit/node_modules/@octokit/request": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -7951,8 +6812,7 @@ }, "node_modules/octokit/node_modules/@octokit/request-error": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -7964,26 +6824,22 @@ }, "node_modules/octokit/node_modules/@octokit/types": { "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "node_modules/octokit/node_modules/before-after-hook": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + "license": "Apache-2.0" }, "node_modules/octokit/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + "license": "ISC" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -7993,33 +6849,29 @@ }, "node_modules/on-headers": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/one-time": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", "dependencies": { "fn.name": "1.x.x" } }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -8034,8 +6886,6 @@ }, "node_modules/ox": { "version": "0.14.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.7.tgz", - "integrity": "sha512-zSQ/cfBdolj7U4++NAvH7sI+VG0T3pEohITCgcQj8KlawvTDY4vGVhDT64Atsm0d6adWfIYHDpu88iUBMMp+AQ==", "funding": [ { "type": "github", @@ -8064,14 +6914,10 @@ }, "node_modules/ox/node_modules/@adraffy/ens-normalize": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", - "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", "license": "MIT" }, "node_modules/ox/node_modules/@noble/curves": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -8085,15 +6931,12 @@ }, "node_modules/ox/node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "devOptional": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8106,13 +6949,10 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -8124,25 +6964,21 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-expression-matcher": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", - "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", "funding": [ { "type": "github", @@ -8157,22 +6993,18 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -8187,8 +7019,6 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -8196,27 +7026,20 @@ }, "node_modules/path-to-regexp": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -8228,16 +7051,13 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { "version": "8.5.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", - "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", "dev": true, "funding": [ { @@ -8265,17 +7085,14 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prisma": { "version": "6.12.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.12.0.tgz", - "integrity": "sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -8300,8 +7117,6 @@ }, "node_modules/proto3-json-serializer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-3.0.4.tgz", - "integrity": "sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==", "license": "Apache-2.0", "dependencies": { "protobufjs": "^7.4.0" @@ -8311,9 +7126,9 @@ } }, "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", + "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -8336,8 +7151,7 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -8348,8 +7162,6 @@ }, "node_modules/proxy-from-env": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "license": "MIT", "engines": { "node": ">=10" @@ -8357,18 +7169,10 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "license": "MIT" }, "node_modules/qs": { "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -8380,43 +7184,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -8430,8 +7213,6 @@ }, "node_modules/raw-body/node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -8450,8 +7231,6 @@ }, "node_modules/raw-body/node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8459,8 +7238,7 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8472,8 +7250,7 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -8483,8 +7260,6 @@ }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -8493,31 +7268,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/require-addon": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz", - "integrity": "sha512-VNPDZlYgIYQwWp9jMTzljx+k0ZtatKlcvOhktZ/anNPI3dQ9NXk7cq2U4iJ1wd9IrytRnYhyEocFWbkdPb+MYA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-addon-resolve": "^1.3.0" - }, - "engines": { - "bare": ">=1.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8525,9 +7284,8 @@ }, "node_modules/resolve": { "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -8545,8 +7303,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -8555,8 +7311,6 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "optional": true, "engines": { @@ -8565,8 +7319,6 @@ }, "node_modules/retry-request": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", "license": "MIT", "optional": true, "dependencies": { @@ -8580,10 +7332,8 @@ }, "node_modules/rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -8593,8 +7343,6 @@ }, "node_modules/rolldown": { "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.13.tgz", - "integrity": "sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==", "dev": true, "license": "MIT", "dependencies": { @@ -8627,8 +7375,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -8642,42 +7388,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + ], + "license": "MIT" }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/semver": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -8688,8 +7414,7 @@ }, "node_modules/send": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -8711,16 +7436,14 @@ }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/send/node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -8730,13 +7453,11 @@ }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/serve-static": { "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -8749,8 +7470,7 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -8765,13 +7485,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.4", @@ -8790,8 +7507,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8801,16 +7517,14 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -8827,8 +7541,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -8842,8 +7555,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -8859,8 +7571,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -8877,15 +7588,12 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -8895,8 +7603,6 @@ }, "node_modules/sirv": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, "license": "MIT", "dependencies": { @@ -8910,8 +7616,6 @@ }, "node_modules/siwe": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/siwe/-/siwe-2.3.2.tgz", - "integrity": "sha512-aSf+6+Latyttbj5nMu6GF3doMfv2UYj83hhwZgUF20ky6fTS83uVhkQABdIVnEuS8y1bBdk7p6ltb9SmlhTTlA==", "license": "Apache-2.0", "dependencies": { "@spruceid/siwe-parser": "^2.1.2", @@ -8925,8 +7629,6 @@ }, "node_modules/socket.io": { "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", - "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", "license": "MIT", "dependencies": { "accepts": "~1.3.4", @@ -8943,8 +7645,6 @@ }, "node_modules/socket.io-adapter": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", - "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", "license": "MIT", "dependencies": { "debug": "~4.4.1", @@ -8953,8 +7653,6 @@ }, "node_modules/socket.io-adapter/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -8970,14 +7668,10 @@ }, "node_modules/socket.io-adapter/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/socket.io-adapter/node_modules/ws": { "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -8997,8 +7691,6 @@ }, "node_modules/socket.io-parser": { "version": "4.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", - "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -9010,8 +7702,6 @@ }, "node_modules/socket.io-parser/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9027,14 +7717,10 @@ }, "node_modules/socket.io-parser/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/socket.io/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9050,33 +7736,18 @@ }, "node_modules/socket.io/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/sodium-native": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", - "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", - "license": "MIT", - "optional": true, - "dependencies": { - "require-addon": "^1.1.0" - } - }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -9085,41 +7756,27 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "engines": { - "node": ">=6" - } - }, "node_modules/stack-trace": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statsig-node": { "version": "6.5.1", - "resolved": "https://registry.npmjs.org/statsig-node/-/statsig-node-6.5.1.tgz", - "integrity": "sha512-/rKvMMN9SWTK8+b7MyRP1wOsStsKf55Mdj8O2ffV/bCQ/38bXYCC/GVd3gVvBSwVCibAnkTz2v1gpRJSIKsBIg==", "license": "ISC", "dependencies": { "ip3country": "^5.0.0", @@ -9133,8 +7790,6 @@ }, "node_modules/statsig-node/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -9142,63 +7797,37 @@ }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, "license": "MIT" }, "node_modules/stream-events": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "license": "MIT", "dependencies": { "stubs": "^3.0.0" } }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "engines": { - "node": ">=4" - } + "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9210,8 +7839,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9221,26 +7849,22 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/strnum": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", - "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "funding": [ { "type": "github", @@ -9252,14 +7876,12 @@ }, "node_modules/stubs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==" + "license": "MIT" }, "node_modules/superagent": { "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", "dev": true, + "license": "MIT", "dependencies": { "component-emitter": "^1.3.1", "cookiejar": "^2.1.4", @@ -9277,9 +7899,8 @@ }, "node_modules/superagent/node_modules/debug": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -9294,9 +7915,8 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -9306,15 +7926,13 @@ }, "node_modules/superagent/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/supertest": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", - "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", "dev": true, + "license": "MIT", "dependencies": { "methods": "^1.1.2", "superagent": "^10.2.3" @@ -9325,8 +7943,7 @@ }, "node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -9336,9 +7953,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9348,8 +7964,6 @@ }, "node_modules/teeny-request": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -9365,8 +7979,6 @@ }, "node_modules/teeny-request/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "optional": true, "dependencies": { @@ -9378,8 +7990,6 @@ }, "node_modules/teeny-request/node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "optional": true, "dependencies": { @@ -9396,8 +8006,6 @@ }, "node_modules/teeny-request/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "optional": true, "dependencies": { @@ -9410,27 +8018,20 @@ }, "node_modules/teeny-request/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT", "optional": true }, "node_modules/text-hex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", - "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", "dev": true, "license": "MIT", "engines": { @@ -9439,8 +8040,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9456,8 +8055,6 @@ }, "node_modules/tinyrainbow": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -9466,8 +8063,6 @@ }, "node_modules/to-buffer": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "license": "MIT", "dependencies": { "isarray": "^2.0.5", @@ -9480,8 +8075,7 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -9491,21 +8085,17 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/toml": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + "license": "MIT" }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "license": "MIT", "engines": { @@ -9514,38 +8104,32 @@ }, "node_modules/touch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" } }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "license": "MIT" }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/triple-beam": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/ts-api-utils": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -9557,8 +8141,7 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -9599,9 +8182,8 @@ }, "node_modules/ts-node-dev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^3.5.1", "dynamic-dedupe": "^0.3.0", @@ -9633,9 +8215,8 @@ }, "node_modules/tsconfig": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", "dev": true, + "license": "MIT", "dependencies": { "@types/strip-bom": "^3.0.0", "@types/strip-json-comments": "0.0.30", @@ -9645,20 +8226,16 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tweetnacl": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "license": "Unlicense" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -9668,8 +8245,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -9680,8 +8256,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -9694,8 +8268,7 @@ }, "node_modules/typescript": { "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9706,8 +8279,6 @@ }, "node_modules/typescript-eslint": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", - "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", "dev": true, "license": "MIT", "dependencies": { @@ -9730,8 +8301,6 @@ }, "node_modules/ua-parser-js": { "version": "1.0.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", - "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", "funding": [ { "type": "opencollective", @@ -9756,18 +8325,15 @@ }, "node_modules/undefsafe": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + "license": "MIT" }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + "license": "MIT" }, "node_modules/universal-github-app-jwt": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", - "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", + "license": "MIT", "dependencies": { "@types/jsonwebtoken": "^9.0.0", "jsonwebtoken": "^9.0.2" @@ -9775,21 +8341,17 @@ }, "node_modules/universal-user-agent": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", - "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==" + "license": "ISC" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -9797,8 +8359,6 @@ }, "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -9806,58 +8366,21 @@ }, "node_modules/urijs": { "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" - }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "engines": { - "node": ">= 4" - } + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -9869,26 +8392,20 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + "license": "MIT" }, "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" + "version": "1.0.9" }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/viem": { "version": "2.47.6", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.47.6.tgz", - "integrity": "sha512-zExmbI99NGvMdYa7fmqSTLgkwh48dmhgEqFrUgkpL4kfG4XkVefZ8dZqIKVUhZo6Uhf0FrrEXOsHm9LUyIvI2Q==", "funding": [ { "type": "github", @@ -9917,8 +8434,6 @@ }, "node_modules/viem/node_modules/@noble/curves": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -9932,8 +8447,6 @@ }, "node_modules/viem/node_modules/ws": { "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -9953,8 +8466,6 @@ }, "node_modules/vite": { "version": "8.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.7.tgz", - "integrity": "sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==", "dev": true, "license": "MIT", "dependencies": { @@ -10031,8 +8542,6 @@ }, "node_modules/vitest": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.3.tgz", - "integrity": "sha512-DBc4Tx0MPNsqb9isoyOq00lHftVx/KIU44QOm2q59npZyLUkENn8TMFsuzuO+4U2FUa9rgbbPt3udrP25GcjXw==", "dev": true, "license": "MIT", "dependencies": { @@ -10119,20 +8628,12 @@ } } }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -10145,8 +8646,6 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -10154,8 +8653,7 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -10163,8 +8661,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -10177,8 +8674,7 @@ }, "node_modules/which-typed-array": { "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -10197,8 +8693,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -10214,8 +8708,7 @@ }, "node_modules/winston": { "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", + "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -10235,8 +8728,7 @@ }, "node_modules/winston-transport": { "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -10248,17 +8740,15 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10273,13 +8763,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/ws": { "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "peer": true, "engines": { @@ -10300,29 +8787,26 @@ }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -10338,25 +8822,22 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10366,8 +8847,6 @@ }, "node_modules/zod": { "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 926c52c..ca5d777 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "@prisma/client": "^6.13.0", "@prisma/extension-accelerate": "^1.2.2", "@stellar/stellar-sdk": "^14.5.0", - "@stellar/typescript-wallet-sdk": "^1.9.0", "@types/express": "^5.0.0", "@types/node": "^22.13.10", "@types/winston": "^2.4.4", From b3a4cc0114afdfba455fe9926ef065496ba83146 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 23 Apr 2026 13:44:04 +0100 Subject: [PATCH 03/12] docs: consolidate frontend project links in README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 265053a..97c560f 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,5 @@ This project is licensed under the Apache 2.0 License. See [LICENSE](https://git ## Related Projects -- [DevAsign Project Maintainer App](https://github.com/devasignhq/app.devasign.com) — Frontend for project maintainers -- [DevAsign Contributor App](https://github.com/devasignhq/contributor.devasign.com) — Frontend for contributors +- [DevAsign App](https://github.com/devasignhq/apps) — Frontend for project maintainers and contributors - [Soroban Task Escrow Contract](https://github.com/devasignhq/soroban-contract) — Task escrow smart contract on Stellar From e4debcdc368cdffd4f228d2d096fb3e1f8b843f4 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 23 Apr 2026 22:45:11 +0100 Subject: [PATCH 04/12] chore: replace all hard-coded status codes with STATUS_CODES object equivalent --- api/routes/_test_/contract.test.route.ts | 19 ++++++------ api/routes/_test_/general.test.route.ts | 12 ++++---- api/routes/_test_/stellar.test.route.ts | 29 ++++++++++--------- .../middlewares/rate-limit.middleware.test.ts | 12 +++++--- 4 files changed, 39 insertions(+), 33 deletions(-) diff --git a/api/routes/_test_/contract.test.route.ts b/api/routes/_test_/contract.test.route.ts index ca3b55f..7752186 100644 --- a/api/routes/_test_/contract.test.route.ts +++ b/api/routes/_test_/contract.test.route.ts @@ -12,6 +12,7 @@ import { resolveDisputeSchema, refundSchema } from "./test.schema.js"; +import { STATUS_CODES } from "../../utils/data.js"; const router = Router(); @@ -60,7 +61,7 @@ router.post("/escrow", bountyAmount ); - res.status(201).json({ + res.status(STATUS_CODES.CREATED).json({ message: "Escrow created successfully", data: result }); @@ -84,7 +85,7 @@ router.get("/escrow/:taskId", // Convert BigInt values to strings for JSON serialization const serializedEscrow = convertBigIntToString(escrow); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Escrow details retrieved successfully", data: serializedEscrow }); @@ -110,7 +111,7 @@ router.post("/task/assign", contributorPublicKey ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Contributor assigned successfully", data: result }); @@ -136,7 +137,7 @@ router.post("/task/increase-bounty", amount ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Bounty increased successfully", data: result }); @@ -162,7 +163,7 @@ router.post("/task/decrease-bounty", amount ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Bounty decreased successfully", data: result }); @@ -187,7 +188,7 @@ router.post("/task/approve", taskId ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Task completion approved and funds released successfully", data: result }); @@ -213,7 +214,7 @@ router.post("/task/dispute", reason ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Dispute initiated successfully", data: result }); @@ -250,7 +251,7 @@ router.post("/task/resolve-dispute", processedResolution ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Dispute resolved successfully", data: result }); @@ -275,7 +276,7 @@ router.post("/escrow/refund", taskId ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Refund processed successfully", data: result }); diff --git a/api/routes/_test_/general.test.route.ts b/api/routes/_test_/general.test.route.ts index 68245fa..0d7e9dc 100644 --- a/api/routes/_test_/general.test.route.ts +++ b/api/routes/_test_/general.test.route.ts @@ -26,7 +26,7 @@ router.post( return next(createError(409, "Email already exists")); } - res.status(201).json({ message: "User created", data: { email, name } }); + res.status(STATUS_CODES.CREATED).json({ message: "User created", data: { email, name } }); }) as RequestHandler ); @@ -44,7 +44,7 @@ router.post("/encryption", // Decrypt to verify const decrypted = await KMSService.decryptWallet(encrypted as any); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Encryption test successful", data: { original: text, @@ -54,7 +54,7 @@ router.post("/encryption", } }); } catch (error) { - next(createError(500, "Encryption test failed", { cause: error })); + next(error); } }) as RequestHandler ); @@ -77,7 +77,7 @@ router.post("/decryption", // Decrypt again to verify the re-encryption works and matches const reDecrypted = await KMSService.decryptWallet(ecrypted as any); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Decryption test successful", data: { original: walletData, @@ -87,7 +87,7 @@ router.post("/decryption", } }); } catch (error) { - next(createError(500, "Decryption test failed", { cause: error })); + next(error); } }) as RequestHandler ); @@ -129,7 +129,7 @@ router.post("/create-packages", async (_, res: Response, next: NextFunction) => res.status(STATUS_CODES.SUCCESS).json(packages); } catch (error) { - next(createError(500, "Failed to create packages", { cause: error })); + next(error); } }); diff --git a/api/routes/_test_/stellar.test.route.ts b/api/routes/_test_/stellar.test.route.ts index f081061..2f8408c 100644 --- a/api/routes/_test_/stellar.test.route.ts +++ b/api/routes/_test_/stellar.test.route.ts @@ -14,6 +14,7 @@ import { getAccountInfoSchema } from "./test.schema.js"; import { KMSService } from "../../services/kms.service.js"; +import { STATUS_CODES } from "../../utils/data.js"; const router = Router(); @@ -22,7 +23,7 @@ router.post("/wallet", async (_req: Request, res: Response, next: NextFunction) try { const wallet = await stellarService.createWallet(); - res.status(201).json({ + res.status(STATUS_CODES.CREATED).json({ message: "Wallet created successfully", data: wallet }); @@ -38,7 +39,7 @@ router.post("/wallet/sponsor", try { const { sponsorSecret } = req.body; const wallet = await stellarService.createWalletViaSponsor(sponsorSecret); - res.status(201).json({ + res.status(STATUS_CODES.CREATED).json({ message: "Wallet created successfully", data: wallet }); @@ -55,7 +56,7 @@ router.post("/trustline", try { const { secretKey } = req.body; await stellarService.addTrustLine(secretKey); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "USDC trustline added successfully" }); } catch (error) { @@ -71,7 +72,7 @@ router.post("/trustline/sponsor", try { const { sponsorSecret, accountSecret } = req.body; await stellarService.addTrustLineViaSponsor(sponsorSecret, accountSecret); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "USDC trustline added successfully" }); } catch (error) { @@ -86,7 +87,7 @@ router.post("/fund", async (req: Request, res: Response, next: NextFunction) => { try { await stellarService.fundWallet(req.body.publicKey); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Wallet funded successfully" }); } catch (error) { @@ -108,7 +109,7 @@ router.post("/transfer", xlmAsset, amount ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Asset transferred successfully", data: result }); @@ -132,7 +133,7 @@ router.post("/transfer/sponsor", xlmAsset, amount ); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Asset transferred successfully", data: result }); @@ -149,7 +150,7 @@ router.post("/swap", try { const { sourceSecret, amount } = req.body; const result = await stellarService.swapAsset(sourceSecret, amount); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Asset swapped successfully", data: result }); @@ -165,7 +166,7 @@ router.get("/account/:publicKey", async (req: Request, res: Response, next: NextFunction) => { try { const accountInfo = await stellarService.getAccountInfo(req.params.publicKey); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Account info retrieved successfully", data: accountInfo }); @@ -182,7 +183,7 @@ router.get("/topup/:publicKey", try { const transactions = await stellarService.getTopUpTransactions(req.params.publicKey); - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: "Top up transactions retrieved successfully", data: transactions }); @@ -210,7 +211,7 @@ router.patch("/wallets/users/update-all", }); if (allUsers.length === 0) { - return res.status(200).json({ + return res.status(STATUS_CODES.SUCCESS).json({ message: "No users found to update", data: { updated: 0, failed: 0 } }); @@ -273,7 +274,7 @@ router.patch("/wallets/users/update-all", } } - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: `Wallet update completed. ${successCount} successful, ${failCount} failed.`, data: { total: allUsers.length, @@ -302,7 +303,7 @@ router.patch("/wallets/installations/update-all", }); if (allInstallations.length === 0) { - return res.status(200).json({ + return res.status(STATUS_CODES.SUCCESS).json({ message: "No installations found to update", data: { updated: 0, failed: 0 } }); @@ -362,7 +363,7 @@ router.patch("/wallets/installations/update-all", } } - res.status(200).json({ + res.status(STATUS_CODES.SUCCESS).json({ message: `Installation wallet update completed. ${successCount} successful, ${failCount} failed.`, data: { total: allInstallations.length, diff --git a/tests/integration/middlewares/rate-limit.middleware.test.ts b/tests/integration/middlewares/rate-limit.middleware.test.ts index daf43c2..610f7dc 100644 --- a/tests/integration/middlewares/rate-limit.middleware.test.ts +++ b/tests/integration/middlewares/rate-limit.middleware.test.ts @@ -15,7 +15,9 @@ describe("Rate Limit Middleware", () => { describe("API Rate Limiter", () => { it("should allow requests under the limit", async () => { app.use("/api/test-under", apiLimiter); - app.get("/api/test-under", (_req: Request, res: Response) => { res.status(200).json({ message: "success" }); }); + app.get("/api/test-under", (_req: Request, res: Response) => { + res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); + }); for (let i = 0; i < 5; i++) { await request(app) @@ -26,7 +28,9 @@ describe("Rate Limit Middleware", () => { it("should skip rate limiting for webhook endpoints", async () => { app.use(apiLimiter); - app.get(`${ENDPOINTS.WEBHOOK.PREFIX}/test-skip`, (_req: Request, res: Response) => { res.status(200).json({ message: "success" }); }); + app.get(`${ENDPOINTS.WEBHOOK.PREFIX}/test-skip`, (_req: Request, res: Response) => { + res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); + }); const checks = []; for (let i = 0; i < 20; i++) { @@ -43,7 +47,7 @@ describe("Rate Limit Middleware", () => { // Use a unique path to avoid interference from previous tests if state persists const path = "/api/test-over-limit"; app.use(path, apiLimiter); - app.get(path, (_req: Request, res: Response) => { res.status(200).json({ message: "success" }); }); + app.get(path, (_req: Request, res: Response) => { res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); }); // Limit is 300. const limit = 310; @@ -80,7 +84,7 @@ describe("Rate Limit Middleware", () => { it("should enforce webhook specific limits", async () => { const path = "/webhook/test-limit"; app.use(path, webhookLimiter); - app.post(path, (_req: Request, res: Response) => { res.status(200).json({ message: "success" }); }); + app.post(path, (_req: Request, res: Response) => { res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); }); // Limit is 300. const limit = 310; From 3b2d66e2b4b533309bc94c778312cda585263a70 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 23 Apr 2026 22:46:17 +0100 Subject: [PATCH 05/12] refactor: standardize status codes --- .../installation/github.controller.ts | 8 +- .../installation/index.controller.ts | 8 +- .../installation/team.controller.ts | 10 +- api/controllers/internal/index.controller.ts | 8 +- api/controllers/task/activities.controller.ts | 4 +- .../task/contributor.controller.ts | 6 +- api/controllers/task/index.controller.ts | 10 +- .../task/installation.controller.ts | 6 +- api/controllers/task/{taskId}.controller.ts | 26 ++--- api/controllers/user/index.controller.ts | 12 +-- api/controllers/user/sumsub.controller.ts | 8 +- api/controllers/wallet/index.controller.ts | 6 +- .../wallet/transactions.controller.ts | 10 +- api/controllers/webhook/github.controller.ts | 2 +- api/controllers/webhook/sumsub.controller.ts | 4 +- api/index.ts | 2 +- api/middlewares/auth.middleware.ts | 6 +- api/middlewares/error.middleware.ts | 8 +- api/middlewares/rate-limit.middleware.ts | 4 +- api/middlewares/request.middleware.ts | 2 +- api/middlewares/webhook.middleware.ts | 30 +++--- api/models/error.model.ts | 28 +++--- api/routes/_test_/contract.test.route.ts | 16 +-- api/routes/_test_/general.test.route.ts | 10 +- api/routes/_test_/octokit.test.route.ts | 2 +- api/routes/_test_/stellar.test.route.ts | 24 ++--- api/routes/agent.route.ts | 4 +- .../installation-webhook.service.ts | 10 +- ...stallation_repositories-webhook.service.ts | 2 +- .../issue_comment-webhook.service.ts | 37 ++++--- .../pull_request-webhook.service.ts | 12 +-- .../github-webhook/push-webhook.service.ts | 4 +- api/utils/data.ts | 52 +++++----- tests/helpers/database-test-helper.ts | 12 ++- .../api/installation/github.api.test.ts | 22 ++--- .../api/installation/index.api.test.ts | 30 +++--- .../api/installation/team.api.test.ts | 26 ++--- .../api/internal/index.api.test.ts | 12 +-- .../api/task/activities.api.test.ts | 14 +-- .../api/task/contributor.api.test.ts | 32 +++--- tests/integration/api/task/index.api.test.ts | 39 ++++---- .../api/task/installation.api.test.ts | 14 +-- .../integration/api/task/{taskId}.api.test.ts | 84 ++++++++-------- tests/integration/api/user/index.api.test.ts | 28 +++--- tests/integration/api/user/sumsub.api.test.ts | 8 +- .../integration/api/wallet/index.api.test.ts | 44 ++++----- .../api/wallet/transactions.api.test.ts | 26 ++--- .../api/webhook/github.api.test.ts | 97 +++++++++---------- .../api/webhook/sumsub.api.test.ts | 14 +-- .../middlewares/auth.middleware.test.ts | 14 +-- .../middlewares/error.middleware.test.ts | 18 ++-- .../middlewares/rate-limit.middleware.test.ts | 20 ++-- .../middlewares/request.middleware.test.ts | 6 +- .../middlewares/webhook.middleware.test.ts | 28 +++--- 54 files changed, 491 insertions(+), 478 deletions(-) diff --git a/api/controllers/installation/github.controller.ts b/api/controllers/installation/github.controller.ts index 9538261..2deda3e 100644 --- a/api/controllers/installation/github.controller.ts +++ b/api/controllers/installation/github.controller.ts @@ -17,7 +17,7 @@ export const getInstallationRepositories = async (req: Request, res: Response, n // Return repositories in response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: repositories, message: "Repositories retrieved successfully" }); @@ -64,7 +64,7 @@ export const getRepositoryIssues = async (req: Request, res: Response, next: Nex // Return issues with pagination in response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: result.issues, pagination: { hasMore: result.hasMore }, message: "Issues retrieved successfully" @@ -91,7 +91,7 @@ export const getRepositoryResources = async (req: Request, res: Response, next: // Return labels and milestones responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: resources, message: "Repository resources retrieved successfully" }); @@ -137,7 +137,7 @@ export const getOrCreateBountyLabel = async (req: Request, res: Response, next: // Return bounty label responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: bountyLabel, message: "Bounty label created successfully" }); diff --git a/api/controllers/installation/index.controller.ts b/api/controllers/installation/index.controller.ts index db81f96..34858d2 100644 --- a/api/controllers/installation/index.controller.ts +++ b/api/controllers/installation/index.controller.ts @@ -191,7 +191,7 @@ export const createInstallation = async (req: Request, res: Response, next: Next // If trustline addition fails, return installation but indicate partial success responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: installation, message: existingAccountInstallation ? "Installation reactivated successfully" @@ -261,7 +261,7 @@ export const getInstallations = async (req: Request, res: Response, next: NextFu // Return paginated response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results, pagination: { hasMore }, message: "Installations retrieved successfully" @@ -366,7 +366,7 @@ export const getInstallation = async (req: Request, res: Response, next: NextFun // Return installation details with stats responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { ...installation, stats }, message: "Installation details retrieved successfully" }); @@ -447,7 +447,7 @@ export const archiveInstallation = async (req: Request, res: Response, next: Nex // Return success confirmation responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId, refundedAmount: `${refundedAmount} USDC` }, message: `Installation archived and ${refundedAmount} USDC refunded` }); diff --git a/api/controllers/installation/team.controller.ts b/api/controllers/installation/team.controller.ts index 9b9368e..ab9f058 100644 --- a/api/controllers/installation/team.controller.ts +++ b/api/controllers/installation/team.controller.ts @@ -42,7 +42,7 @@ export const addTeamMember = async (req: Request, res: Response, next: NextFunct if (!existingUser) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { status: "not_found" }, message: "User not found in our system. We currently do not support adding users who haven't signed up on our platform" }); @@ -53,7 +53,7 @@ export const addTeamMember = async (req: Request, res: Response, next: NextFunct if (isAlreadyMember) { return responseWrapper({ res, - status: STATUS_CODES.SERVER_ERROR, + status: STATUS_CODES.BAD_REQUEST, data: { username, status: "already_member" }, message: "User is already a member of this installation" }); @@ -97,7 +97,7 @@ export const addTeamMember = async (req: Request, res: Response, next: NextFunct // Return result responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { username, status: "added" }, message: "Team member added successfully" }); @@ -151,7 +151,7 @@ export const updateTeamMember = async (req: Request, res: Response, next: NextFu // Return success message responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Permissions updated successfully" }); @@ -208,7 +208,7 @@ export const removeTeamMember = async (req: Request, res: Response, next: NextFu // Return success message responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Team member removed successfully" }); diff --git a/api/controllers/internal/index.controller.ts b/api/controllers/internal/index.controller.ts index 8ffe1c5..3b15db6 100644 --- a/api/controllers/internal/index.controller.ts +++ b/api/controllers/internal/index.controller.ts @@ -29,7 +29,7 @@ export const handleBountyPayoutJob = async (req: Request, res: Response, next: N if (!taskId) { return responseWrapper({ res, - status: STATUS_CODES.SERVER_ERROR, + status: STATUS_CODES.INTERNAL_SERVER_ERROR, data: { prNumber, repositoryName, prUrl }, message: "Task ID is missing from payload" }); @@ -63,7 +63,7 @@ export const handleBountyPayoutJob = async (req: Request, res: Response, next: N if (!relatedTask) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { prNumber, repositoryName, prUrl }, message: "Task not found" }); @@ -73,7 +73,7 @@ export const handleBountyPayoutJob = async (req: Request, res: Response, next: N if (!relatedTask.contributor || !relatedTask.contributor.wallet || !relatedTask.contributor.wallet.address) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { prNumber, repositoryName, prUrl, linkedIssues: linkedIssues.map(i => i.number) }, message: "No wallet address found for contributor" }); @@ -189,7 +189,7 @@ export const handleBountyPayoutJob = async (req: Request, res: Response, next: N // Send success response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { prNumber, repositoryName, diff --git a/api/controllers/task/activities.controller.ts b/api/controllers/task/activities.controller.ts index 7ab0ce9..1b3eb13 100644 --- a/api/controllers/task/activities.controller.ts +++ b/api/controllers/task/activities.controller.ts @@ -69,7 +69,7 @@ export const getTaskActivities = async (req: Request, res: Response, next: NextF // Return paginated activities responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results, pagination: { hasMore } }); @@ -117,7 +117,7 @@ export const markActivityAsViewed = async (req: Request, res: Response, next: Ne // Return updated activity responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedActivity, message: "Activity marked as viewed" }); diff --git a/api/controllers/task/contributor.controller.ts b/api/controllers/task/contributor.controller.ts index e4963a8..6615f3a 100644 --- a/api/controllers/task/contributor.controller.ts +++ b/api/controllers/task/contributor.controller.ts @@ -165,7 +165,7 @@ export const getContributorTasks = async (req: Request, res: Response, next: Nex // Return paginated tasks responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results.map((task) => { if (task.contributorId !== userId) { return { @@ -259,7 +259,7 @@ export const getContributorTask = async (req: Request, res: Response, next: Next if (task.contributorId !== userId) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { id: task.id, issue: task.issue, @@ -280,7 +280,7 @@ export const getContributorTask = async (req: Request, res: Response, next: Next // Return task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: task }); } catch (error) { diff --git a/api/controllers/task/index.controller.ts b/api/controllers/task/index.controller.ts index 04f6391..ef7d9be 100644 --- a/api/controllers/task/index.controller.ts +++ b/api/controllers/task/index.controller.ts @@ -220,7 +220,7 @@ export const createTask = async (req: Request, res: Response, next: NextFunction if (!postedComment) { return responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: task, message: "Task created successfully", warning: "Failed to either post bounty comment or add bounty label." @@ -363,7 +363,7 @@ export const getTasks = async (req: Request, res: Response, next: NextFunction) // Return paginated tasks responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results, pagination: { hasMore } }); @@ -416,7 +416,7 @@ export const getTask = async (req: Request, res: Response, next: NextFunction) = // Return task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: task }); } catch (error) { @@ -521,7 +521,7 @@ export const deleteTask = async (req: Request, res: Response, next: NextFunction // Return success response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, message: "Task deleted successfully", data: { refunded: `${task.bounty} USDC` } }); @@ -531,7 +531,7 @@ export const deleteTask = async (req: Request, res: Response, next: NextFunction // Return success response but notify user of partial failure responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, message: "Task deleted successfully", data: { refunded: `${task.bounty} USDC` }, warning: "Failed to either remove bounty label from the task issue or delete bounty comment." diff --git a/api/controllers/task/installation.controller.ts b/api/controllers/task/installation.controller.ts index 42864e9..4093084 100644 --- a/api/controllers/task/installation.controller.ts +++ b/api/controllers/task/installation.controller.ts @@ -45,7 +45,7 @@ export const getInstallationTasks = async (req: Request, res: Response, next: Ne if (status === TaskStatus.PENDING_PAYMENT) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: [], pagination: { hasMore: false } }); @@ -158,7 +158,7 @@ export const getInstallationTasks = async (req: Request, res: Response, next: Ne // Return paginated tasks responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results, pagination: { hasMore } }); @@ -231,7 +231,7 @@ export const getInstallationTask = async (req: Request, res: Response, next: Nex // Return task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: task }); } catch (error) { diff --git a/api/controllers/task/{taskId}.controller.ts b/api/controllers/task/{taskId}.controller.ts index 5142aaf..c13d338 100644 --- a/api/controllers/task/{taskId}.controller.ts +++ b/api/controllers/task/{taskId}.controller.ts @@ -86,7 +86,7 @@ export const addBountyCommentId = async (req: Request, res: Response, next: Next // Return updated task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Bounty comment added successfully" }); @@ -269,7 +269,7 @@ export const updateTaskBounty = async (req: Request, res: Response, next: NextFu if (!updatedComment) { return responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: { bountyCommentPosted: false, task: updatedTask @@ -282,7 +282,7 @@ export const updateTaskBounty = async (req: Request, res: Response, next: NextFu // Return updated task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task bounty updated" }); @@ -347,7 +347,7 @@ export const updateTaskTimeline = async (req: Request, res: Response, next: Next // Return updated task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task timeline updated" }); @@ -421,7 +421,7 @@ export const submitTaskApplication = async (req: Request, res: Response, next: N // Return success response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: null, message: "Task application submitted" }); @@ -586,7 +586,7 @@ export const acceptTaskApplication = async (req: Request, res: Response, next: N // Return success response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task application accepted" }); @@ -595,7 +595,7 @@ export const acceptTaskApplication = async (req: Request, res: Response, next: N // Return updated task but notify user of partial failure responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task application accepted", warning: "Failed to enable chat functionality for this task." @@ -696,7 +696,7 @@ export const requestTimelineExtension = async (req: Request, res: Response, next // Return message responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: message, message: "Timeline extension request sent successfully" }); @@ -787,7 +787,7 @@ export const replyTimelineExtensionRequest = async (req: Request, res: Response, // Return message and updated task return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { message, task: updatedTask }, message: "Timeline extension request accepted" }); @@ -809,7 +809,7 @@ export const replyTimelineExtensionRequest = async (req: Request, res: Response, // Return message responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { message }, message: "Timeline extension request rejected" }); @@ -906,7 +906,7 @@ export const markAsComplete = async (req: Request, res: Response, next: NextFunc // Return updated task responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task submission completed" }); @@ -1076,7 +1076,7 @@ export const validateCompletion = async (req: Request, res: Response, next: Next // Return partial success response if chat failed to disable or bounty paid label failed to add responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task validated and completed", warning: !chatDisabled ? "Failed to disable chat for the task." : "Failed to add bounty paid label to the issue." @@ -1085,7 +1085,7 @@ export const validateCompletion = async (req: Request, res: Response, next: Next // Return success response responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedTask, message: "Task validated and completed" }); diff --git a/api/controllers/user/index.controller.ts b/api/controllers/user/index.controller.ts index d7e5a01..bc6b5c2 100644 --- a/api/controllers/user/index.controller.ts +++ b/api/controllers/user/index.controller.ts @@ -154,7 +154,7 @@ export const createUser = async (req: Request, res: Response, next: NextFunction // Return user info and notify user USDC trustline addition failed responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: user, message: "User created successfully", warning: "Failed to add USDC trustline to wallet", @@ -272,7 +272,7 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = if (!isContributorApp || (user.wallet && user.wallet.address)) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: user }); } @@ -327,7 +327,7 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = dataLogger.warn("Failed to create wallet for existing user", { error }); return responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: user, message: "Failed to create wallet", meta: { walletStatus } @@ -366,7 +366,7 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = dataLogger.warn("Failed to add USDC trustline", { error }); return responseWrapper({ res, - status: STATUS_CODES.PARTIAL_SUCCESS, + status: STATUS_CODES.OK, data: user, message: "Created wallet successfully", warning: "Failed to add USDC trustline to wallet", @@ -377,7 +377,7 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = // Return user with new wallet return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { user, walletStatus } }); } catch (error) { @@ -437,7 +437,7 @@ export const updateAddressBook = async (req: Request, res: Response, next: NextF // Return updated user responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: updatedUser, message: "Address added to address book" }); diff --git a/api/controllers/user/sumsub.controller.ts b/api/controllers/user/sumsub.controller.ts index 7c94359..22dd308 100644 --- a/api/controllers/user/sumsub.controller.ts +++ b/api/controllers/user/sumsub.controller.ts @@ -17,7 +17,7 @@ export const generateSumsubSdkToken = async (req: Request, res: Response, next: if (!requireKyc) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: null, message: "KYC is currently disabled" }); @@ -63,13 +63,13 @@ export const generateSumsubSdkToken = async (req: Request, res: Response, next: "SUMSUB_API_ERROR", response.data, "Sumsub SDK token generation failed", - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: response.data, message: "Sumsub SDK token generated" }); @@ -83,7 +83,7 @@ export const generateSumsubSdkToken = async (req: Request, res: Response, next: "SUMSUB_API_ERROR", errorData, `Sumsub API failed: ${error.message}`, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR )); } diff --git a/api/controllers/wallet/index.controller.ts b/api/controllers/wallet/index.controller.ts index fd7093c..10a483c 100644 --- a/api/controllers/wallet/index.controller.ts +++ b/api/controllers/wallet/index.controller.ts @@ -180,7 +180,7 @@ export const withdrawAsset = async (req: Request, res: Response, next: NextFunct // Return transaction details responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: transaction, message: "Withdrawal successful" }); @@ -319,7 +319,7 @@ export const swapAsset = async (req: Request, res: Response, next: NextFunction) // Return transaction details responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: transaction, message: "Swap successful" }); @@ -352,7 +352,7 @@ export const getWalletInfo = async (req: Request, res: Response, next: NextFunct // Return account info responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: accountInfo, message: "Wallet info retrieved successfully" }); diff --git a/api/controllers/wallet/transactions.controller.ts b/api/controllers/wallet/transactions.controller.ts index 9162221..a1f6e52 100644 --- a/api/controllers/wallet/transactions.controller.ts +++ b/api/controllers/wallet/transactions.controller.ts @@ -52,7 +52,7 @@ export const getUserTransactions = async (req: Request, res: Response, next: Nex responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results, pagination: { hasMore } }); @@ -129,7 +129,7 @@ export const getInstallationTransactions = async (req: Request, res: Response, n responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: results, pagination: { hasMore } }); @@ -192,7 +192,7 @@ export const recordWalletTopups = async (req: Request, res: Response, next: Next // No topup transactions found return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { processed: 0 }, message: "No new topup transactions found" }); @@ -248,7 +248,7 @@ export const recordWalletTopups = async (req: Request, res: Response, next: Next if (newTransactions.length === 0) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { processed: 0 }, message: "No new topup transactions found" }); @@ -275,7 +275,7 @@ export const recordWalletTopups = async (req: Request, res: Response, next: Next // Return details of recorded transactions responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { processed, transactions: newTransactions.map(tx => ({ diff --git a/api/controllers/webhook/github.controller.ts b/api/controllers/webhook/github.controller.ts index ae0789c..a78cd83 100644 --- a/api/controllers/webhook/github.controller.ts +++ b/api/controllers/webhook/github.controller.ts @@ -47,7 +47,7 @@ export const handleGitHubWebhook = async (req: Request, res: Response, next: Nex responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { eventType }, message: "Event type not processed" }); diff --git a/api/controllers/webhook/sumsub.controller.ts b/api/controllers/webhook/sumsub.controller.ts index 93bf614..6fb84e6 100644 --- a/api/controllers/webhook/sumsub.controller.ts +++ b/api/controllers/webhook/sumsub.controller.ts @@ -20,7 +20,7 @@ export const handleSumsubWebhook = async (req: Request, res: Response, next: Nex dataLogger.warn("Sumsub webhook received without externalUserId", { type }); return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, message: "Webhook processed (no externalUserId)", data: {} }); @@ -84,7 +84,7 @@ export const handleSumsubWebhook = async (req: Request, res: Response, next: Nex responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, message: "Webhook processed", data: {} }); diff --git a/api/index.ts b/api/index.ts index 732b226..ce36057 100644 --- a/api/index.ts +++ b/api/index.ts @@ -57,7 +57,7 @@ app.use( "CORS_ERROR", null, "Not allowed by CORS", - STATUS_CODES.UNAUTHORIZED + STATUS_CODES.FORBIDDEN )); }, exposedHeaders: ["Payment-Required", "Payment-Response"] diff --git a/api/middlewares/auth.middleware.ts b/api/middlewares/auth.middleware.ts index 59f2a19..46d6299 100644 --- a/api/middlewares/auth.middleware.ts +++ b/api/middlewares/auth.middleware.ts @@ -40,7 +40,7 @@ export const validateUser = async (req: Request, res: Response, next: NextFuncti "AUTHENTICATION_FAILED", error, getFieldFromUnknownObject(error, "message") || "Failed to verify ID token", - STATUS_CODES.UNAUTHENTICATED + STATUS_CODES.UNAUTHORIZED )); } } else { @@ -49,7 +49,7 @@ export const validateUser = async (req: Request, res: Response, next: NextFuncti "AUTHENTICATION_FAILED", null, "No authorization token sent", - STATUS_CODES.UNAUTHENTICATED + STATUS_CODES.UNAUTHORIZED )); } }; @@ -114,7 +114,7 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne "SERVER_MISCONFIGURATION", null, "Server misconfiguration: CLOUD_RUN_SERVICE_URL is missing", - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } diff --git a/api/middlewares/error.middleware.ts b/api/middlewares/error.middleware.ts index b047af0..6e09c19 100644 --- a/api/middlewares/error.middleware.ts +++ b/api/middlewares/error.middleware.ts @@ -26,7 +26,7 @@ export const errorHandler = ((error: unknown, req: Request, res: Response, _next // Handle custom errors if (errorName === "ErrorClass") { - const statusCode = getFieldFromUnknownObject(error, "status") || STATUS_CODES.SERVER_ERROR; + const statusCode = getFieldFromUnknownObject(error, "status") || STATUS_CODES.INTERNAL_SERVER_ERROR; return res.status(statusCode).json({ ...ErrorUtils.sanitizeError(error as ErrorClass) @@ -35,7 +35,7 @@ export const errorHandler = ((error: unknown, req: Request, res: Response, _next // Handle express validation errors if (errorName === "ValidationError") { - return res.status(STATUS_CODES.SERVER_ERROR).json({ + return res.status(STATUS_CODES.BAD_REQUEST).json({ message: getFieldFromUnknownObject(error, "message"), details: returnError ? getFieldFromUnknownObject(error, "errors") : null }); @@ -43,7 +43,7 @@ export const errorHandler = ((error: unknown, req: Request, res: Response, _next // Handle prisma known request errors if (error instanceof Prisma.PrismaClientKnownRequestError) { - return res.status(STATUS_CODES.SERVER_ERROR).json({ + return res.status(STATUS_CODES.INTERNAL_SERVER_ERROR).json({ message: getFieldFromUnknownObject(error, "message"), code: getFieldFromUnknownObject(error, "code"), details: returnError ? getFieldFromUnknownObject(error, "errors") : null @@ -51,7 +51,7 @@ export const errorHandler = ((error: unknown, req: Request, res: Response, _next } // Handle unknown errors - res.status(STATUS_CODES.UNKNOWN).json({ + res.status(STATUS_CODES.INTERNAL_SERVER_ERROR).json({ message: getFieldFromUnknownObject(error, "message") || "An unknown error occured", details: returnError ? error : null }); diff --git a/api/middlewares/rate-limit.middleware.ts b/api/middlewares/rate-limit.middleware.ts index 6bafaba..9aa40b9 100644 --- a/api/middlewares/rate-limit.middleware.ts +++ b/api/middlewares/rate-limit.middleware.ts @@ -14,7 +14,7 @@ export const apiLimiter = rateLimit({ message: { message: "Too many requests from this IP, please try again after 1 minute" }, - statusCode: STATUS_CODES.RATE_LIMIT, + statusCode: STATUS_CODES.TOO_MANY_REQUESTS, skip: (req) => req.originalUrl.startsWith(ENDPOINTS.WEBHOOK.PREFIX), handler: (req, res, next, options) => { messageLogger.warn(`Rate limit exceeded for IP: ${req.ip}`); @@ -34,7 +34,7 @@ export const webhookLimiter = rateLimit({ message: { message: "Too many webhook requests from this IP, please try again after 1 minute" }, - statusCode: STATUS_CODES.RATE_LIMIT, + statusCode: STATUS_CODES.TOO_MANY_REQUESTS, handler: (req, res, next, options) => { messageLogger.warn(`Webhook rate limit exceeded for IP: ${req.ip}`); res.status(options.statusCode).json(options.message); diff --git a/api/middlewares/request.middleware.ts b/api/middlewares/request.middleware.ts index 88270bb..ba76270 100644 --- a/api/middlewares/request.middleware.ts +++ b/api/middlewares/request.middleware.ts @@ -45,7 +45,7 @@ export const localhostOnly = (req: Request, res: Response, next: NextFunction) = // Deny access responseWrapper({ res, - status: STATUS_CODES.UNAUTHORIZED, + status: STATUS_CODES.FORBIDDEN, data: {}, message: "Access denied. Local interface only." }); diff --git a/api/middlewares/webhook.middleware.ts b/api/middlewares/webhook.middleware.ts index a14bb3f..e0b5a0c 100644 --- a/api/middlewares/webhook.middleware.ts +++ b/api/middlewares/webhook.middleware.ts @@ -73,7 +73,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!validInstallationActions.includes(action)) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Installation action not processed", meta: { action } @@ -85,7 +85,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!installation) { responseWrapper({ res, - status: STATUS_CODES.BAD_PAYLOAD, + status: STATUS_CODES.BAD_REQUEST, data: {}, message: "Missing required installation data", meta: { installation: Boolean(installation) } @@ -102,7 +102,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!validActions.includes(action)) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "installation_repositories action not processed", meta: { action } @@ -114,7 +114,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!installation) { responseWrapper({ res, - status: STATUS_CODES.BAD_PAYLOAD, + status: STATUS_CODES.BAD_REQUEST, data: {}, message: "Missing required installation data", meta: { installation: Boolean(installation) } @@ -131,7 +131,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!validActions.includes(action)) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "PR action not processed", meta: { action } @@ -143,7 +143,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (pull_request?.draft) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Skipping draft PR" }); @@ -154,7 +154,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!pull_request || !repository || !installation) { responseWrapper({ res, - status: STATUS_CODES.BAD_PAYLOAD, + status: STATUS_CODES.BAD_REQUEST, data: {}, message: "Missing required webhook data", meta: { @@ -204,7 +204,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "PR not targeting default branch - skipping review", meta: { @@ -226,7 +226,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (action !== "created" && action !== "edited") { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Issue comment action not processed", meta: { action } @@ -240,7 +240,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!comment || !issue || !repository || !installation) { responseWrapper({ res, - status: STATUS_CODES.BAD_PAYLOAD, + status: STATUS_CODES.BAD_REQUEST, data: {}, message: "Missing required webhook data", meta: { @@ -263,7 +263,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (created || deleted) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Push creation/deletion event not processed", meta: { ref, created, deleted } @@ -275,7 +275,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (ref && ref.startsWith("refs/tags/")) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Tag push not processed", meta: { ref } @@ -287,7 +287,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (!repository || !installation) { responseWrapper({ res, - status: STATUS_CODES.BAD_PAYLOAD, + status: STATUS_CODES.BAD_REQUEST, data: {}, message: "Missing required webhook data", meta: { @@ -303,7 +303,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne if (ref !== defaultBranchRef) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Push not targeting default branch - skipping", meta: { ref, defaultBranch: repository.default_branch } @@ -318,7 +318,7 @@ export const validateGitHubWebhookEvent = async (req: Request, res: Response, ne // Event type not processed responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Event type not processed", meta: { eventType } diff --git a/api/models/error.model.ts b/api/models/error.model.ts index 86a8e35..b9e18bf 100644 --- a/api/models/error.model.ts +++ b/api/models/error.model.ts @@ -14,7 +14,7 @@ export class ErrorClass { code: string, details: unknown, message: string, - status: number = STATUS_CODES.SERVER_ERROR + status: number = STATUS_CODES.INTERNAL_SERVER_ERROR ) { this.code = code; this.message = message; @@ -47,7 +47,7 @@ export class AuthorizationError extends ErrorClass { "UNAUTHORIZED", details, message, - STATUS_CODES.UNAUTHORIZED + STATUS_CODES.FORBIDDEN ); } } @@ -61,7 +61,7 @@ export class ValidationError extends ErrorClass { "VALIDATION_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.BAD_REQUEST ); } } @@ -78,7 +78,7 @@ export class AIReviewError extends ErrorClass { details: unknown, message: string, retryable: boolean = false, - status: number = STATUS_CODES.SERVER_ERROR + status: number = STATUS_CODES.INTERNAL_SERVER_ERROR ) { super(code, details, message, status); this.retryable = retryable; @@ -116,7 +116,7 @@ export class KmsServiceError extends ErrorClass { "KMS_SERVICE_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -130,7 +130,7 @@ export class StellarServiceError extends ErrorClass { "STELLAR_SERVICE_ERROR", wrapError ? ErrorUtils.extractAxiosErrorData(details) : details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -144,7 +144,7 @@ export class EscrowContractError extends ErrorClass { "ESCROW_CONTRACT_ERROR", ErrorUtils.extractAxiosErrorData(details), message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -159,7 +159,7 @@ export class GeminiServiceError extends AIReviewError { details, message, retryable, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -215,7 +215,7 @@ export class GitHubAPIError extends ErrorClass { code || "GITHUB_API_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); this.statusCode = statusCode; this.rateLimitRemaining = rateLimitRemaining; @@ -231,7 +231,7 @@ export class VoyageAPIError extends ErrorClass { "VOYAGE_API_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -246,7 +246,7 @@ export class GitHubWebhookError extends AIReviewError { details, message, false, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -261,7 +261,7 @@ export class SumsubWebhookError extends AIReviewError { details, message, false, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -275,7 +275,7 @@ export class CloudTasksError extends ErrorClass { "CLOUD_TASKS_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -315,7 +315,7 @@ export class TimeoutError extends AIReviewError { details, `Operation '${operation}' timed out after ${timeoutMs}ms`, true, - STATUS_CODES.TIMEOUT + STATUS_CODES.REQUEST_TIMEOUT ); this.operation = operation; this.timeoutMs = timeoutMs; diff --git a/api/routes/_test_/contract.test.route.ts b/api/routes/_test_/contract.test.route.ts index 7752186..e0cf193 100644 --- a/api/routes/_test_/contract.test.route.ts +++ b/api/routes/_test_/contract.test.route.ts @@ -85,7 +85,7 @@ router.get("/escrow/:taskId", // Convert BigInt values to strings for JSON serialization const serializedEscrow = convertBigIntToString(escrow); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Escrow details retrieved successfully", data: serializedEscrow }); @@ -111,7 +111,7 @@ router.post("/task/assign", contributorPublicKey ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Contributor assigned successfully", data: result }); @@ -137,7 +137,7 @@ router.post("/task/increase-bounty", amount ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Bounty increased successfully", data: result }); @@ -163,7 +163,7 @@ router.post("/task/decrease-bounty", amount ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Bounty decreased successfully", data: result }); @@ -188,7 +188,7 @@ router.post("/task/approve", taskId ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Task completion approved and funds released successfully", data: result }); @@ -214,7 +214,7 @@ router.post("/task/dispute", reason ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Dispute initiated successfully", data: result }); @@ -251,7 +251,7 @@ router.post("/task/resolve-dispute", processedResolution ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Dispute resolved successfully", data: result }); @@ -276,7 +276,7 @@ router.post("/escrow/refund", taskId ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Refund processed successfully", data: result }); diff --git a/api/routes/_test_/general.test.route.ts b/api/routes/_test_/general.test.route.ts index 0d7e9dc..9281f56 100644 --- a/api/routes/_test_/general.test.route.ts +++ b/api/routes/_test_/general.test.route.ts @@ -44,7 +44,7 @@ router.post("/encryption", // Decrypt to verify const decrypted = await KMSService.decryptWallet(encrypted as any); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Encryption test successful", data: { original: text, @@ -77,7 +77,7 @@ router.post("/decryption", // Decrypt again to verify the re-encryption works and matches const reDecrypted = await KMSService.decryptWallet(ecrypted as any); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Decryption test successful", data: { original: walletData, @@ -127,7 +127,7 @@ router.post("/create-packages", async (_, res: Response, next: NextFunction) => ] }); - res.status(STATUS_CODES.SUCCESS).json(packages); + res.status(STATUS_CODES.OK).json(packages); } catch (error) { next(error); } @@ -155,7 +155,7 @@ router.post("/reset-db", async (req: Request, res: Response) => { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Database cleared" }); @@ -163,7 +163,7 @@ router.post("/reset-db", async (req: Request, res: Response) => { dataLogger.error("Database clear operation failed", { error }); responseWrapper({ res, - status: STATUS_CODES.SERVER_ERROR, + status: STATUS_CODES.INTERNAL_SERVER_ERROR, data: {}, message: "Database clear operation failed" }); diff --git a/api/routes/_test_/octokit.test.route.ts b/api/routes/_test_/octokit.test.route.ts index 026e806..a3c4422 100644 --- a/api/routes/_test_/octokit.test.route.ts +++ b/api/routes/_test_/octokit.test.route.ts @@ -13,7 +13,7 @@ router.get("/languages/:username", (async (req: Request, res: Response, next: Ne responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, message: "User top languages retrieved successfully", data: languages }); diff --git a/api/routes/_test_/stellar.test.route.ts b/api/routes/_test_/stellar.test.route.ts index 2f8408c..3359200 100644 --- a/api/routes/_test_/stellar.test.route.ts +++ b/api/routes/_test_/stellar.test.route.ts @@ -56,7 +56,7 @@ router.post("/trustline", try { const { secretKey } = req.body; await stellarService.addTrustLine(secretKey); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "USDC trustline added successfully" }); } catch (error) { @@ -72,7 +72,7 @@ router.post("/trustline/sponsor", try { const { sponsorSecret, accountSecret } = req.body; await stellarService.addTrustLineViaSponsor(sponsorSecret, accountSecret); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "USDC trustline added successfully" }); } catch (error) { @@ -87,7 +87,7 @@ router.post("/fund", async (req: Request, res: Response, next: NextFunction) => { try { await stellarService.fundWallet(req.body.publicKey); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Wallet funded successfully" }); } catch (error) { @@ -109,7 +109,7 @@ router.post("/transfer", xlmAsset, amount ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Asset transferred successfully", data: result }); @@ -133,7 +133,7 @@ router.post("/transfer/sponsor", xlmAsset, amount ); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Asset transferred successfully", data: result }); @@ -150,7 +150,7 @@ router.post("/swap", try { const { sourceSecret, amount } = req.body; const result = await stellarService.swapAsset(sourceSecret, amount); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Asset swapped successfully", data: result }); @@ -166,7 +166,7 @@ router.get("/account/:publicKey", async (req: Request, res: Response, next: NextFunction) => { try { const accountInfo = await stellarService.getAccountInfo(req.params.publicKey); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Account info retrieved successfully", data: accountInfo }); @@ -183,7 +183,7 @@ router.get("/topup/:publicKey", try { const transactions = await stellarService.getTopUpTransactions(req.params.publicKey); - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: "Top up transactions retrieved successfully", data: transactions }); @@ -211,7 +211,7 @@ router.patch("/wallets/users/update-all", }); if (allUsers.length === 0) { - return res.status(STATUS_CODES.SUCCESS).json({ + return res.status(STATUS_CODES.OK).json({ message: "No users found to update", data: { updated: 0, failed: 0 } }); @@ -274,7 +274,7 @@ router.patch("/wallets/users/update-all", } } - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: `Wallet update completed. ${successCount} successful, ${failCount} failed.`, data: { total: allUsers.length, @@ -303,7 +303,7 @@ router.patch("/wallets/installations/update-all", }); if (allInstallations.length === 0) { - return res.status(STATUS_CODES.SUCCESS).json({ + return res.status(STATUS_CODES.OK).json({ message: "No installations found to update", data: { updated: 0, failed: 0 } }); @@ -363,7 +363,7 @@ router.patch("/wallets/installations/update-all", } } - res.status(STATUS_CODES.SUCCESS).json({ + res.status(STATUS_CODES.OK).json({ message: `Installation wallet update completed. ${successCount} successful, ${failCount} failed.`, data: { total: allInstallations.length, diff --git a/api/routes/agent.route.ts b/api/routes/agent.route.ts index b0b4992..6d840e6 100644 --- a/api/routes/agent.route.ts +++ b/api/routes/agent.route.ts @@ -76,7 +76,7 @@ if (facilitatorUrl && payTo && facilitatorApiKey) { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { success: true, taskId }, message: "Review in progress. A comment will be posted by our bot." }); @@ -89,7 +89,7 @@ if (facilitatorUrl && payTo && facilitatorApiKey) { agentRoutes.post(ENDPOINTS.AGENT.REVIEW, (req: Request, res: Response) => { responseWrapper({ res, - status: STATUS_CODES.SERVER_ERROR, + status: STATUS_CODES.INTERNAL_SERVER_ERROR, data: {}, message: "Agent features are not configured on this server." }); diff --git a/api/services/github-webhook/installation-webhook.service.ts b/api/services/github-webhook/installation-webhook.service.ts index 7761931..80b28bf 100644 --- a/api/services/github-webhook/installation-webhook.service.ts +++ b/api/services/github-webhook/installation-webhook.service.ts @@ -35,7 +35,7 @@ export class InstallationWebhookService { default: responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { action }, message: "Installation action not processed" }); @@ -73,7 +73,7 @@ export class InstallationWebhookService { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId }, message: "Installation creation logged" }); @@ -110,7 +110,7 @@ export class InstallationWebhookService { // Installation not found return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId }, message: "Installation not found in database, skipping archive" }); @@ -166,7 +166,7 @@ export class InstallationWebhookService { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId, refundedAmount }, message: `Installation archived and ${refundedAmount} USDC refunded` }); @@ -223,7 +223,7 @@ export class InstallationWebhookService { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId }, message: "Installation reactivated" }); diff --git a/api/services/github-webhook/installation_repositories-webhook.service.ts b/api/services/github-webhook/installation_repositories-webhook.service.ts index 28e73ca..c619c3b 100644 --- a/api/services/github-webhook/installation_repositories-webhook.service.ts +++ b/api/services/github-webhook/installation_repositories-webhook.service.ts @@ -46,7 +46,7 @@ export class InstallationRepositoriesWebhookService { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId, action }, message: "installation_repositories event processed" }); diff --git a/api/services/github-webhook/issue_comment-webhook.service.ts b/api/services/github-webhook/issue_comment-webhook.service.ts index 529accb..2e99b50 100644 --- a/api/services/github-webhook/issue_comment-webhook.service.ts +++ b/api/services/github-webhook/issue_comment-webhook.service.ts @@ -38,7 +38,7 @@ export class IssueCommentWebhookService { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Comment does not trigger any action - skipping" }); @@ -60,7 +60,7 @@ export class IssueCommentWebhookService { if (!issue.pull_request) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Comment is not on a pull request - skipping" }); @@ -71,7 +71,7 @@ export class IssueCommentWebhookService { if (commentBody.toLowerCase() !== "review") { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Comment body is not 'review' - skipping" }); @@ -92,7 +92,7 @@ export class IssueCommentWebhookService { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: `User is not authorized to trigger review (association: ${authorAssociation}) - skipping` }); @@ -107,7 +107,7 @@ export class IssueCommentWebhookService { if (!activeInstallation || activeInstallation.status !== "ACTIVE") { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Installation is not active or not found - skipping" }); @@ -138,7 +138,7 @@ export class IssueCommentWebhookService { if (pull_request?.draft) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Skipping draft PR" }); @@ -179,7 +179,7 @@ export class IssueCommentWebhookService { ); return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "PR not targeting default branch - skipping review", meta: { prNumber, repositoryName, targetBranch, defaultBranch, reason: "not_default_branch" } @@ -205,7 +205,7 @@ export class IssueCommentWebhookService { dataLogger.error("Failed to process 'review' comment trigger", { payload }); return responseWrapper({ res, - status: STATUS_CODES.SERVER_ERROR, + status: STATUS_CODES.INTERNAL_SERVER_ERROR, data: { timestamp: new Date().toISOString() }, message: "Failed to process review trigger" }); @@ -214,7 +214,7 @@ export class IssueCommentWebhookService { // Return a response indicating that the job was created responseWrapper({ res, - status: STATUS_CODES.BACKGROUND_JOB, + status: STATUS_CODES.ACCEPTED, data: { jobId, installationId: payload.installation.id.toString(), @@ -244,7 +244,7 @@ export class IssueCommentWebhookService { if (issue.pull_request) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Comment is on a pull request - skipping bounty creation" }); @@ -254,7 +254,7 @@ export class IssueCommentWebhookService { if (issue.state !== "open") { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Issue is not open - skipping bounty creation" }); @@ -272,7 +272,7 @@ export class IssueCommentWebhookService { }); return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: `User is not authorized to create bounties (association: ${authorAssociation}) - skipping` }); @@ -287,7 +287,7 @@ export class IssueCommentWebhookService { dataLogger.info("Bounty comment ignored: Creator not found in DevAsign", { username: comment.user?.login }); return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Commenter is not a registered user on DevAsign - skipping bounty creation" }); @@ -307,7 +307,7 @@ export class IssueCommentWebhookService { if (!activeInstallation || activeInstallation.status !== "ACTIVE" || !activeInstallation.wallet) { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Installation is not active or wallet missing - skipping" }); @@ -326,7 +326,7 @@ export class IssueCommentWebhookService { // Return success before processing since task creation takes time responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Bounty comment recognized - processing in background" }); @@ -524,7 +524,12 @@ export class IssueCommentWebhookService { "Error in async bounty task creation", { error: err, issueId: issue.id, installationId } ); - await this.bountyFailureComment(installationId, repository.full_name, issue.number); + await this.bountyFailureComment( + installationId, + repository.full_name, + issue.number, + "Bounty was created but there was an issue while posting the bounty comment or adding the bounty label on issue" + ); } })(); diff --git a/api/services/github-webhook/pull_request-webhook.service.ts b/api/services/github-webhook/pull_request-webhook.service.ts index dd4c441..cccf263 100644 --- a/api/services/github-webhook/pull_request-webhook.service.ts +++ b/api/services/github-webhook/pull_request-webhook.service.ts @@ -36,7 +36,7 @@ export class PullRequestWebhookService { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { action }, message: "PR action not processed" }); @@ -56,7 +56,7 @@ export class PullRequestWebhookService { dataLogger.error("Failed to process PR webhook", { payload }); return responseWrapper({ res, - status: STATUS_CODES.SERVER_ERROR, + status: STATUS_CODES.INTERNAL_SERVER_ERROR, data: { timestamp: new Date().toISOString() }, message: "Failed to process PR webhook" }); @@ -65,7 +65,7 @@ export class PullRequestWebhookService { // Return success response with job information responseWrapper({ res, - status: STATUS_CODES.BACKGROUND_JOB, + status: STATUS_CODES.ACCEPTED, data: { jobId, installationId: payload.installation.id.toString(), @@ -113,7 +113,7 @@ export class PullRequestWebhookService { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { prNumber, repositoryName, prUrl }, message: "No linked issues found - no payment triggered" }); @@ -150,7 +150,7 @@ export class PullRequestWebhookService { return responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { prNumber, repositoryName, prUrl, linkedIssues: linkedIssues.map(i => i.number) }, message: "No matching active or submitted task found" }); @@ -175,7 +175,7 @@ export class PullRequestWebhookService { // Return success response with job information responseWrapper({ res, - status: STATUS_CODES.BACKGROUND_JOB, + status: STATUS_CODES.ACCEPTED, data: { jobId, prNumber: pull_request.number, diff --git a/api/services/github-webhook/push-webhook.service.ts b/api/services/github-webhook/push-webhook.service.ts index 999a7c2..4ae6770 100644 --- a/api/services/github-webhook/push-webhook.service.ts +++ b/api/services/github-webhook/push-webhook.service.ts @@ -34,7 +34,7 @@ export class PushWebhookService { dataLogger.info("Push event has no file changes to process", { installationId, repositoryName }); responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId, repositoryName }, message: "No file changes to process" }); @@ -56,7 +56,7 @@ export class PushWebhookService { responseWrapper({ res, - status: STATUS_CODES.SUCCESS, + status: STATUS_CODES.OK, data: { installationId, repositoryName, diff --git a/api/utils/data.ts b/api/utils/data.ts index ddff84b..8f490a9 100644 --- a/api/utils/data.ts +++ b/api/utils/data.ts @@ -16,36 +16,40 @@ export const ALLOWED_ORIGINS = [ * HTTP status codes used throughout the application. */ export const STATUS_CODES = { - /**200 */ - SUCCESS: 200, - /**202 */ - PARTIAL_SUCCESS: 202, - /**201 */ + // --- 2xx Success --- + /** 200 */ + OK: 200, + /** 201 */ CREATED: 201, - /**203 */ - BACKGROUND_JOB: 203, - /**204 */ + /** 202 */ + ACCEPTED: 202, + /** 204 */ NO_CONTENT: 204, - /**429 */ - RATE_LIMIT: 429, - /**408 */ - TIMEOUT: 408, - - /**400 */ - UNAUTHENTICATED: 400, - /**403 */ - UNAUTHORIZED: 403, - /**401 */ - SERVER_ERROR: 401, - /**404 */ + // --- 4xx Client Errors --- + /** 400 */ + BAD_REQUEST: 400, + /** 401 */ + UNAUTHORIZED: 401, + /** 403 */ + FORBIDDEN: 403, + /** 404 */ NOT_FOUND: 404, - /**407 */ - BAD_PAYLOAD: 407, - /**500 */ - UNKNOWN: 500 + /** 408 */ + REQUEST_TIMEOUT: 408, + /** 409 */ + CONFLICT: 409, + /** 422 */ + UNPROCESSABLE_ENTITY: 422, + /** 429 */ + TOO_MANY_REQUESTS: 429, + + // --- 5xx Server Errors --- + /** 500 */ + INTERNAL_SERVER_ERROR: 500 }; + /** * API endpoint definitions */ diff --git a/tests/helpers/database-test-helper.ts b/tests/helpers/database-test-helper.ts index f8d3755..977b582 100644 --- a/tests/helpers/database-test-helper.ts +++ b/tests/helpers/database-test-helper.ts @@ -178,8 +178,10 @@ export class DatabaseTestHelper { static async seedDatabase(client: PrismaClient): Promise { try { // Create default subscription package - await client.subscriptionPackage.create({ - data: { + await client.subscriptionPackage.upsert({ + where: { id: "test-package-id" }, + update: {}, + create: { id: "test-package-id", name: "Test Package", description: "Test subscription package", @@ -200,7 +202,11 @@ export class DatabaseTestHelper { ]; for (const permission of permissions) { - await client.permission.create({ data: permission }); + await client.permission.upsert({ + where: { code: permission.code }, + update: {}, + create: permission + }); } console.log("✅ Database seeding completed"); diff --git a/tests/integration/api/installation/github.api.test.ts b/tests/integration/api/installation/github.api.test.ts index 3289bd5..aa3b7e0 100644 --- a/tests/integration/api/installation/github.api.test.ts +++ b/tests/integration/api/installation/github.api.test.ts @@ -174,7 +174,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_REPOSITORIES"]) .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toEqual( expect.arrayContaining([ @@ -216,7 +216,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_ISSUES"]) .replace(":installationId", "12345678")}?repoUrl=https://github.com/test-org/test-repo`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Issues retrieved successfully", @@ -237,7 +237,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_ISSUES"]) .replace(":installationId", "12345678")}?repoUrl=https://github.com/test-org/test-repo&page=2&perPage=10`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.pagination).toMatchObject({ hasMore: false @@ -249,7 +249,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_ISSUES"]) .replace(":installationId", "12345678")}?repoUrl=https://github.com/test-org/test-repo&labels=bug,enhancement`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(mockOctokitService.getRepoIssuesWithSearch).toHaveBeenCalledWith( "https://github.com/test-org/test-repo", @@ -289,7 +289,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_RESOURCES"]) .replace(":installationId", "12345678")}?repoUrl=https://github.com/test-org/test-repo`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ labels: expect.arrayContaining([ @@ -344,7 +344,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "SET_BOUNTY_LABEL"]) .replace(":installationId", "12345678")}?repositoryId=123456`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ bountyLabel: expect.objectContaining({ @@ -363,7 +363,7 @@ describe("Installation GitHub API Integration Tests", () => { .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "SET_BOUNTY_LABEL"]) .replace(":installationId", "12345678")}?repositoryId=123456`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: 999, @@ -390,22 +390,22 @@ describe("Installation GitHub API Integration Tests", () => { await request(appWithoutAuth) .get(getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_REPOSITORIES"]) .replace(":installationId", "12345678")) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_ISSUES"]) .replace(":installationId", "12345678")}?repoUrl=https://github.com/test/repo`) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "GET_RESOURCES"]) .replace(":installationId", "12345678")}?repoUrl=https://github.com/test/repo`) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .get(`${getEndpointWithPrefix(["INSTALLATION", "GITHUB", "SET_BOUNTY_LABEL"]) .replace(":installationId", "12345678")}?repositoryId=123`) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); }); }); }); diff --git a/tests/integration/api/installation/index.api.test.ts b/tests/integration/api/installation/index.api.test.ts index be61210..5badbe8 100644 --- a/tests/integration/api/installation/index.api.test.ts +++ b/tests/integration/api/installation/index.api.test.ts @@ -192,7 +192,7 @@ describe("Installation API Integration Tests", () => { .post(getEndpointWithPrefix(["INSTALLATION", "CREATE"])) .set("x-test-user-id", "installation-creator") .send(installationData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should handle partial success when trustline creation fails", async () => { @@ -208,7 +208,7 @@ describe("Installation API Integration Tests", () => { .post(getEndpointWithPrefix(["INSTALLATION", "CREATE"])) .set("x-test-user-id", "installation-creator") .send(installationData) - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ data: expect.objectContaining({ @@ -274,7 +274,7 @@ describe("Installation API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["INSTALLATION", "GET_ALL"])}?page=1&limit=10`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ data: expect.arrayContaining([ @@ -292,7 +292,7 @@ describe("Installation API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["INSTALLATION", "GET_ALL"])}?sort=asc`) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const dates = response.body.data.map((inst: any) => new Date(inst.createdAt).getTime()); const sortedDates = [...dates].sort((a, b) => a - b); @@ -308,7 +308,7 @@ describe("Installation API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["INSTALLATION", "GET_ALL"])) .set("x-test-user-id", "user-2") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toEqual([]); expect(response.body.pagination.hasMore).toBe(false); @@ -373,7 +373,7 @@ describe("Installation API Integration Tests", () => { .get(getEndpointWithPrefix(["INSTALLATION", "GET_BY_ID"]) .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: "12345678", @@ -453,7 +453,7 @@ describe("Installation API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") .send({ walletAddress: "GBPOJZGQPO23FSADGDD3PQFRGLWTETJRK2IY4D5HEQXLDCDEHYFSAAII" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation archived and 0 USDC refunded", @@ -483,7 +483,7 @@ describe("Installation API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") .send({ walletAddress: "GBPOJZGQPO23FSADGDD3PQFRGLWTETJRK2IY4D5HEQXLDCDEHYFSAAII" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should archive installation with tasks in progress and refund them", async () => { @@ -500,7 +500,7 @@ describe("Installation API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") .send({ walletAddress: "GBPOJZGQPO23FSADGDD3PQFRGLWTETJRK2IY4D5HEQXLDCDEHYFSAAII" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation archived and 150 USDC refunded", @@ -531,7 +531,7 @@ describe("Installation API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") .send({ walletAddress: "GBPOJZGQPO23FSADGDD3PQFRGLWTETJRK2IY4D5HEQXLDCDEHYFSAAII" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation archived and 0 USDC refunded", @@ -569,7 +569,7 @@ describe("Installation API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "user-1") .send({ walletAddress: "GBPOJZGQPO23FSADGDD3PQFRGLWTETJRK2IY4D5HEQXLDCDEHYFSAAII" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation archived and 300 USDC refunded", @@ -624,21 +624,21 @@ describe("Installation API Integration Tests", () => { await request(appWithoutAuth) .get(getEndpointWithPrefix(["INSTALLATION", "GET_ALL"])) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .get("/installations/12345678") - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .post(getEndpointWithPrefix(["INSTALLATION", "CREATE"])) .send({ installationId: "12345678" }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .patch("/installations/12345678") .send({ walletAddress: "GTEST" }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); }); }); }); diff --git a/tests/integration/api/installation/team.api.test.ts b/tests/integration/api/installation/team.api.test.ts index e06512e..b46a444 100644 --- a/tests/integration/api/installation/team.api.test.ts +++ b/tests/integration/api/installation/team.api.test.ts @@ -153,7 +153,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "team-owner") .send(memberData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ username: "newmember", @@ -205,7 +205,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "team-owner") .send(memberData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.data).toMatchObject({ username: "existingmember", @@ -224,7 +224,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "12345678")) .set("x-test-user-id", "team-owner") .send(memberData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ status: "not_found" @@ -242,7 +242,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "99999999")) .set("x-test-user-id", "team-owner") .send(memberData) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); }); @@ -309,7 +309,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":userId", teamMemberId)) .set("x-test-user-id", "team-owner") .send(updateData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Permissions updated successfully" @@ -338,7 +338,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":userId", teamMemberId)) .set("x-test-user-id", "team-owner") .send(updateData) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when user is not a team member", async () => { @@ -357,7 +357,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":userId", teamMemberId)) .set("x-test-user-id", "outsider") .send(updateData) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); }); @@ -413,7 +413,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "12345678") .replace(":userId", teamMemberId)) .set("x-test-user-id", "team-owner") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Team member removed successfully" @@ -444,7 +444,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "99999999") .replace(":userId", teamMemberId)) .set("x-test-user-id", "team-owner") - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when user is not a team member", async () => { @@ -458,7 +458,7 @@ describe("Installation Team API Integration Tests", () => { .replace(":installationId", "12345678") .replace(":userId", teamMemberId)) .set("x-test-user-id", "outsider") - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); }); @@ -479,20 +479,20 @@ describe("Installation Team API Integration Tests", () => { .post(getEndpointWithPrefix(["INSTALLATION", "TEAM", "ADD_MEMBER"]) .replace(":installationId", "12345678")) .send({ username: "test", permissionCodes: [manageTasksCode] }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .patch(getEndpointWithPrefix(["INSTALLATION", "TEAM", "UPDATE_MEMBER"]) .replace(":installationId", "12345678") .replace(":userId", generateRandomCUID())) .send({ permissionCodes: [manageTasksCode] }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .delete(getEndpointWithPrefix(["INSTALLATION", "TEAM", "REMOVE_MEMBER"]) .replace(":installationId", "12345678") .replace(":userId", generateRandomCUID())) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); }); }); }); diff --git a/tests/integration/api/internal/index.api.test.ts b/tests/integration/api/internal/index.api.test.ts index 0329159..bd4bd21 100644 --- a/tests/integration/api/internal/index.api.test.ts +++ b/tests/integration/api/internal/index.api.test.ts @@ -158,7 +158,7 @@ describe("Internal Routes API Integration Tests", () => { const response = await request(app) .post(route) .send(payload) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "PR merged - Payment processed successfully", @@ -214,7 +214,7 @@ describe("Internal Routes API Integration Tests", () => { const response = await request(app) .post(route) .send(payload) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "PR merged - Payment processed successfully", @@ -245,7 +245,7 @@ describe("Internal Routes API Integration Tests", () => { const response = await request(app) .post(route) .send(payload) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body).toMatchObject({ message: "Task ID is missing from payload" @@ -271,7 +271,7 @@ describe("Internal Routes API Integration Tests", () => { const response = await request(app) .post(route) .send(payload) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Task not found" @@ -334,7 +334,7 @@ describe("Internal Routes API Integration Tests", () => { const response = await request(app) .post(route) .send(payload) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "No wallet address found for contributor" @@ -362,7 +362,7 @@ describe("Internal Routes API Integration Tests", () => { const response = await request(app) .post(route) .send(payload) - .expect(STATUS_CODES.UNKNOWN); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Database connection failed"); expect(mockSocketService.updateAppActivity).not.toHaveBeenCalled(); diff --git a/tests/integration/api/task/activities.api.test.ts b/tests/integration/api/task/activities.api.test.ts index 7c953c5..64e2b08 100644 --- a/tests/integration/api/task/activities.api.test.ts +++ b/tests/integration/api/task/activities.api.test.ts @@ -161,7 +161,7 @@ describe("Task Activities API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "ACTIVITIES", "GET_ALL"]) .replace(":taskId", testTask.id)}?page=1&limit=10`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ data: expect.any(Array), @@ -178,7 +178,7 @@ describe("Task Activities API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "ACTIVITIES", "GET_ALL"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data[0]).toMatchObject({ id: expect.any(String), @@ -200,7 +200,7 @@ describe("Task Activities API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "ACTIVITIES", "GET_ALL"]) .replace(":taskId", testTask.id)}?sort=asc`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const dates = response.body.data.map((activity: any) => new Date(activity.createdAt).getTime()); const sortedDates = [...dates].sort((a, b) => a - b); @@ -217,7 +217,7 @@ describe("Task Activities API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "ACTIVITIES", "GET_ALL"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "other-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(0); }); @@ -246,7 +246,7 @@ describe("Task Activities API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "ACTIVITIES", "GET_ALL"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const submissionActivity = response.body.data.find( (activity: any) => activity.taskSubmissionId === submission.id @@ -320,7 +320,7 @@ describe("Task Activities API Integration Tests", () => { .patch(getEndpointWithPrefix(["TASK", "ACTIVITIES", "MARK_VIEWED"]) .replace(":taskActivityId", testActivity.id)) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: testActivity.id, @@ -368,7 +368,7 @@ describe("Task Activities API Integration Tests", () => { .patch(getEndpointWithPrefix(["TASK", "ACTIVITIES", "MARK_VIEWED"]) .replace(":taskActivityId", testActivity.id)) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data.viewed).toBe(true); }); diff --git a/tests/integration/api/task/contributor.api.test.ts b/tests/integration/api/task/contributor.api.test.ts index 1b37003..67bd879 100644 --- a/tests/integration/api/task/contributor.api.test.ts +++ b/tests/integration/api/task/contributor.api.test.ts @@ -163,7 +163,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?page=1&limit=10`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ data: expect.any(Array), @@ -179,7 +179,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?status=IN_PROGRESS`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(1); expect(response.body.data[0]).toMatchObject({ @@ -191,7 +191,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?installationId=${testInstallation.id}`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toEqual(expect.any(Array)); const validResult = (response.body.data as any[]).every( @@ -204,7 +204,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?detailed=true`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data[0]).toMatchObject({ installation: expect.objectContaining({ @@ -228,7 +228,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])) .set("x-test-user-id", "other-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(0); }); @@ -248,7 +248,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?sort=asc`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const dates = response.body.data.map((task: any) => new Date(task.acceptedAt).getTime()); const sortedDates = [...dates].sort((a, b) => a - b); @@ -279,7 +279,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?status=APPLIED`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(1); expect(response.body.data[0].id).toBe(task.id); @@ -315,7 +315,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?status=NOT_ACCEPTED`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(1); expect(response.body.data[0].id).toBe(task.id); @@ -325,7 +325,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?issueTitle=GitHub`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data.length).toBeGreaterThan(0); expect(response.body.data[0].issue.title).toContain("GitHub"); @@ -335,7 +335,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?repoUrl=user/repo`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data.length).toBeGreaterThan(0); expect(response.body.data[0].issue.repository.url).toContain("user/repo"); @@ -345,7 +345,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?issueLabels=bug`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data.length).toBeGreaterThan(0); const hasBug = response.body.data[0].issue.labels.some((l: any) => l.name === "bug"); @@ -356,7 +356,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}?limit=1`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(1); expect(response.body.pagination.hasMore).toBe(true); @@ -387,7 +387,7 @@ describe("Task Contributor API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASKS"])}`) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const fetchedOtherTask = response.body.data.find((t: any) => t.id === otherTask.id); expect(fetchedOtherTask).toBeDefined(); @@ -439,7 +439,7 @@ describe("Task Contributor API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASK"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: testTask.id, @@ -481,7 +481,7 @@ describe("Task Contributor API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASK"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "contributor-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: expect.any(String), @@ -513,7 +513,7 @@ describe("Task Contributor API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "CONTRIBUTOR", "GET_TASK"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "applicant-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data.id).toBe(testTask.id); // Verify privacy: fields should be omitted since they are not the contributor diff --git a/tests/integration/api/task/index.api.test.ts b/tests/integration/api/task/index.api.test.ts index b1a6c12..7a0a379 100644 --- a/tests/integration/api/task/index.api.test.ts +++ b/tests/integration/api/task/index.api.test.ts @@ -9,7 +9,6 @@ import { DatabaseTestHelper } from "../../../helpers/database-test-helper.js"; import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; -import { dataLogger } from "../../../../api/config/logger.config.js"; import { apiLimiter } from "../../../../api/middlewares/rate-limit.middleware.js"; // Mock Firebase admin for authentication @@ -277,7 +276,7 @@ describe("Task API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "CREATE"])) .set("x-test-user-id", "task-creator-user") .send(taskData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should handle partial success when bounty comment creation fails", async () => { @@ -299,7 +298,7 @@ describe("Task API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "CREATE"])) .set("x-test-user-id", "task-creator-user") .send(taskData) - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: expect.any(String), @@ -328,7 +327,7 @@ describe("Task API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "CREATE"])) .set("x-test-user-id", "task-creator-user") .send(taskData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toBe("Cannot create task for an archived installation"); }); @@ -360,7 +359,7 @@ describe("Task API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "CREATE"])) .set("x-test-user-id", "task-creator-user") .send(taskData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toBe("Installation wallet not found"); }); @@ -389,7 +388,7 @@ describe("Task API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "CREATE"])) .set("x-test-user-id", "task-creator-user") .send(taskData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toBe("USDC trustline not found"); }); @@ -414,7 +413,7 @@ describe("Task API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "CREATE"])) .set("x-test-user-id", "task-creator-user") .send(taskData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Failed to create escrow on smart contract"); @@ -479,7 +478,7 @@ describe("Task API Integration Tests", () => { it("should get all open tasks with pagination", async () => { const response = await request(app) .get(`${publicPrefix}${ENDPOINTS.TASK.GET_ALL}?page=1&limit=10`) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject( expect.arrayContaining([ @@ -501,7 +500,7 @@ describe("Task API Integration Tests", () => { const response = await request(app) .get(`${publicPrefix}${ENDPOINTS.TASK.GET_ALL}?installationId=${installation.id}`) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const validResult = (response.body.data as any[]).every( task => task.installationId === installation.id @@ -512,7 +511,7 @@ describe("Task API Integration Tests", () => { it("should return detailed view when requested", async () => { const response = await request(app) .get(`${publicPrefix}${ENDPOINTS.TASK.GET_ALL}?detailed=true`) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const validResult = (response.body.data as any[]).every( task => task.creator.userId === "user-1" @@ -523,7 +522,7 @@ describe("Task API Integration Tests", () => { it("should sort tasks by creation date", async () => { const response = await request(app) .get(`${publicPrefix}${ENDPOINTS.TASK.GET_ALL}?sort=asc`) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const dates = response.body.data.map((task: any) => new Date(task.createdAt).getTime()); const sortedDates = [...dates].sort((a, b) => (a as any) - (b as any)); @@ -560,7 +559,7 @@ describe("Task API Integration Tests", () => { it("should get task by ID successfully", async () => { const response = await request(app) .get(`${publicPrefix}/${testTask.id}`) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data.id).toBe(testTask.id); }); @@ -618,7 +617,7 @@ describe("Task API Integration Tests", () => { const response = await request(app) .delete(`/tasks/${testTask.id}`) .set("x-test-user-id", "task-owner") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ refunded: "100 USDC" @@ -651,7 +650,7 @@ describe("Task API Integration Tests", () => { await request(app) .delete(`/tasks/${testTask.id}`) .set("x-test-user-id", "different-user") - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when task is not open", async () => { @@ -663,7 +662,7 @@ describe("Task API Integration Tests", () => { await request(app) .delete(`/tasks/${testTask.id}`) .set("x-test-user-id", "task-owner") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when task has assigned contributor", async () => { @@ -680,7 +679,7 @@ describe("Task API Integration Tests", () => { await request(app) .delete(`/tasks/${testTask.id}`) .set("x-test-user-id", "task-owner") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should handle partial success when GitHub operations fail", async () => { @@ -691,7 +690,7 @@ describe("Task API Integration Tests", () => { const response = await request(app) .delete(`/tasks/${testTask.id}`) .set("x-test-user-id", "task-owner") - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ refunded: "100 USDC" @@ -722,7 +721,7 @@ describe("Task API Integration Tests", () => { const response = await request(app) .delete(`/tasks/${testTask.id}`) .set("x-test-user-id", "task-owner") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toBe("Cannot delete task for an archived installation"); }); @@ -743,11 +742,11 @@ describe("Task API Integration Tests", () => { await request(appWithoutAuth) .post(getEndpointWithPrefix(["TASK", "CREATE"])) .send({ payload: {} }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .delete("/tasks/task-id") - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); }); }); }); diff --git a/tests/integration/api/task/installation.api.test.ts b/tests/integration/api/task/installation.api.test.ts index 6bbb53c..a48dc2b 100644 --- a/tests/integration/api/task/installation.api.test.ts +++ b/tests/integration/api/task/installation.api.test.ts @@ -159,7 +159,7 @@ describe("Task Installation API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "INSTALLATION", "GET_TASKS"]) .replace(":installationId", testInstallation.id)}?page=1&limit=10`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ data: expect.any(Array), @@ -176,7 +176,7 @@ describe("Task Installation API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "INSTALLATION", "GET_TASKS"]) .replace(":installationId", testInstallation.id)}?status=OPEN`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(1); expect(response.body.data[0]).toMatchObject({ @@ -189,7 +189,7 @@ describe("Task Installation API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "INSTALLATION", "GET_TASKS"]) .replace(":installationId", testInstallation.id)}?detailed=true`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data[0]).toMatchObject({ installation: expect.objectContaining({ @@ -206,7 +206,7 @@ describe("Task Installation API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "INSTALLATION", "GET_TASKS"]) .replace(":installationId", testInstallation.id)}?repoUrl=github.com`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toEqual(expect.any(Array)); }); @@ -221,7 +221,7 @@ describe("Task Installation API Integration Tests", () => { .get(getEndpointWithPrefix(["TASK", "INSTALLATION", "GET_TASKS"]) .replace(":installationId", testInstallation.id)) .set("x-test-user-id", "other-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(0); }); @@ -231,7 +231,7 @@ describe("Task Installation API Integration Tests", () => { .get(`${getEndpointWithPrefix(["TASK", "INSTALLATION", "GET_TASKS"]) .replace(":installationId", testInstallation.id)}?sort=asc`) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const dates = response.body.data.map((task: any) => new Date(task.createdAt).getTime()); const sortedDates = [...dates].sort((a, b) => a - b); @@ -285,7 +285,7 @@ describe("Task Installation API Integration Tests", () => { .replace(":installationId", testInstallation.id) .replace(":taskId", testTask.id)) .set("x-test-user-id", "installation-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: testTask.id, diff --git a/tests/integration/api/task/{taskId}.api.test.ts b/tests/integration/api/task/{taskId}.api.test.ts index 63f9945..3c51f41 100644 --- a/tests/integration/api/task/{taskId}.api.test.ts +++ b/tests/integration/api/task/{taskId}.api.test.ts @@ -233,7 +233,7 @@ describe("Task {taskId} API Integration Tests", () => { issueId: "issue-123", bountyLabelId: "label-123" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: testTask.id @@ -256,7 +256,7 @@ describe("Task {taskId} API Integration Tests", () => { issueId: "issue-123", bountyLabelId: "label-123" }) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when task is not open", async () => { @@ -274,7 +274,7 @@ describe("Task {taskId} API Integration Tests", () => { issueId: "issue-123", bountyLabelId: "label-123" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return 404 when task not found", async () => { @@ -305,7 +305,7 @@ describe("Task {taskId} API Integration Tests", () => { issueId: "issue-123", bountyLabelId: "label-123" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -356,7 +356,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "150" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ bounty: 150, @@ -373,7 +373,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "50" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ bounty: 50, @@ -390,7 +390,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "different-user") .send({ newBounty: "150" }) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when task has applications", async () => { @@ -411,7 +411,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "150" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toContain("Cannot update the bounty"); }); @@ -422,7 +422,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "100" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toBe("New bounty is the same as current bounty"); }); @@ -442,7 +442,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "200" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toContain("Insufficient USDC balance"); }); @@ -457,7 +457,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "150" }) - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ bountyCommentPosted: false, @@ -480,7 +480,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newBounty: "150" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -530,7 +530,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newTimeline: 2 }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ timeline: 2, @@ -544,7 +544,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "different-user") .send({ newTimeline: 2 }) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when task has applications", async () => { @@ -565,7 +565,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newTimeline: 2 }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toContain("Cannot update the timeline"); }); @@ -581,7 +581,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") .send({ newTimeline: 2 }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -634,7 +634,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "APPLY"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "applicant") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Task application submitted" @@ -662,7 +662,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "APPLY"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "applicant") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toContain("You have already applied"); }); @@ -677,7 +677,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "APPLY"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "applicant") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toBe("This task has already been delegated to someone else"); }); @@ -700,7 +700,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "APPLY"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "applicant") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should fetch user tech stack when user has empty tech stack", async () => { @@ -711,7 +711,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "APPLY"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "applicant") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Task application submitted" @@ -736,7 +736,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "APPLY"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "user-with-tech") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Task application submitted" @@ -810,7 +810,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id) .replace(":contributorId", contributorId)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: testTask.id, @@ -835,7 +835,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id) .replace(":contributorId", contributorId)) .set("x-test-user-id", "different-user") - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when contributor did not apply", async () => { @@ -850,7 +850,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id) .replace(":contributorId", nonApplicantId)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when task already has contributor", async () => { @@ -867,7 +867,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id) .replace(":contributorId", contributorId)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should handle partial success when Firebase fails", async () => { @@ -880,7 +880,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id) .replace(":contributorId", contributorId)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ id: testTask.id, @@ -900,7 +900,7 @@ describe("Task {taskId} API Integration Tests", () => { .replace(":taskId", testTask.id) .replace(":contributorId", contributorId)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -963,7 +963,7 @@ describe("Task {taskId} API Integration Tests", () => { reason: "Need more time to complete", attachments: [] }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); // Verify Firebase service was called expect(mockFirebaseService.createMessage).toHaveBeenCalledTimes(1); @@ -979,7 +979,7 @@ describe("Task {taskId} API Integration Tests", () => { requestedTimeline: 1, reason: "Need more time" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when task is not in progress", async () => { @@ -997,7 +997,7 @@ describe("Task {taskId} API Integration Tests", () => { requestedTimeline: 1, reason: "Need more time" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -1058,7 +1058,7 @@ describe("Task {taskId} API Integration Tests", () => { accept: true, requestedTimeline: 1 }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ message: expect.any(Object), @@ -1078,7 +1078,7 @@ describe("Task {taskId} API Integration Tests", () => { accept: false, requestedTimeline: 1 }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ message: expect.any(Object) @@ -1100,7 +1100,7 @@ describe("Task {taskId} API Integration Tests", () => { accept: true, requestedTimeline: 1 }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); @@ -1162,7 +1162,7 @@ describe("Task {taskId} API Integration Tests", () => { pullRequest: "https://github.com/owner/repo/pull/123", attachmentUrl: "https://example.com/attachment.pdf" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ status: "MARKED_AS_COMPLETED", @@ -1192,7 +1192,7 @@ describe("Task {taskId} API Integration Tests", () => { .send({ pullRequest: "https://github.com/owner/repo/pull/123" }) - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when task is not in progress", async () => { @@ -1208,7 +1208,7 @@ describe("Task {taskId} API Integration Tests", () => { .send({ pullRequest: "https://github.com/owner/repo/pull/123" }) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -1273,7 +1273,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "VALIDATE_COMPLETION"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ status: "COMPLETED", @@ -1301,7 +1301,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "VALIDATE_COMPLETION"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "different-user") - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); it("should return error when task is not marked as completed", async () => { @@ -1314,7 +1314,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "VALIDATE_COMPLETION"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when contributor is not found", async () => { @@ -1326,7 +1326,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "VALIDATE_COMPLETION"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); expect(response.body.message).toContain("Contributor not found"); }); @@ -1338,7 +1338,7 @@ describe("Task {taskId} API Integration Tests", () => { .post(getEndpointWithPrefix(["TASK", "{TASKID}", "VALIDATE_COMPLETION"]) .replace(":taskId", testTask.id)) .set("x-test-user-id", "task-creator") - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.warning).toContain("Failed to disable chat for the task."); }); diff --git a/tests/integration/api/user/index.api.test.ts b/tests/integration/api/user/index.api.test.ts index 4c0ce6a..bab4994 100644 --- a/tests/integration/api/user/index.api.test.ts +++ b/tests/integration/api/user/index.api.test.ts @@ -203,7 +203,7 @@ describe("User API Integration Tests", () => { .post(getEndpointWithPrefix(["USER", "CREATE"])) .set("x-test-user-id", "existing-user") .send(userData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should handle wallet creation failure gracefully", async () => { @@ -217,7 +217,7 @@ describe("User API Integration Tests", () => { .post(getEndpointWithPrefix(["USER", "CREATE"])) .set("x-test-user-id", "new-user-999") .send(userData) - .expect(STATUS_CODES.UNKNOWN); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); }); it("should handle trustline creation failure gracefully", async () => { @@ -231,7 +231,7 @@ describe("User API Integration Tests", () => { .post(getEndpointWithPrefix(["USER", "CREATE"])) .set("x-test-user-id", "new-user-888") .send(userData) - .expect(STATUS_CODES.PARTIAL_SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ userId: "new-user-888", @@ -279,7 +279,7 @@ describe("User API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["USER", "GET"])) .set("x-test-user-id", "test-get-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ userId: "test-get-user", @@ -301,7 +301,7 @@ describe("User API Integration Tests", () => { const response = await request(app) .get("/users?view=full") .set("x-test-user-id", "test-get-user") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ userId: "test-get-user", @@ -338,7 +338,7 @@ describe("User API Integration Tests", () => { .get(getEndpointWithPrefix(["USER", "GET"])) .set("x-test-user-id", "user-no-wallet") .set("origin", "http://localhost:4000") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); // Response should include user and walletStatus expect(response.body.data.user).toBeDefined(); @@ -421,7 +421,7 @@ describe("User API Integration Tests", () => { .patch(getEndpointWithPrefix(["USER", "UPDATE_ADDRESS_BOOK"])) .set("x-test-user-id", "test-addressbook-user") .send(duplicateAddress) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return 404 when user does not exist", async () => { @@ -453,17 +453,17 @@ describe("User API Integration Tests", () => { await request(appWithoutAuth) .get(getEndpointWithPrefix(["USER", "GET"])) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .post(getEndpointWithPrefix(["USER", "CREATE"])) .send({ githubUsername: "test" }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); await request(appWithoutAuth) .patch(getEndpointWithPrefix(["USER", "UPDATE_ADDRESS_BOOK"])) .send({ address: "GTEST1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF12", name: "Test" }) - .expect(STATUS_CODES.UNAUTHENTICATED); + .expect(STATUS_CODES.UNAUTHORIZED); }); }); @@ -483,7 +483,7 @@ describe("User API Integration Tests", () => { const getResponse = await request(app) .get(`${getEndpointWithPrefix(["USER", "GET"])}?view=full`) .set("x-test-user-id", userId) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(getResponse.body.data.userId).toBe(userId); expect(getResponse.body.data.username).toBe("consistencytest"); @@ -496,13 +496,13 @@ describe("User API Integration Tests", () => { address: "GBPOJZGQPO23FSADGDD3PQFRGLWTETJRK2IY4D5HEQXLDCDEHYFSAAII", name: "Test Contact" }) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); // Verify all changes persisted const finalGetResponse = await request(app) .get(`${getEndpointWithPrefix(["USER", "GET"])}?view=full`) .set("x-test-user-id", userId) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(finalGetResponse.body.data).toMatchObject({ userId, @@ -544,7 +544,7 @@ describe("User API Integration Tests", () => { // At least one should succeed (due to race conditions, some might fail) const successfulResults = results.filter(result => - result.status === "fulfilled" && result.value.status === STATUS_CODES.SUCCESS + result.status === "fulfilled" && result.value.status === STATUS_CODES.OK ); expect(successfulResults.length).toBeGreaterThan(0); diff --git a/tests/integration/api/user/sumsub.api.test.ts b/tests/integration/api/user/sumsub.api.test.ts index 41ff43e..5911286 100644 --- a/tests/integration/api/user/sumsub.api.test.ts +++ b/tests/integration/api/user/sumsub.api.test.ts @@ -106,7 +106,7 @@ describe("User Sumsub API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["USER", "SUMSUB_TOKEN"])) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ data: null, @@ -128,7 +128,7 @@ describe("User Sumsub API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["USER", "SUMSUB_TOKEN"])) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toEqual(mockSumsubResponse); @@ -160,7 +160,7 @@ describe("User Sumsub API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["USER", "SUMSUB_TOKEN"])) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body).toMatchObject({ message: "Sumsub SDK token generation failed" @@ -172,7 +172,7 @@ describe("User Sumsub API Integration Tests", () => { await request(app) .get(getEndpointWithPrefix(["USER", "SUMSUB_TOKEN"])) - .expect(STATUS_CODES.UNKNOWN); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); }); }); }); diff --git a/tests/integration/api/wallet/index.api.test.ts b/tests/integration/api/wallet/index.api.test.ts index eecebc3..14a006c 100644 --- a/tests/integration/api/wallet/index.api.test.ts +++ b/tests/integration/api/wallet/index.api.test.ts @@ -134,7 +134,7 @@ describe("Wallet API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["WALLET", "GET_ACCOUNT"])) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ balances: expect.arrayContaining([ @@ -169,7 +169,7 @@ describe("Wallet API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["WALLET", "GET_ACCOUNT"])}?installationId=12345678`) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ balances: expect.any(Array) @@ -231,7 +231,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should withdraw USDC successfully from user wallet (fee sponsored)", async () => { @@ -246,7 +246,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(mockStellarService.transferAssetViaSponsor).toHaveBeenCalledWith( expect.any(String), @@ -289,7 +289,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); }); it("should allow withdrawing with a MEMO_HASH (64-character hex)", async () => { @@ -304,7 +304,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); }); it("should return error when memo is invalid (exceeds 28 bytes text)", async () => { @@ -320,7 +320,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when insufficient XLM balance for installation wallet", async () => { @@ -358,7 +358,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when insufficient USDC balance", async () => { @@ -387,7 +387,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error for invalid amount", async () => { @@ -401,7 +401,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should withdraw USDC from installation wallet", async () => { @@ -429,7 +429,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ txHash: "mock_tx_hash_123", @@ -472,7 +472,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ txHash: "mock_tx_hash_123", @@ -527,7 +527,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when no USDC asset found in wallet during USDC withdrawal", async () => { @@ -546,7 +546,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "WITHDRAW"])) .set("x-test-user-id", "test-user-1") .send(withdrawData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); }); @@ -592,7 +592,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ txHash: "mock_swap_tx_hash_123", @@ -624,7 +624,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toMatchObject({ txHash: "mock_swap_tx_hash_123", @@ -657,7 +657,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when insufficient USDC balance for swap to XLM", async () => { @@ -684,7 +684,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when installation not found or user not a member", async () => { @@ -721,7 +721,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should return error when no USDC asset found in wallet for swap to XLM", async () => { @@ -742,7 +742,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.BAD_REQUEST); }); it("should record accurate transaction details for swap", async () => { @@ -758,7 +758,7 @@ describe("Wallet API Integration Tests", () => { ) .set("x-test-user-id", "test-user-1") .send(swapData) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const transaction = await prisma.transaction.findFirst({ where: { txHash: "mock_swap_tx_hash_123" } @@ -795,7 +795,7 @@ describe("Wallet API Integration Tests", () => { await request(app) .get(getEndpointWithPrefix(["WALLET", "GET_ACCOUNT"])) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.UNKNOWN); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); }); }); }); diff --git a/tests/integration/api/wallet/transactions.api.test.ts b/tests/integration/api/wallet/transactions.api.test.ts index 311ed04..824aea5 100644 --- a/tests/integration/api/wallet/transactions.api.test.ts +++ b/tests/integration/api/wallet/transactions.api.test.ts @@ -125,7 +125,7 @@ describe("Wallet API Integration Tests", () => { const response = await request(app) .get(getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "GET_ALL_USER"])) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(3); expect(response.body.pagination.hasMore).toBe(false); @@ -135,7 +135,7 @@ describe("Wallet API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "GET_ALL_USER"])}?page=1&limit=2`) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(2); expect(response.body.pagination.hasMore).toBe(true); @@ -145,7 +145,7 @@ describe("Wallet API Integration Tests", () => { const response = await request(app) .get(`${getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "GET_ALL_USER"])}?sort=asc`) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(3); }); @@ -223,7 +223,7 @@ describe("Wallet API Integration Tests", () => { .replace(":installationId", installationId) ) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(3); expect(response.body.pagination.hasMore).toBe(false); @@ -235,7 +235,7 @@ describe("Wallet API Integration Tests", () => { `${getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "GET_ALL_INSTALLATION"]).replace(":installationId", installationId)}?categories=TOP_UP` ) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(2); expect(response.body.data.every((tx: any) => @@ -249,7 +249,7 @@ describe("Wallet API Integration Tests", () => { `${getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "GET_ALL_INSTALLATION"]).replace(":installationId", installationId)}?page=1&limit=2` ) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(2); expect(response.body.pagination.hasMore).toBe(true); @@ -261,7 +261,7 @@ describe("Wallet API Integration Tests", () => { `${getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "GET_ALL_INSTALLATION"]).replace(":installationId", installationId)}?sort=asc` ) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.data).toHaveLength(3); }); @@ -282,7 +282,7 @@ describe("Wallet API Integration Tests", () => { .replace(":installationId", "11111111") ) .set("x-test-user-id", "test-user-1") - .expect(STATUS_CODES.UNAUTHORIZED); + .expect(STATUS_CODES.FORBIDDEN); }); }); @@ -323,7 +323,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "RECORD_TOPUPS"])) .set("x-test-user-id", "test-user-1") .send({}) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Successfully processed 2 topup transactions", @@ -379,7 +379,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "RECORD_TOPUPS"])) .set("x-test-user-id", "test-user-1") .send({}) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "No new topup transactions found", @@ -394,7 +394,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "RECORD_TOPUPS"])) .set("x-test-user-id", "test-user-1") .send({}) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "No new topup transactions found", @@ -432,7 +432,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "RECORD_TOPUPS"])) .set("x-test-user-id", "test-user-1") .send({}) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Successfully processed 1 topup transactions", @@ -476,7 +476,7 @@ describe("Wallet API Integration Tests", () => { .post(getEndpointWithPrefix(["WALLET", "TRANSACTIONS", "RECORD_TOPUPS"])) .set("x-test-user-id", "test-user-1") .send({}) - .expect(STATUS_CODES.UNKNOWN); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); }); }); }); diff --git a/tests/integration/api/webhook/github.api.test.ts b/tests/integration/api/webhook/github.api.test.ts index 039e3c3..fead0fd 100644 --- a/tests/integration/api/webhook/github.api.test.ts +++ b/tests/integration/api/webhook/github.api.test.ts @@ -9,7 +9,6 @@ import { TestDataFactory } from "../../../../tests/helpers/test-data-factory.js" import { ENDPOINTS, STATUS_CODES } from "../../../../api/utils/data.js"; import { getEndpointWithPrefix } from "../../../helpers/test-utils.js"; import { mockFirebaseAuth } from "../../../mocks/firebase.service.mock.js"; -import { BOUNTY_LABEL } from "../../../../api/models/github.model.js"; // Mock Firebase admin for authentication vi.mock("../../../../api/config/firebase.config", () => { @@ -238,7 +237,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation creation logged", @@ -264,7 +263,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation creation logged", @@ -326,7 +325,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation archived and 100 USDC refunded", @@ -365,7 +364,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Installation reactivated", @@ -403,7 +402,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "installation_repositories event processed", @@ -428,7 +427,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "installation_repositories event processed", @@ -453,7 +452,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body).toMatchObject({ message: "PR webhook processed successfully - analysis queued", @@ -502,7 +501,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body).toMatchObject({ message: "PR webhook processed successfully - analysis queued", @@ -530,7 +529,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Failed to process PR webhook"); }); @@ -549,7 +548,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", invalidSignature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Invalid webhook signature"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -564,7 +563,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Event", "pull_request") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Missing webhook signature"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -581,7 +580,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "Event type not processed", @@ -602,7 +601,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "PR action not processed", @@ -628,7 +627,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "PR not targeting default branch - skipping review", @@ -654,7 +653,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(invalidJson) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Invalid JSON payload"); }); @@ -671,7 +670,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body.message).toBe("PR webhook processed successfully - analysis queued"); expect(mockCloudTasksService.addPRAnalysisJob).toHaveBeenCalledWith( @@ -693,7 +692,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body.message).toBe("PR webhook processed successfully - analysis queued"); expect(mockCloudTasksService.addPRAnalysisJob).toHaveBeenCalledWith( @@ -778,7 +777,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body).toMatchObject({ message: "Bounty payout job queued", @@ -820,7 +819,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body).toMatchObject({ message: "PR action not processed", @@ -936,7 +935,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "ic-delivery-1") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body.message).toBe("PR webhook processed successfully - analysis queued"); expect(response.body.data).toMatchObject({ @@ -965,7 +964,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.BACKGROUND_JOB); + .expect(STATUS_CODES.ACCEPTED); expect(response.body.message).toBe("PR webhook processed successfully - analysis queued"); }); @@ -983,7 +982,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Comment is not on a pull request - skipping"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -1000,7 +999,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Comment does not trigger any action - skipping"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -1019,7 +1018,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("User is not authorized to trigger review (association: CONTRIBUTOR) - skipping"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -1042,7 +1041,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Installation is not active or not found - skipping"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -1062,7 +1061,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Skipping draft PR"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -1085,7 +1084,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("PR not targeting default branch - skipping review"); expect(response.body.meta).toMatchObject({ @@ -1108,7 +1107,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Issue comment action not processed"); expect(mockCloudTasksService.addPRAnalysisJob).not.toHaveBeenCalled(); @@ -1136,7 +1135,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Bounty comment recognized - processing in background"); }); @@ -1169,7 +1168,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Bounty comment recognized - processing in background"); } @@ -1195,7 +1194,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Comment does not trigger any action - skipping"); }); @@ -1214,7 +1213,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Comment is on a pull request - skipping bounty creation"); }); @@ -1235,7 +1234,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Issue is not open - skipping bounty creation"); }); @@ -1256,7 +1255,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("User is not authorized to create bounties (association: NONE) - skipping"); }); @@ -1277,7 +1276,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Commenter is not a registered user on DevAsign - skipping bounty creation"); }); @@ -1304,7 +1303,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Installation is not active or wallet missing - skipping"); @@ -1353,7 +1352,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); expect(response.body.message).toBe("Bounty comment recognized - processing in background"); @@ -1413,7 +1412,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const failureCommentCalled = await waitFor(async () => { return mockOctokitService.createComment.mock.calls.length > 0; @@ -1446,7 +1445,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const failureCommentCalled = await waitFor(async () => { return mockOctokitService.createComment.mock.calls.length > 0; @@ -1478,7 +1477,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const failureCommentCalled = await waitFor(async () => { return mockOctokitService.createComment.mock.calls.length > 0; @@ -1512,7 +1511,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", signature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const failureCommentCalled = await waitFor(async () => { return mockOctokitService.createComment.mock.calls.length > 0; @@ -1547,7 +1546,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("API rate limit exceeded"); expect(response.body.code).toBe("GITHUB_API_ERROR"); @@ -1570,7 +1569,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Failed to analyze PR changes"); expect(response.body.code).toBe("PR_ANALYSIS_ERROR"); @@ -1594,7 +1593,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Delivery", "test-delivery-123") .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.UNKNOWN); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body.message).toBe("Unexpected database connection error"); }); @@ -1613,7 +1612,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Event", "pull_request") .set("X-Hub-Signature-256", "sha256=test") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body).toMatchObject({ message: "GitHub webhook secret not configured", @@ -1638,7 +1637,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-Hub-Signature-256", invalidSignature) .set("Content-Type", "application/json") .send(payloadString) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body).toMatchObject({ message: "Invalid webhook signature" @@ -1660,7 +1659,7 @@ describe("GitHub Webhook API Integration Tests", () => { .set("X-GitHub-Event", "pull_request") .set("X-Hub-Signature-256", signature) .send(payload) - .expect(STATUS_CODES.SERVER_ERROR); + .expect(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(response.body).toMatchObject({ message: "Invalid request body format", @@ -1708,7 +1707,7 @@ describe("GitHub Webhook API Integration Tests", () => { const responses = await Promise.all(webhookPromises); responses.forEach((response, _i) => { - expect(response.status).toBe(STATUS_CODES.BACKGROUND_JOB); + expect(response.status).toBe(STATUS_CODES.ACCEPTED); expect(response.body.message).toContain("PR webhook processed"); }); diff --git a/tests/integration/api/webhook/sumsub.api.test.ts b/tests/integration/api/webhook/sumsub.api.test.ts index 44e1376..1394f8d 100644 --- a/tests/integration/api/webhook/sumsub.api.test.ts +++ b/tests/integration/api/webhook/sumsub.api.test.ts @@ -87,7 +87,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("x-payload-digest", signPayload(payload)) .set("Content-Type", "application/json") .send(JSON.stringify(payload)) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const updatedUser = await prisma.user.findUnique({ where: { userId: TEST_USER_ID } }); expect(updatedUser?.verified).toBe(true); @@ -108,7 +108,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("x-payload-digest", signPayload(payload)) .set("Content-Type", "application/json") .send(JSON.stringify(payload)) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const updatedUser = await prisma.user.findUnique({ where: { userId: TEST_USER_ID } }); expect(updatedUser?.verified).toBe(false); @@ -129,7 +129,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("x-payload-digest", signPayload(payload)) .set("Content-Type", "application/json") .send(JSON.stringify(payload)) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const updatedUser = await prisma.user.findUnique({ where: { userId: TEST_USER_ID } }); expect(updatedUser?.verified).toBe(false); // Should remain false @@ -149,7 +149,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("x-payload-digest", signPayload(payload)) .set("Content-Type", "application/json") .send(JSON.stringify(payload)) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const updatedUser = await prisma.user.findUnique({ where: { userId: TEST_USER_ID } }); expect(updatedUser?.verified).toBe(true); @@ -168,7 +168,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("x-payload-digest", signPayload(payload)) .set("Content-Type", "application/json") .send(JSON.stringify(payload)) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); const updatedUser = await prisma.user.findUnique({ where: { userId: TEST_USER_ID } }); expect(updatedUser?.verified).toBe(false); @@ -186,7 +186,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("x-payload-digest", signPayload(payload)) .set("Content-Type", "application/json") .send(JSON.stringify(payload)) - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); }); it("should reject request with invalid signature", async () => { @@ -201,7 +201,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("Content-Type", "application/json") .send(JSON.stringify(payload)); - expect([STATUS_CODES.SERVER_ERROR, STATUS_CODES.UNKNOWN]).toContain(response.status); + expect([STATUS_CODES.INTERNAL_SERVER_ERROR, STATUS_CODES.INTERNAL_SERVER_ERROR]).toContain(response.status); }); }); }); diff --git a/tests/integration/middlewares/auth.middleware.test.ts b/tests/integration/middlewares/auth.middleware.test.ts index 9ae15d4..01b731c 100644 --- a/tests/integration/middlewares/auth.middleware.test.ts +++ b/tests/integration/middlewares/auth.middleware.test.ts @@ -109,7 +109,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "Invalid or expired token" }) ); @@ -125,7 +125,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "No authorization token sent" }) ); @@ -142,7 +142,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "No authorization token sent" }) ); @@ -162,7 +162,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "Invalid or expired token" }) ); @@ -178,7 +178,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "No authorization token sent" }) ); @@ -198,7 +198,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "Invalid or expired token" }) ); @@ -217,7 +217,7 @@ describe("Authentication Middleware", () => { expect(mockNext).toHaveBeenCalledWith( expect.objectContaining({ code: "AUTHENTICATION_FAILED", - status: STATUS_CODES.UNAUTHENTICATED, + status: STATUS_CODES.UNAUTHORIZED, message: "Firebase ID token has invalid signature" }) ); diff --git a/tests/integration/middlewares/error.middleware.test.ts b/tests/integration/middlewares/error.middleware.test.ts index 23256d4..7bf50c1 100644 --- a/tests/integration/middlewares/error.middleware.test.ts +++ b/tests/integration/middlewares/error.middleware.test.ts @@ -52,11 +52,11 @@ describe("Error Handling Middleware", () => { "CUSTOM_ERROR", { detail: "test" }, "Custom error message", - STATUS_CODES.BAD_PAYLOAD + STATUS_CODES.BAD_REQUEST ); errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_PAYLOAD); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({ code: "CUSTOM_ERROR", message: "Custom error message" @@ -72,19 +72,19 @@ describe("Error Handling Middleware", () => { error = new AuthorizationError("Access denied"); errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.UNAUTHORIZED); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.FORBIDDEN); // Validation error = new ValidationError("Access denied"); errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SERVER_ERROR); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); // AI review error = new AIReviewError("REVIEW_ERROR", null, "Review failed"); errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SERVER_ERROR); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({ code: "REVIEW_ERROR", message: "Review failed" @@ -94,7 +94,7 @@ describe("Error Handling Middleware", () => { error = new GitHubAPIError("Failed to fetch pr"); errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SERVER_ERROR); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({ code: "GITHUB_API_ERROR", message: "Failed to fetch pr" @@ -104,7 +104,7 @@ describe("Error Handling Middleware", () => { error = new GeminiServiceError("Completion failed"); errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SERVER_ERROR); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({ code: "GEMINI_SERVICE_ERROR", message: "Completion failed" @@ -120,7 +120,7 @@ describe("Error Handling Middleware", () => { errorHandler(error as any, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SERVER_ERROR); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); expect(mockResponse.json).toHaveBeenCalledWith({ message: error.message, details: error.errors @@ -132,7 +132,7 @@ describe("Error Handling Middleware", () => { errorHandler(error, mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.UNKNOWN); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.INTERNAL_SERVER_ERROR); expect(mockResponse.json).toHaveBeenCalledWith({ message: "Generic error", details: error diff --git a/tests/integration/middlewares/rate-limit.middleware.test.ts b/tests/integration/middlewares/rate-limit.middleware.test.ts index 610f7dc..8473df3 100644 --- a/tests/integration/middlewares/rate-limit.middleware.test.ts +++ b/tests/integration/middlewares/rate-limit.middleware.test.ts @@ -16,20 +16,20 @@ describe("Rate Limit Middleware", () => { it("should allow requests under the limit", async () => { app.use("/api/test-under", apiLimiter); app.get("/api/test-under", (_req: Request, res: Response) => { - res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); + res.status(STATUS_CODES.OK).json({ message: "success" }); }); for (let i = 0; i < 5; i++) { await request(app) .get("/api/test-under") - .expect(STATUS_CODES.SUCCESS); + .expect(STATUS_CODES.OK); } }); it("should skip rate limiting for webhook endpoints", async () => { app.use(apiLimiter); app.get(`${ENDPOINTS.WEBHOOK.PREFIX}/test-skip`, (_req: Request, res: Response) => { - res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); + res.status(STATUS_CODES.OK).json({ message: "success" }); }); const checks = []; @@ -37,7 +37,7 @@ describe("Rate Limit Middleware", () => { checks.push( request(app) .get(`${ENDPOINTS.WEBHOOK.PREFIX}/test-skip`) - .expect(STATUS_CODES.SUCCESS) + .expect(STATUS_CODES.OK) ); } await Promise.all(checks); @@ -47,7 +47,7 @@ describe("Rate Limit Middleware", () => { // Use a unique path to avoid interference from previous tests if state persists const path = "/api/test-over-limit"; app.use(path, apiLimiter); - app.get(path, (_req: Request, res: Response) => { res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); }); + app.get(path, (_req: Request, res: Response) => { res.status(STATUS_CODES.OK).json({ message: "success" }); }); // Limit is 300. const limit = 310; @@ -61,7 +61,7 @@ describe("Rate Limit Middleware", () => { const responses = await Promise.all(batch); for (const res of responses) { - if (res.status === STATUS_CODES.RATE_LIMIT) { + if (res.status === STATUS_CODES.TOO_MANY_REQUESTS) { blocked = true; expect(res.body.message).toBe("Too many requests from this IP, please try again after 1 minute"); break; @@ -73,7 +73,7 @@ describe("Rate Limit Middleware", () => { // If we haven't been blocked yet, do one more check if (!blocked) { const res = await request(app).get(path); - if (res.status === STATUS_CODES.RATE_LIMIT) blocked = true; + if (res.status === STATUS_CODES.TOO_MANY_REQUESTS) blocked = true; } expect(blocked).toBe(true); @@ -84,7 +84,7 @@ describe("Rate Limit Middleware", () => { it("should enforce webhook specific limits", async () => { const path = "/webhook/test-limit"; app.use(path, webhookLimiter); - app.post(path, (_req: Request, res: Response) => { res.status(STATUS_CODES.SUCCESS).json({ message: "success" }); }); + app.post(path, (_req: Request, res: Response) => { res.status(STATUS_CODES.OK).json({ message: "success" }); }); // Limit is 300. const limit = 310; @@ -98,7 +98,7 @@ describe("Rate Limit Middleware", () => { const responses = await Promise.all(batch); for (const res of responses) { - if (res.status === STATUS_CODES.RATE_LIMIT) { + if (res.status === STATUS_CODES.TOO_MANY_REQUESTS) { blocked = true; expect(res.body.message).toBe("Too many webhook requests from this IP, please try again after 1 minute"); break; @@ -109,7 +109,7 @@ describe("Rate Limit Middleware", () => { if (!blocked) { const res = await request(app).post(path); - if (res.status === STATUS_CODES.RATE_LIMIT) blocked = true; + if (res.status === STATUS_CODES.TOO_MANY_REQUESTS) blocked = true; } expect(blocked).toBe(true); diff --git a/tests/integration/middlewares/request.middleware.test.ts b/tests/integration/middlewares/request.middleware.test.ts index 23b6009..a60165d 100644 --- a/tests/integration/middlewares/request.middleware.test.ts +++ b/tests/integration/middlewares/request.middleware.test.ts @@ -83,7 +83,7 @@ describe("Request Middleware", () => { it("should deny requests from external IP", () => { (mockRequest as any).ip = "192.168.1.1"; localhostOnly(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.UNAUTHORIZED); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.FORBIDDEN); expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({ message: "Access denied. Local interface only." })); @@ -93,7 +93,7 @@ describe("Request Middleware", () => { it("should deny requests with missing IP", () => { (mockRequest as any).ip = undefined; localhostOnly(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.UNAUTHORIZED); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.FORBIDDEN); expect(mockNext).not.toHaveBeenCalled(); }); }); @@ -106,7 +106,7 @@ describe("Request Middleware", () => { localhostOnly(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.UNAUTHORIZED); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.FORBIDDEN); }); }); }); diff --git a/tests/integration/middlewares/webhook.middleware.test.ts b/tests/integration/middlewares/webhook.middleware.test.ts index 7db1298..beb7326 100644 --- a/tests/integration/middlewares/webhook.middleware.test.ts +++ b/tests/integration/middlewares/webhook.middleware.test.ts @@ -315,7 +315,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Installation action not processed", @@ -339,7 +339,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_PAYLOAD); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Missing required installation data", @@ -389,7 +389,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "installation_repositories action not processed", @@ -410,7 +410,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_PAYLOAD); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Missing required installation data", @@ -456,7 +456,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Skipping draft PR" @@ -588,7 +588,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Issue comment action not processed", @@ -609,7 +609,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_PAYLOAD); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Missing required webhook data", @@ -663,7 +663,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Push not targeting default branch - skipping", @@ -684,7 +684,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Tag push not processed" @@ -704,7 +704,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith( expect.objectContaining({ message: "Push creation/deletion event not processed" @@ -724,7 +724,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_PAYLOAD); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); }); }); @@ -738,7 +738,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith({ data: {}, message: "Event type not processed", @@ -758,7 +758,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.SUCCESS); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.OK); expect(mockResponse.json).toHaveBeenCalledWith({ data: {}, message: "PR action not processed", @@ -784,7 +784,7 @@ describe("Webhook Middleware", () => { await validateGitHubWebhookEvent(mockRequest as Request, mockResponse as Response, mockNext); - expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_PAYLOAD); + expect(mockResponse.status).toHaveBeenCalledWith(STATUS_CODES.BAD_REQUEST); expect(mockNext).not.toHaveBeenCalled(); }); }); From 6f23b187a5b9c4c1fe753d1e4c4b4ceae3416bf3 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Tue, 28 Apr 2026 18:16:11 +0100 Subject: [PATCH 06/12] refactor: optimize env variables fetching --- .env.example | 1 + api/config/firebase.config.ts | 7 +- api/config/logger.config.ts | 5 +- api/config/stellar.config.ts | 5 +- .../installation/index.controller.ts | 5 +- api/controllers/user/index.controller.ts | 5 +- api/controllers/user/sumsub.controller.ts | 9 +- api/controllers/wallet/index.controller.ts | 3 +- api/index.ts | 11 +- api/middlewares/auth.middleware.ts | 9 +- api/middlewares/error.middleware.ts | 3 +- api/middlewares/webhook.middleware.ts | 5 +- api/models/error.model.ts | 3 +- api/routes/_test_/general.test.route.ts | 3 +- api/routes/agent.route.ts | 17 +- api/services/cloud-tasks.service.ts | 53 ++- api/services/contract.service.ts | 40 +-- api/services/error-handler.service.ts | 73 ++-- api/services/kms.service.ts | 11 +- api/services/octokit.service.ts | 11 +- api/services/socket.service.ts | 4 +- api/services/statsig.service.ts | 5 +- api/services/stellar.service.ts | 5 +- api/utils/data.ts | 14 - api/utils/env.ts | 334 ++++++++++++++++++ 25 files changed, 491 insertions(+), 150 deletions(-) create mode 100644 api/utils/env.ts diff --git a/.env.example b/.env.example index 7e9ba96..25449ad 100644 --- a/.env.example +++ b/.env.example @@ -60,4 +60,5 @@ STATSIG_API_KEY= # Other environment variables NODE_ENV=development PORT=8080 +CORS_ORIGINS="http://localhost:3000,http://localhost:4000,http://localhost:3001" CONTRIBUTOR_APP_URL="http://localhost:4000" \ No newline at end of file diff --git a/api/config/firebase.config.ts b/api/config/firebase.config.ts index 8ff9f0d..9305779 100644 --- a/api/config/firebase.config.ts +++ b/api/config/firebase.config.ts @@ -1,9 +1,10 @@ import admin, { ServiceAccount } from "firebase-admin"; +import { Env } from "../utils/env.js"; const serviceAccount: ServiceAccount = { - projectId: process.env.FIREBASE_PROJECT_ID, - clientEmail: process.env.FIREBASE_CLIENT_EMAIL, - privateKey: process.env.FIREBASE_PRIVATE_KEY?.toString().replace(/\\n/g, "\n") + projectId: Env.firebaseProjectId(), + clientEmail: Env.firebaseClientEmail(), + privateKey: Env.firebasePrivateKey()?.toString().replace(/\\n/g, "\n") }; admin.initializeApp({ diff --git a/api/config/logger.config.ts b/api/config/logger.config.ts index 816e0a8..4d8985c 100644 --- a/api/config/logger.config.ts +++ b/api/config/logger.config.ts @@ -1,7 +1,8 @@ import winston from "winston"; +import { Env } from "../utils/env.js"; -const LOG_LEVEL = process.env.LOG_LEVEL || "info"; -const NODE_ENV = process.env.NODE_ENV || "development"; +const LOG_LEVEL = "info"; +const NODE_ENV = Env.nodeEnv() || "development"; // Define log levels and colors const logLevels = { diff --git a/api/config/stellar.config.ts b/api/config/stellar.config.ts index 5455e66..b6472a2 100644 --- a/api/config/stellar.config.ts +++ b/api/config/stellar.config.ts @@ -1,6 +1,7 @@ import { Horizon, Asset, Networks } from "@stellar/stellar-sdk"; +import { Env } from "../utils/env.js"; -export const isMainnet = process.env.STELLAR_NETWORK === "public"; +export const isMainnet = Env.stellarNetwork() === "public"; export const horizonUrl = isMainnet ? "https://horizon.stellar.org" @@ -19,5 +20,5 @@ export const anchorHomeDomain = isMainnet export const xlmAsset = Asset.native(); export const usdcAsset = new Asset( "USDC", - process.env.USDC_ASSET_ID! + Env.usdcAssetId(true) ); diff --git a/api/controllers/installation/index.controller.ts b/api/controllers/installation/index.controller.ts index 34858d2..e442d1f 100644 --- a/api/controllers/installation/index.controller.ts +++ b/api/controllers/installation/index.controller.ts @@ -10,6 +10,7 @@ import { dataLogger } from "../../config/logger.config.js"; import { KMSService } from "../../services/kms.service.js"; import { InstallationStatus, Task } from "../../../prisma_client/index.js"; import { TaskIssue } from "../../models/task.model.js"; +import { Env } from "../../utils/env.js"; /** * Create a new installation. @@ -159,7 +160,7 @@ export const createInstallation = async (req: Request, res: Response, next: Next connect: { userId } }, subscriptionPackage: { - connect: { id: process.env.DEFAULT_SUBSCRIPTION_PACKAGE_ID! } + connect: { id: Env.defaultSubscriptionPackageId(true) } } }, select @@ -169,7 +170,7 @@ export const createInstallation = async (req: Request, res: Response, next: Next try { // Add USDC trustline only if it's a new wallet if (isNewWallet) { - const masterAccountSecret = process.env.STELLAR_MASTER_SECRET_KEY!; + const masterAccountSecret = Env.stellarMasterSecretKey(true); await stellarService.addTrustLineViaSponsor( masterAccountSecret, diff --git a/api/controllers/user/index.controller.ts b/api/controllers/user/index.controller.ts index bc6b5c2..0ac7c74 100644 --- a/api/controllers/user/index.controller.ts +++ b/api/controllers/user/index.controller.ts @@ -10,6 +10,7 @@ import { Prisma } from "../../../prisma_client/index.js"; import { KMSService } from "../../services/kms.service.js"; import { OctokitService } from "../../services/octokit.service.js"; import { statsigService } from "../../services/statsig.service.js"; +import { Env } from "../../utils/env.js"; // User's address book export type AddressBook = { @@ -124,7 +125,7 @@ export const createUser = async (req: Request, res: Response, next: NextFunction try { // Add USDC trustline to wallet await stellarService.addTrustLineViaSponsor( - process.env.STELLAR_MASTER_SECRET_KEY!, + Env.stellarMasterSecretKey(true), userWallet.secretKey ); @@ -337,7 +338,7 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = try { // Add USDC trustline to wallet await stellarService.addTrustLineViaSponsor( - process.env.STELLAR_MASTER_SECRET_KEY!, + Env.stellarMasterSecretKey(true), userWallet.secretKey ); walletStatus.usdcTrustline = true; diff --git a/api/controllers/user/sumsub.controller.ts b/api/controllers/user/sumsub.controller.ts index 22dd308..03e8e02 100644 --- a/api/controllers/user/sumsub.controller.ts +++ b/api/controllers/user/sumsub.controller.ts @@ -5,6 +5,7 @@ import { STATUS_CODES } from "../../utils/data.js"; import { responseWrapper } from "../../utils/helper.js"; import { ErrorClass } from "../../models/error.model.js"; import { statsigService } from "../../services/statsig.service.js"; +import { Env } from "../../utils/env.js"; /** * Generate Sumsub SDK access token @@ -23,10 +24,10 @@ export const generateSumsubSdkToken = async (req: Request, res: Response, next: }); } - const SUMSUB_APP_TOKEN = process.env.SUMSUB_APP_TOKEN!; - const SUMSUB_SECRET_KEY = process.env.SUMSUB_SECRET_KEY!; - const SUMSUB_LEVEL_NAME = process.env.SUMSUB_LEVEL_NAME!; - const SUMSUB_BASE_URL = process.env.SUMSUB_BASE_URL || "https://api.sumsub.com"; + const SUMSUB_APP_TOKEN = Env.sumsubAppToken(true); + const SUMSUB_SECRET_KEY = Env.sumsubSecretKey(true); + const SUMSUB_LEVEL_NAME = Env.sumsubLevelName(true); + const SUMSUB_BASE_URL = Env.sumsubBaseUrl() || "https://api.sumsub.com"; // Generate the request URL, timestamp and request body const url = "/resources/accessTokens/sdk"; diff --git a/api/controllers/wallet/index.controller.ts b/api/controllers/wallet/index.controller.ts index 10a483c..bd34583 100644 --- a/api/controllers/wallet/index.controller.ts +++ b/api/controllers/wallet/index.controller.ts @@ -9,6 +9,7 @@ import { stellarService } from "../../services/stellar.service.js"; import { NotFoundError, ValidationError } from "../../models/error.model.js"; import { KMSService } from "../../services/kms.service.js"; import { statsigService } from "../../services/statsig.service.js"; +import { Env } from "../../utils/env.js"; type USDCBalance = HorizonApi.BalanceLineAsset<"credit_alphanum12">; @@ -142,7 +143,7 @@ export const withdrawAsset = async (req: Request, res: Response, next: NextFunct )); } else { // User wallet withdrawals — master account sponsors the transaction fee - const masterSecret = process.env.STELLAR_MASTER_SECRET_KEY!; + const masterSecret = Env.stellarMasterSecretKey(true); ({ txHash } = await stellarService.transferAssetViaSponsor( masterSecret, walletSecret, diff --git a/api/index.ts b/api/index.ts index ce36057..e93c122 100644 --- a/api/index.ts +++ b/api/index.ts @@ -27,10 +27,11 @@ import { } from "./routes/index.js"; import { ErrorHandlerService } from "./services/error-handler.service.js"; import { dataLogger, messageLogger } from "./config/logger.config.js"; -import { ALLOWED_ORIGINS, ENDPOINTS, STATUS_CODES } from "./utils/data.js"; +import { ENDPOINTS, STATUS_CODES } from "./utils/data.js"; import { ErrorClass } from "./models/error.model.js"; import { statsigService } from "./services/statsig.service.js"; import { SocketService } from "./services/socket.service.js"; +import { Env } from "./utils/env.js"; // Create HTTP server const app = express(); @@ -40,9 +41,9 @@ const httpServer = createServer(app); SocketService.initialize(httpServer); // Define port -const PORT = process.env.NODE_ENV === "development" +const PORT = Env.nodeEnv() === "development" ? 5000 - : (Number(process.env.PORT) || 8080); + : (Env.port() || 8080); // Security middleware app.use(helmet()); @@ -50,7 +51,7 @@ app.use( cors({ origin(origin, callback) { // Allowed origins - if (!origin || ALLOWED_ORIGINS.includes(origin)) { + if (!origin || Env.corsOrigins(true).includes(origin)) { return callback(null, true); } callback(new ErrorClass( @@ -138,7 +139,7 @@ app.use( * Internal/Test Routes * Only mounted in development or local testing environments */ -if (process.env.NODE_ENV !== "production") { +if (Env.nodeEnv() !== "production") { messageLogger.warn("⚠️ Mounting internal test routes. Ensure this is not production."); const internalMiddlware = [dynamicRoute, localhostOnly]; diff --git a/api/middlewares/auth.middleware.ts b/api/middlewares/auth.middleware.ts index 46d6299..e382c28 100644 --- a/api/middlewares/auth.middleware.ts +++ b/api/middlewares/auth.middleware.ts @@ -6,6 +6,7 @@ import { getFieldFromUnknownObject } from "../utils/helper.js"; import { Request, Response, NextFunction } from "express"; import { AuthorizationError, ErrorClass, ValidationError } from "../models/error.model.js"; import { dataLogger } from "../config/logger.config.js"; +import { Env } from "../utils/env.js"; // Google OAuth2 client used to verify OIDC tokens. const authClient = new OAuth2Client(); @@ -92,13 +93,13 @@ export const validateUserInstallation = async (req: Request, res: Response, next */ export const validateCloudTasksRequest = async (req: Request, _res: Response, next: NextFunction) => { // Skip OIDC validation in development/test to allow local testing - if (process.env.NODE_ENV !== "production") { + if (Env.nodeEnv() !== "production") { return next(); } // The service account email that Cloud Tasks uses to sign OIDC tokens. // This must match the `oidcToken.serviceAccountEmail` configured in the Cloud Tasks service. - const CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL = process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL; + const CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL = Env.cloudTasksServiceAccountEmail(); try { // Extract the Bearer token from the Authorization header @@ -109,7 +110,7 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne const token = authHeader.split("Bearer ")[1]; - if (!process.env.CLOUD_RUN_SERVICE_URL) { + if (!Env.cloudRunServiceUrl()) { throw new ErrorClass( "SERVER_MISCONFIGURATION", null, @@ -121,7 +122,7 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne // Verify the OIDC token const ticket = await authClient.verifyIdToken({ idToken: token, - audience: process.env.CLOUD_RUN_SERVICE_URL + audience: Env.cloudRunServiceUrl(true) }); const payload = ticket.getPayload(); diff --git a/api/middlewares/error.middleware.ts b/api/middlewares/error.middleware.ts index 6e09c19..466f35e 100644 --- a/api/middlewares/error.middleware.ts +++ b/api/middlewares/error.middleware.ts @@ -4,6 +4,7 @@ import { STATUS_CODES } from "../utils/data.js"; import { getFieldFromUnknownObject } from "../utils/helper.js"; import { dataLogger } from "../config/logger.config.js"; import { Prisma } from "../../prisma_client/index.js"; +import { Env } from "../utils/env.js"; /** * Centralized error handling middleware @@ -22,7 +23,7 @@ export const errorHandler = ((error: unknown, req: Request, res: Response, _next ); const errorName = getFieldFromUnknownObject(error, "name"); - const returnError = process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test"; + const returnError = Env.nodeEnv() === "development" || Env.nodeEnv() === "test"; // Handle custom errors if (errorName === "ErrorClass") { diff --git a/api/middlewares/webhook.middleware.ts b/api/middlewares/webhook.middleware.ts index e0b5a0c..dae5518 100644 --- a/api/middlewares/webhook.middleware.ts +++ b/api/middlewares/webhook.middleware.ts @@ -5,6 +5,7 @@ import { OctokitService } from "../services/octokit.service.js"; import { STATUS_CODES } from "../utils/data.js"; import { dataLogger } from "../config/logger.config.js"; import { responseWrapper } from "../utils/helper.js"; +import { Env } from "../utils/env.js"; /** * Middleware to validate GitHub webhook signatures @@ -13,7 +14,7 @@ export const validateGitHubWebhook = (req: Request, res: Response, next: NextFun try { // Get and validate signature and secret const signature = req.get("X-Hub-Signature-256"); - const secret = process.env.GITHUB_WEBHOOK_SECRET; + const secret = Env.githubWebhookSecret(); if (!secret) { throw new GitHubWebhookError("GitHub webhook secret not configured"); @@ -344,7 +345,7 @@ export const validateSumsubWebhook = (req: Request, res: Response, next: NextFun try { // Get signature and secret const signature = req.get("x-payload-digest"); - const secret = process.env.SUMSUB_WEBHOOK_SECRET; + const secret = Env.sumsubWebhookSecret(); if (!secret) { throw new SumsubWebhookError("Sumsub webhook secret not configured"); diff --git a/api/models/error.model.ts b/api/models/error.model.ts index b9e18bf..1e81167 100644 --- a/api/models/error.model.ts +++ b/api/models/error.model.ts @@ -1,4 +1,5 @@ import { STATUS_CODES } from "../utils/data.js"; +import { Env } from "../utils/env.js"; /** * Base error class for general api errors @@ -400,7 +401,7 @@ export class ErrorUtils { * Sanitizes error for client response (removes sensitive data) */ static sanitizeError(error: ErrorClass) { - return (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") + return Env.nodeEnv() !== "production" ? { ...error } : { message: error.message, diff --git a/api/routes/_test_/general.test.route.ts b/api/routes/_test_/general.test.route.ts index 9281f56..c54d32b 100644 --- a/api/routes/_test_/general.test.route.ts +++ b/api/routes/_test_/general.test.route.ts @@ -6,6 +6,7 @@ import { encryptionSchema, decryptionSchema } from "./test.schema.js"; +import { Env } from "../../utils/env.js"; import { KMSService } from "../../services/kms.service.js"; import { prisma } from "../../config/database.config.js"; import { STATUS_CODES } from "../../utils/data.js"; @@ -97,7 +98,7 @@ router.post("/create-packages", async (_, res: Response, next: NextFunction) => const packages = await prisma.subscriptionPackage.createMany({ data: [ { - id: process.env.DEFAULT_SUBSCRIPTION_PACKAGE_ID || "cml9shfp300001jfka71z28ay", + id: Env.defaultSubscriptionPackageId() || "cml9shfp300001jfka71z28ay", name: "Free", description: "Basic plan for personal use", maxTasks: 5, diff --git a/api/routes/agent.route.ts b/api/routes/agent.route.ts index 6d840e6..7add99c 100644 --- a/api/routes/agent.route.ts +++ b/api/routes/agent.route.ts @@ -6,21 +6,24 @@ import { ExactStellarScheme } from "@x402/stellar/exact/server"; import { ENDPOINTS, STATUS_CODES } from "../utils/data.js"; import { responseWrapper } from "../utils/helper.js"; import { ValidationError } from "../models/error.model.js"; +import { Env } from "../utils/env.js"; -// const network = `stellar:${process.env.STELLAR_NETWORK === "testnet" ? "testnet" : "pubnet"}` as `${string}:${string}`; +// const network = `stellar:${Env.stellarNetwork() === "testnet" ? "testnet" : "pubnet"}` as `${string}:${string}`; const network = "stellar:testnet" as `${string}:${string}`; -const facilitatorUrl = process.env.X402_FACILITATOR_URL; -const payTo = process.env.X402_PAYEE_ADDRESS; -const facilitatorApiKey = process.env.X402_API_KEY; +const facilitatorUrl = Env.x402FacilitatorUrl(); +const x402Config = { + payeeAddress: Env.x402PayeeAddress() || "0", + facilitatorUrl: Env.x402FacilitatorUrl() || "" +}; export const agentRoutes = Router(); -if (facilitatorUrl && payTo && facilitatorApiKey) { +if (facilitatorUrl && x402Config.payeeAddress && Env.x402ApiKey()) { // Initialize x402 facilitator client const facilitatorClient = new HTTPFacilitatorClient({ url: facilitatorUrl, createAuthHeaders: async () => { - const headers = { Authorization: `Bearer ${facilitatorApiKey}` }; + const headers = { Authorization: `Bearer ${Env.x402ApiKey()}` }; return { verify: headers, settle: headers, supported: headers }; } }); @@ -55,7 +58,7 @@ if (facilitatorUrl && payTo && facilitatorApiKey) { scheme: "exact", price: "$0.50", network, - payTo + payTo: x402Config.payeeAddress }, description: "Pull request review", mimeType: "application/json" diff --git a/api/services/cloud-tasks.service.ts b/api/services/cloud-tasks.service.ts index 9d09a3b..fd2c127 100644 --- a/api/services/cloud-tasks.service.ts +++ b/api/services/cloud-tasks.service.ts @@ -1,4 +1,5 @@ import { CloudTasksClient } from "@google-cloud/tasks"; +import { Env } from "../utils/env.js"; import { GitHubWebhookPayload, LinkedIssue } from "../models/ai-review.model.js"; import { dataLogger } from "../config/logger.config.js"; import { CloudTasksError } from "../models/error.model.js"; @@ -73,19 +74,19 @@ export class CloudTasksService { // Service configuration mapping routing queues and target endpoints private readonly config = { - project: process.env.GCP_PROJECT_ID!, - location: process.env.GCP_LOCATION_ID!, - cloudRunServiceUrl: process.env.CLOUD_RUN_SERVICE_URL!, - cloudRunPrivateServiceUrl: process.env.CLOUD_RUN_PRIVATE_SERVICE_URL!, - cloudTasksServiceAccountEmail: process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL!, + project: Env.gcpProjectId(true), + location: Env.gcpLocationId(true), + cloudRunServiceUrl: Env.cloudRunServiceUrl(true), + cloudRunPrivateServiceUrl: Env.cloudRunPrivateServiceUrl(true), + cloudTasksServiceAccountEmail: Env.cloudTasksServiceAccountEmail(true), queues: { - "pr-analysis": process.env.CLOUD_TASKS_PR_ANALYSIS_QUEUE || "", - "manual-pr-analysis": process.env.CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE || "", - "repository-indexing": process.env.CLOUD_TASKS_REPO_INDEXING_QUEUE || "", - "repository-incremental-indexing": process.env.CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE || "", - "bounty-payout": process.env.CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE || "", - "clear-installation": process.env.CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE || "", - "clear-repo": process.env.CLOUD_TASKS_CLEAR_REPO_QUEUE || "" + "pr-analysis": Env.cloudTasksPrAnalysisQueue() || "", + "manual-pr-analysis": Env.cloudTasksManualPrAnalysisQueue() || "", + "repository-indexing": Env.cloudTasksRepoIndexingQueue() || "", + "repository-incremental-indexing": Env.cloudTasksIncrementalIndexingQueue() || "", + "bounty-payout": Env.cloudTasksBountyPayoutQueue() || "", + "clear-installation": Env.cloudTasksClearInstallationQueue() || "", + "clear-repo": Env.cloudTasksClearRepoQueue() || "" }, endpoints: { "pr-analysis": ENDPOINTS.INTERNAL.PREFIX + ENDPOINTS.INTERNAL.PR_ANALYSIS, @@ -104,21 +105,19 @@ export class CloudTasksService { } constructor() { - const requiredVars = [ - "GCP_PROJECT_ID", - "GCP_LOCATION_ID", - "CLOUD_RUN_SERVICE_URL", - "CLOUD_RUN_PRIVATE_SERVICE_URL", - "CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL", - "CLOUD_TASKS_PR_ANALYSIS_QUEUE", - "CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE", - "CLOUD_TASKS_REPO_INDEXING_QUEUE", - "CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE", - "CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE", - "CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE", - "CLOUD_TASKS_CLEAR_REPO_QUEUE" - ]; - const missing = requiredVars.filter(v => !process.env[v]); + const missing: string[] = []; + if (!Env.gcpProjectId()) missing.push("GCP_PROJECT_ID"); + if (!Env.gcpLocationId()) missing.push("GCP_LOCATION_ID"); + if (!Env.cloudRunServiceUrl()) missing.push("CLOUD_RUN_SERVICE_URL"); + if (!Env.cloudRunPrivateServiceUrl()) missing.push("CLOUD_RUN_PRIVATE_SERVICE_URL"); + if (!Env.cloudTasksServiceAccountEmail()) missing.push("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); + if (!Env.cloudTasksPrAnalysisQueue()) missing.push("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); + if (!Env.cloudTasksManualPrAnalysisQueue()) missing.push("CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE"); + if (!Env.cloudTasksRepoIndexingQueue()) missing.push("CLOUD_TASKS_REPO_INDEXING_QUEUE"); + if (!Env.cloudTasksIncrementalIndexingQueue()) missing.push("CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE"); + if (!Env.cloudTasksBountyPayoutQueue()) missing.push("CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE"); + if (!Env.cloudTasksClearInstallationQueue()) missing.push("CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE"); + if (!Env.cloudTasksClearRepoQueue()) missing.push("CLOUD_TASKS_CLEAR_REPO_QUEUE"); if (missing.length > 0) { dataLogger.error(`Missing required environment variables for CloudTasksService: ${missing.join(", ")}`); } diff --git a/api/services/contract.service.ts b/api/services/contract.service.ts index a2a6540..cf37b24 100644 --- a/api/services/contract.service.ts +++ b/api/services/contract.service.ts @@ -1,14 +1,15 @@ import { - Keypair, + Address, Contract, + Keypair, + nativeToScVal, + scValToNative, rpc as SorobanRpc, TransactionBuilder, Networks, - xdr, - Address, - nativeToScVal, - scValToNative + xdr } from "@stellar/stellar-sdk"; +import { Env } from "../utils/env.js"; import { EscrowContractError } from "../models/error.model.js"; /** @@ -16,14 +17,13 @@ import { EscrowContractError } from "../models/error.model.js"; */ export class ContractService { static { - const requiredVars = [ - "STELLAR_NETWORK", - "STELLAR_RPC_URL", - "TASK_ESCROW_CONTRACT_ID", - "USDC_CONTRACT_ID", - "STELLAR_MASTER_PUBLIC_KEY" - ]; - const missing = requiredVars.filter(v => !process.env[v]); + // Verify required environment variables are present + const missing: string[] = []; + if (!Env.stellarNetwork()) missing.push("STELLAR_NETWORK"); + if (!Env.stellarRpcUrl()) missing.push("STELLAR_RPC_URL"); + if (!Env.taskEscrowContractId()) missing.push("TASK_ESCROW_CONTRACT_ID"); + if (!Env.usdcContractId()) missing.push("USDC_CONTRACT_ID"); + if (!Env.stellarMasterPublicKey()) missing.push("STELLAR_MASTER_PUBLIC_KEY"); if (missing.length > 0) { throw new EscrowContractError(`Missing required environment variables for ContractService: ${missing.join(", ")}`); } @@ -31,15 +31,15 @@ export class ContractService { // Soroban network configuration loaded from environment variables private static CONFIG = { - network: process.env.STELLAR_NETWORK!, - rpcUrl: process.env.STELLAR_RPC_URL!, - networkPassphrase: process.env.STELLAR_NETWORK === "public" + network: Env.stellarNetwork(true), + rpcUrl: Env.stellarRpcUrl(true), + networkPassphrase: Env.stellarNetwork() === "public" ? Networks.PUBLIC : Networks.TESTNET, - contractId: process.env.TASK_ESCROW_CONTRACT_ID!, - usdcContractId: process.env.USDC_CONTRACT_ID!, - masterPublicKey: process.env.STELLAR_MASTER_PUBLIC_KEY!, - maxFee: process.env.MAX_FEE || "1000000" + contractId: Env.taskEscrowContractId(true), + usdcContractId: Env.usdcContractId(true), + masterPublicKey: Env.stellarMasterPublicKey(true), + maxFee: Env.maxFee() || "1000000" }; // Soroban RPC server instance for network communication diff --git a/api/services/error-handler.service.ts b/api/services/error-handler.service.ts index 54171c0..e49ae50 100644 --- a/api/services/error-handler.service.ts +++ b/api/services/error-handler.service.ts @@ -1,4 +1,5 @@ import { dataLogger, messageLogger } from "../config/logger.config.js"; +import { Env } from "../utils/env.js"; /** * Sets up and configures all error handling components for the AI Review System @@ -129,49 +130,49 @@ export class ErrorHandlerService { const errors: string[] = []; const requiredVars = [ - { keys: ["DATABASE_URL"], msg: "DATABASE_URL not configured - database operations will fail" }, - { keys: ["GITHUB_APP_ID", "GITHUB_APP_PRIVATE_KEY"], msg: "GitHub app credentials not configured - GitHub integration will fail" }, - { keys: ["STELLAR_NETWORK"], msg: "STELLAR_NETWORK not configured - Stellar operations will fail" }, - { keys: ["STELLAR_HORIZON_URL"], msg: "STELLAR_HORIZON_URL not configured - Stellar Horizon API unavailable" }, - { keys: ["STELLAR_RPC_URL"], msg: "STELLAR_RPC_URL not configured - Soroban RPC unavailable" }, - { keys: ["STELLAR_MASTER_PUBLIC_KEY", "STELLAR_MASTER_SECRET_KEY"], msg: "Stellar master keypair not configured - Stellar transactions will fail" }, - { keys: ["TASK_ESCROW_CONTRACT_ID"], msg: "TASK_ESCROW_CONTRACT_ID not configured - escrow operations will fail" }, - { keys: ["FIREBASE_PROJECT_ID", "FIREBASE_CLIENT_EMAIL", "FIREBASE_PRIVATE_KEY"], msg: "Firebase credentials not configured - Firebase integration will fail" }, - { keys: ["GCP_PROJECT_ID", "GCP_LOCATION_ID", "GCP_KEY_RING_ID", "GCP_KEY_ID"], msg: "GCP credentials not configured - wallet encryption will fail" }, - { keys: ["SUMSUB_APP_TOKEN", "SUMSUB_SECRET_KEY", "SUMSUB_LEVEL_NAME"], msg: "Sumsub misconfiguration" }, - { keys: ["CLOUD_RUN_SERVICE_URL", "CLOUD_RUN_PRIVATE_SERVICE_URL", "CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"], msg: "Cloud Tasks credentials not configured - background job dispatch will fail" }, + { values: [Env.databaseUrl()], msg: "DATABASE_URL not configured - database operations will fail" }, + { values: [Env.githubAppId(), Env.githubAppPrivateKey()], msg: "GitHub app credentials not configured - GitHub integration will fail" }, + { values: [Env.stellarNetwork()], msg: "STELLAR_NETWORK not configured - Stellar operations will fail" }, + { values: [Env.stellarHorizonUrl()], msg: "STELLAR_HORIZON_URL not configured - Stellar Horizon API unavailable" }, + { values: [Env.stellarRpcUrl()], msg: "STELLAR_RPC_URL not configured - Soroban RPC unavailable" }, + { values: [Env.stellarMasterPublicKey(), Env.stellarMasterSecretKey()], msg: "Stellar master keypair not configured - Stellar transactions will fail" }, + { values: [Env.taskEscrowContractId()], msg: "TASK_ESCROW_CONTRACT_ID not configured - escrow operations will fail" }, + { values: [Env.firebaseProjectId(), Env.firebaseClientEmail(), Env.firebasePrivateKey()], msg: "Firebase credentials not configured - Firebase integration will fail" }, + { values: [Env.gcpProjectId(), Env.gcpLocationId(), Env.gcpKeyRingId(), Env.gcpKeyId()], msg: "GCP credentials not configured - wallet encryption will fail" }, + { values: [Env.sumsubAppToken(), Env.sumsubSecretKey(), Env.sumsubLevelName()], msg: "Sumsub misconfiguration" }, + { values: [Env.cloudRunServiceUrl(), Env.cloudRunPrivateServiceUrl(), Env.cloudTasksServiceAccountEmail()], msg: "Cloud Tasks credentials not configured - background job dispatch will fail" }, { - keys: [ - "CLOUD_TASKS_PR_ANALYSIS_QUEUE", - "CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE", - "CLOUD_TASKS_REPO_INDEXING_QUEUE", - "CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE", - "CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE", - "CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE", - "CLOUD_TASKS_CLEAR_REPO_QUEUE" + values: [ + Env.cloudTasksPrAnalysisQueue(), + Env.cloudTasksManualPrAnalysisQueue(), + Env.cloudTasksRepoIndexingQueue(), + Env.cloudTasksIncrementalIndexingQueue(), + Env.cloudTasksBountyPayoutQueue(), + Env.cloudTasksClearInstallationQueue(), + Env.cloudTasksClearRepoQueue() ], msg: "Cloud Tasks queue names not configured - job routing will fail" }, - { keys: ["X402_FACILITATOR_URL", "X402_PAYEE_ADDRESS", "X402_API_KEY"], msg: "x402 misconfiguration" } + { values: [Env.x402FacilitatorUrl(), Env.x402PayeeAddress(), Env.x402ApiKey()], msg: "x402 misconfiguration" } ]; const warningVars = [ - { keys: ["GITHUB_WEBHOOK_SECRET"], msg: "GITHUB_WEBHOOK_SECRET not configured - pull request review disabled" }, - { keys: ["NODE_ENV"], msg: "NODE_ENV not configured - defaulting to development mode" }, - { keys: ["PORT"], msg: "PORT not configured - defaulting to 8080" }, - { keys: ["CONTRIBUTOR_APP_URL"], msg: "CONTRIBUTOR_APP_URL not configured - contributor redirects may fail" }, - { keys: ["DEFAULT_SUBSCRIPTION_PACKAGE_ID"], msg: "DEFAULT_SUBSCRIPTION_PACKAGE_ID not configured - subscription defaults unavailable" } + { values: [Env.githubWebhookSecret()], msg: "GITHUB_WEBHOOK_SECRET not configured - pull request review disabled" }, + { values: [Env.nodeEnv()], msg: "NODE_ENV not configured - defaulting to development mode" }, + { values: [Env.port()], msg: "PORT not configured - defaulting to 8080" }, + { values: [Env.contributorAppUrl()], msg: "CONTRIBUTOR_APP_URL not configured - contributor redirects may fail" }, + { values: [Env.defaultSubscriptionPackageId()], msg: "DEFAULT_SUBSCRIPTION_PACKAGE_ID not configured - subscription defaults unavailable" } ]; - requiredVars.forEach(({ keys, msg }) => { - if (keys.some(key => !process.env[key])) errors.push(msg); + requiredVars.forEach(({ values, msg }) => { + if (values.some(val => !val)) errors.push(msg); }); - warningVars.forEach(({ keys, msg }) => { - if (keys.some(key => !process.env[key])) warnings.push(msg); + warningVars.forEach(({ values, msg }) => { + if (values.some(val => !val)) warnings.push(msg); }); - if (process.env.NODE_ENV === "production" && !process.env.STATSIG_API_KEY) { + if (Env.nodeEnv() === "production" && !Env.statsigApiKey()) { warnings.push("STATSIG_API_KEY not configured - Statsig integration will fail"); } @@ -184,12 +185,12 @@ export class ErrorHandlerService { { warnings: warnings.length, errors: errors.length, - hasStellarConfig: !!(process.env.STELLAR_NETWORK && process.env.STELLAR_HORIZON_URL), - hasContractConfig: !!(process.env.TASK_ESCROW_CONTRACT_ID && process.env.USDC_CONTRACT_ID), - hasFirebase: !!(process.env.FIREBASE_PROJECT_ID && process.env.FIREBASE_CLIENT_EMAIL), - hasGCP: !!(process.env.GCP_PROJECT_ID && process.env.GCP_KEY_RING_ID), - hasCloudTasks: !!(process.env.CLOUD_RUN_SERVICE_URL && process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL && process.env.CLOUD_TASKS_PR_ANALYSIS_QUEUE), - hasStatsig: !!(process.env.NODE_ENV === "production" && process.env.STATSIG_API_KEY) + hasStellarConfig: !!(Env.stellarNetwork() && Env.stellarHorizonUrl()), + hasContractConfig: !!(Env.taskEscrowContractId() && Env.usdcContractId()), + hasFirebase: !!(Env.firebaseProjectId() && Env.firebaseClientEmail()), + hasGCP: !!(Env.gcpProjectId() && Env.gcpKeyRingId()), + hasCloudTasks: !!(Env.cloudRunServiceUrl() && Env.cloudTasksServiceAccountEmail() && Env.cloudTasksPrAnalysisQueue()), + hasStatsig: !!(Env.nodeEnv() === "production" && Env.statsigApiKey()) } ); } diff --git a/api/services/kms.service.ts b/api/services/kms.service.ts index 76d1ad7..1d664fb 100644 --- a/api/services/kms.service.ts +++ b/api/services/kms.service.ts @@ -2,17 +2,18 @@ import { KeyManagementServiceClient } from "@google-cloud/kms"; import crypto from "crypto"; import { Wallet } from "../../prisma_client/index.js"; import { KmsServiceError } from "../models/error.model.js"; +import { Env } from "../utils/env.js"; // Verify required environment variables are present -if (!process.env.GCP_PROJECT_ID || !process.env.GCP_LOCATION_ID || !process.env.GCP_KEY_RING_ID || !process.env.GCP_KEY_ID) { +if (!Env.gcpProjectId() || !Env.gcpLocationId() || !Env.gcpKeyRingId() || !Env.gcpKeyId()) { throw new KmsServiceError("Missing GCP KMS credentials (GCP_PROJECT_ID, GCP_LOCATION_ID, GCP_KEY_RING_ID, GCP_KEY_ID) in environment variables"); } // Set Google Cloud KMS environment variables -const PROJECT_ID = process.env.GCP_PROJECT_ID; -const LOCATION_ID = process.env.GCP_LOCATION_ID; -const KEY_RING_ID = process.env.GCP_KEY_RING_ID; -const KEY_ID = process.env.GCP_KEY_ID; +const PROJECT_ID = Env.gcpProjectId(true); +const LOCATION_ID = Env.gcpLocationId(true); +const KEY_RING_ID = Env.gcpKeyRingId(true); +const KEY_ID = Env.gcpKeyId(true); const client = new KeyManagementServiceClient(); const keyName = client.cryptoKeyPath(PROJECT_ID, LOCATION_ID, KEY_RING_ID, KEY_ID); diff --git a/api/services/octokit.service.ts b/api/services/octokit.service.ts index edb5b9e..2ce7a3a 100644 --- a/api/services/octokit.service.ts +++ b/api/services/octokit.service.ts @@ -1,4 +1,5 @@ import { App, Octokit } from "octokit"; +import { Env } from "../utils/env.js"; import { BOUNTY_LABEL, BOUNTY_PAID_LABEL, @@ -15,21 +16,21 @@ import { GitHubAPIError } from "../models/error.model.js"; import { dataLogger, messageLogger } from "../config/logger.config.js"; import { LinkedIssue } from "../models/ai-review.model.js"; -const commentCTA = `${process.env.CONTRIBUTOR_APP_URL!}/application`; +const commentCTA = `${Env.contributorAppUrl(true)}/application`; // Verify required environment variables are present -if (!process.env.GITHUB_APP_ID || !process.env.GITHUB_APP_PRIVATE_KEY) { +if (!Env.githubAppId() || !Env.githubAppPrivateKey()) { throw new GitHubAPIError("Missing GitHub App credentials (GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEY) in environment variables"); } export class OctokitService { private static githubApp = new App({ - appId: process.env.GITHUB_APP_ID!, - privateKey: process.env.GITHUB_APP_PRIVATE_KEY!.toString().replace(/\\n/g, "\n") + appId: Env.githubAppId(true), + privateKey: Env.githubAppPrivateKey(true).replace(/\\n/g, "\n") }); private static systemOctokit = new Octokit({ - auth: process.env.GITHUB_ACCESS_TOKEN + auth: Env.githubAccessToken() }); /** diff --git a/api/services/socket.service.ts b/api/services/socket.service.ts index bb6168f..4779216 100644 --- a/api/services/socket.service.ts +++ b/api/services/socket.service.ts @@ -1,7 +1,7 @@ import { Server as SocketIOServer } from "socket.io"; import { Server as HttpServer } from "http"; -import { ALLOWED_ORIGINS } from "../utils/data.js"; import { messageLogger } from "../config/logger.config.js"; +import { Env } from "../utils/env.js"; /** * Represents an activity event in the application. @@ -39,7 +39,7 @@ export class SocketService { this.io = new SocketIOServer(httpServer, { cors: { origin(origin, callback) { - if (!origin || ALLOWED_ORIGINS.includes(origin)) { + if (!origin || Env.corsOrigins(true).includes(origin)) { callback(null, true); } else { callback(new Error("Not allowed by CORS")); diff --git a/api/services/statsig.service.ts b/api/services/statsig.service.ts index 44fa0a2..f7a3ad3 100644 --- a/api/services/statsig.service.ts +++ b/api/services/statsig.service.ts @@ -1,4 +1,5 @@ import statsigPkg, { type StatsigUser } from "statsig-node"; +import { Env } from "../utils/env.js"; import { dataLogger } from "../config/logger.config.js"; const statsig = statsigPkg.default || statsigPkg; @@ -8,7 +9,7 @@ const statsig = statsigPkg.default || statsigPkg; */ class StatsigService { private isInitialized = false; - private isProduction = process.env.NODE_ENV === "production"; + private isProduction = Env.nodeEnv() === "production"; /** * Initialize Statsig @@ -22,7 +23,7 @@ class StatsigService { } // Check if STATSIG_API_KEY is set - const serverSecret = process.env.STATSIG_API_KEY; + const serverSecret = Env.statsigApiKey(true); if (!serverSecret) { dataLogger.warn("STATSIG_API_KEY is not set. Statsig will not be initialized."); return; diff --git a/api/services/stellar.service.ts b/api/services/stellar.service.ts index 5665c7d..50f2f93 100644 --- a/api/services/stellar.service.ts +++ b/api/services/stellar.service.ts @@ -14,6 +14,7 @@ import { } from "../config/stellar.config.js"; import { HorizonApi } from "../models/horizonapi.model.js"; import { StellarServiceError } from "../models/error.model.js"; +import { Env } from "../utils/env.js"; /** * Service for managing Stellar blockchain operations. @@ -32,7 +33,7 @@ export class StellarService { */ constructor() { // Verify required environment variables are present - if (!process.env.STELLAR_MASTER_SECRET_KEY || !process.env.STELLAR_MASTER_PUBLIC_KEY) { + if (!Env.stellarMasterSecretKey() || !Env.stellarMasterPublicKey()) { throw new StellarServiceError("Missing Stellar master account credentials in environment variables"); } @@ -40,7 +41,7 @@ export class StellarService { try { // Create keypair from the master secret key - this.masterAccount = Keypair.fromSecret(process.env.STELLAR_MASTER_SECRET_KEY); + this.masterAccount = Keypair.fromSecret(Env.stellarMasterSecretKey()); } catch (error) { throw new StellarServiceError("Invalid Stellar master account credentials", error); } diff --git a/api/utils/data.ts b/api/utils/data.ts index 8f490a9..b557a14 100644 --- a/api/utils/data.ts +++ b/api/utils/data.ts @@ -1,17 +1,3 @@ -/** - * List of allowed origins for API requests. - */ -export const ALLOWED_ORIGINS = [ - "https://devasign.com", - "https://app.devasign.com", - "https://contributor.devasign.com", - ...(process.env.NODE_ENV === "development" ? [ - "http://localhost:3000", - "http://localhost:4000", - "http://localhost:3001" - ] : []) -]; - /** * HTTP status codes used throughout the application. */ diff --git a/api/utils/env.ts b/api/utils/env.ts new file mode 100644 index 0000000..b6c4120 --- /dev/null +++ b/api/utils/env.ts @@ -0,0 +1,334 @@ +/** + * Env class to get environment variables + */ +export class Env { + private static getOrThrowError(key: string): string { + const value = process.env[key]; + if (!value) { + throw new Error(`Missing environment variable: ${key}`); + } + return value; + } + + static nodeEnv(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("NODE_ENV"); + } + return process.env.NODE_ENV as string; + } + + static corsOrigins(throwError: boolean = false): string[] { + if (throwError) { + return this.getOrThrowError("CORS_ORIGINS").split(","); + } + return process.env.CORS_ORIGINS?.split(",") as string[]; + } + + static databaseUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("DATABASE_URL"); + } + return process.env.DATABASE_URL as string; + } + + static firebaseProjectId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("FIREBASE_PROJECT_ID"); + } + return process.env.FIREBASE_PROJECT_ID as string; + } + + static firebasePrivateKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("FIREBASE_PRIVATE_KEY"); + } + return process.env.FIREBASE_PRIVATE_KEY as string; + } + + static firebaseClientEmail(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("FIREBASE_CLIENT_EMAIL"); + } + return process.env.FIREBASE_CLIENT_EMAIL as string; + } + + static githubAccessToken(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GITHUB_ACCESS_TOKEN"); + } + return process.env.GITHUB_ACCESS_TOKEN as string; + } + + static githubAppId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GITHUB_APP_ID"); + } + return process.env.GITHUB_APP_ID as string; + } + + static githubAppPrivateKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GITHUB_APP_PRIVATE_KEY"); + } + return process.env.GITHUB_APP_PRIVATE_KEY as string; + } + + static githubWebhookSecret(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GITHUB_WEBHOOK_SECRET"); + } + return process.env.GITHUB_WEBHOOK_SECRET as string; + } + + static stellarNetwork(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("STELLAR_NETWORK"); + } + return process.env.STELLAR_NETWORK as string; + } + + static stellarHorizonUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("STELLAR_HORIZON_URL"); + } + return process.env.STELLAR_HORIZON_URL as string; + } + + static stellarRpcUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("STELLAR_RPC_URL"); + } + return process.env.STELLAR_RPC_URL as string; + } + + static stellarMasterPublicKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("STELLAR_MASTER_PUBLIC_KEY"); + } + return process.env.STELLAR_MASTER_PUBLIC_KEY as string; + } + + static stellarMasterSecretKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("STELLAR_MASTER_SECRET_KEY"); + } + return process.env.STELLAR_MASTER_SECRET_KEY as string; + } + + static taskEscrowContractId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("TASK_ESCROW_CONTRACT_ID"); + } + return process.env.TASK_ESCROW_CONTRACT_ID as string; + } + + static usdcContractId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("USDC_CONTRACT_ID"); + } + return process.env.USDC_CONTRACT_ID as string; + } + + static usdcAssetId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("USDC_ASSET_ID"); + } + return process.env.USDC_ASSET_ID as string; + } + + static maxFee(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("MAX_FEE"); + } + return process.env.MAX_FEE as string; + } + + static x402PayeeAddress(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("X402_PAYEE_ADDRESS"); + } + return process.env.X402_PAYEE_ADDRESS as string; + } + + static x402FacilitatorUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("X402_FACILITATOR_URL"); + } + return process.env.X402_FACILITATOR_URL as string; + } + + static x402ApiKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("X402_API_KEY"); + } + return process.env.X402_API_KEY as string; + } + + static gcpProjectId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GCP_PROJECT_ID"); + } + return process.env.GCP_PROJECT_ID as string; + } + + static gcpLocationId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GCP_LOCATION_ID"); + } + return process.env.GCP_LOCATION_ID as string; + } + + static gcpKeyRingId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GCP_KEY_RING_ID"); + } + return process.env.GCP_KEY_RING_ID as string; + } + + static gcpKeyId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GCP_KEY_ID"); + } + return process.env.GCP_KEY_ID as string; + } + + static geminiModel(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("GEMINI_MODEL"); + } + return process.env.GEMINI_MODEL as string; + } + + static cloudTasksPrAnalysisQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); + } + return process.env.CLOUD_TASKS_PR_ANALYSIS_QUEUE as string; + } + + static cloudTasksManualPrAnalysisQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE"); + } + return process.env.CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE as string; + } + + static cloudTasksRepoIndexingQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_REPO_INDEXING_QUEUE"); + } + return process.env.CLOUD_TASKS_REPO_INDEXING_QUEUE as string; + } + + static cloudTasksIncrementalIndexingQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE"); + } + return process.env.CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE as string; + } + + static cloudTasksBountyPayoutQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE"); + } + return process.env.CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE as string; + } + + static cloudTasksClearInstallationQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE"); + } + return process.env.CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE as string; + } + + static cloudTasksClearRepoQueue(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_CLEAR_REPO_QUEUE"); + } + return process.env.CLOUD_TASKS_CLEAR_REPO_QUEUE as string; + } + + static cloudRunServiceUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_RUN_SERVICE_URL"); + } + return process.env.CLOUD_RUN_SERVICE_URL as string; + } + + static cloudRunPrivateServiceUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_RUN_PRIVATE_SERVICE_URL"); + } + return process.env.CLOUD_RUN_PRIVATE_SERVICE_URL as string; + } + + static cloudTasksServiceAccountEmail(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); + } + return process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL as string; + } + + static defaultSubscriptionPackageId(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("DEFAULT_SUBSCRIPTION_PACKAGE_ID"); + } + return process.env.DEFAULT_SUBSCRIPTION_PACKAGE_ID as string; + } + + static sumsubAppToken(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("SUMSUB_APP_TOKEN"); + } + return process.env.SUMSUB_APP_TOKEN as string; + } + + static sumsubSecretKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("SUMSUB_SECRET_KEY"); + } + return process.env.SUMSUB_SECRET_KEY as string; + } + + static sumsubWebhookSecret(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("SUMSUB_WEBHOOK_SECRET"); + } + return process.env.SUMSUB_WEBHOOK_SECRET as string; + } + + static sumsubLevelName(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("SUMSUB_LEVEL_NAME"); + } + return process.env.SUMSUB_LEVEL_NAME as string; + } + + static sumsubBaseUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("SUMSUB_BASE_URL"); + } + return process.env.SUMSUB_BASE_URL as string; + } + + static statsigApiKey(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("STATSIG_API_KEY"); + } + return process.env.STATSIG_API_KEY as string; + } + + static contributorAppUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CONTRIBUTOR_APP_URL"); + } + return process.env.CONTRIBUTOR_APP_URL as string; + } + + static port(throwError: boolean = false): number { + if (throwError) { + return Number(this.getOrThrowError("PORT")); + } + return Number(process.env.PORT); + } +} From 0769b0394dffe9655c73e2692228197ea7baf70b Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 30 Apr 2026 12:55:51 +0100 Subject: [PATCH 07/12] refactor: optimize some env vars handling --- .env.example | 2 +- api/config/logger.config.ts | 2 +- api/index.ts | 4 +-- api/middlewares/auth.middleware.ts | 19 ++++------ api/services/statsig.service.ts | 2 +- api/utils/env.ts | 36 +++++++++++-------- .../__tests__/database-test-utilities.test.ts | 2 +- 7 files changed, 33 insertions(+), 34 deletions(-) diff --git a/.env.example b/.env.example index 25449ad..a190f88 100644 --- a/.env.example +++ b/.env.example @@ -59,6 +59,6 @@ STATSIG_API_KEY= # Other environment variables NODE_ENV=development -PORT=8080 +PORT=5000 CORS_ORIGINS="http://localhost:3000,http://localhost:4000,http://localhost:3001" CONTRIBUTOR_APP_URL="http://localhost:4000" \ No newline at end of file diff --git a/api/config/logger.config.ts b/api/config/logger.config.ts index 4d8985c..81a4c6e 100644 --- a/api/config/logger.config.ts +++ b/api/config/logger.config.ts @@ -1,7 +1,7 @@ import winston from "winston"; import { Env } from "../utils/env.js"; -const LOG_LEVEL = "info"; +const LOG_LEVEL = Env.logLevel() || "info"; const NODE_ENV = Env.nodeEnv() || "development"; // Define log levels and colors diff --git a/api/index.ts b/api/index.ts index e93c122..e28199b 100644 --- a/api/index.ts +++ b/api/index.ts @@ -41,9 +41,7 @@ const httpServer = createServer(app); SocketService.initialize(httpServer); // Define port -const PORT = Env.nodeEnv() === "development" - ? 5000 - : (Env.port() || 8080); +const PORT = Env.port() || 8080; // Security middleware app.use(helmet()); diff --git a/api/middlewares/auth.middleware.ts b/api/middlewares/auth.middleware.ts index e382c28..cd003eb 100644 --- a/api/middlewares/auth.middleware.ts +++ b/api/middlewares/auth.middleware.ts @@ -99,7 +99,9 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne // The service account email that Cloud Tasks uses to sign OIDC tokens. // This must match the `oidcToken.serviceAccountEmail` configured in the Cloud Tasks service. - const CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL = Env.cloudTasksServiceAccountEmail(); + const cloudTasksServiceAccountEmail = Env.cloudTasksServiceAccountEmail(true); + // The URL where this application is hosted + const cloudRunServiceUrl = Env.cloudRunServiceUrl(true); try { // Extract the Bearer token from the Authorization header @@ -110,19 +112,10 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne const token = authHeader.split("Bearer ")[1]; - if (!Env.cloudRunServiceUrl()) { - throw new ErrorClass( - "SERVER_MISCONFIGURATION", - null, - "Server misconfiguration: CLOUD_RUN_SERVICE_URL is missing", - STATUS_CODES.INTERNAL_SERVER_ERROR - ); - } - // Verify the OIDC token const ticket = await authClient.verifyIdToken({ idToken: token, - audience: Env.cloudRunServiceUrl(true) + audience: cloudRunServiceUrl }); const payload = ticket.getPayload(); @@ -131,9 +124,9 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne } // Verify the token was issued for the expected Cloud Tasks service account - if (payload.email !== CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL) { + if (payload.email !== cloudTasksServiceAccountEmail) { dataLogger.warn("OIDC token email mismatch on internal route", { - expected: CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL, + expected: cloudTasksServiceAccountEmail, received: payload.email, path: req.path }); diff --git a/api/services/statsig.service.ts b/api/services/statsig.service.ts index f7a3ad3..83dbbe6 100644 --- a/api/services/statsig.service.ts +++ b/api/services/statsig.service.ts @@ -23,7 +23,7 @@ class StatsigService { } // Check if STATSIG_API_KEY is set - const serverSecret = Env.statsigApiKey(true); + const serverSecret = Env.statsigApiKey(); if (!serverSecret) { dataLogger.warn("STATSIG_API_KEY is not set. Statsig will not be initialized."); return; diff --git a/api/utils/env.ts b/api/utils/env.ts index b6c4120..f4e7093 100644 --- a/api/utils/env.ts +++ b/api/utils/env.ts @@ -1,3 +1,6 @@ +import { ErrorClass } from "../models/error.model.js"; +import { STATUS_CODES } from "./data.js"; + /** * Env class to get environment variables */ @@ -5,7 +8,12 @@ export class Env { private static getOrThrowError(key: string): string { const value = process.env[key]; if (!value) { - throw new Error(`Missing environment variable: ${key}`); + throw new ErrorClass( + "SERVER_MISCONFIGURATION", + null, + `Missing environment variable: ${key}`, + STATUS_CODES.INTERNAL_SERVER_ERROR + ); } return value; } @@ -192,13 +200,6 @@ export class Env { return process.env.GCP_KEY_ID as string; } - static geminiModel(throwError: boolean = false): string { - if (throwError) { - return this.getOrThrowError("GEMINI_MODEL"); - } - return process.env.GEMINI_MODEL as string; - } - static cloudTasksPrAnalysisQueue(throwError: boolean = false): string { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); @@ -311,18 +312,18 @@ export class Env { return process.env.SUMSUB_BASE_URL as string; } - static statsigApiKey(throwError: boolean = false): string { + static logLevel(throwError: boolean = false): string { if (throwError) { - return this.getOrThrowError("STATSIG_API_KEY"); + return this.getOrThrowError("LOG_LEVEL"); } - return process.env.STATSIG_API_KEY as string; + return process.env.LOG_LEVEL as string; } - static contributorAppUrl(throwError: boolean = false): string { + static statsigApiKey(throwError: boolean = false): string { if (throwError) { - return this.getOrThrowError("CONTRIBUTOR_APP_URL"); + return this.getOrThrowError("STATSIG_API_KEY"); } - return process.env.CONTRIBUTOR_APP_URL as string; + return process.env.STATSIG_API_KEY as string; } static port(throwError: boolean = false): number { @@ -331,4 +332,11 @@ export class Env { } return Number(process.env.PORT); } + + static contributorAppUrl(throwError: boolean = false): string { + if (throwError) { + return this.getOrThrowError("CONTRIBUTOR_APP_URL"); + } + return process.env.CONTRIBUTOR_APP_URL as string; + } } diff --git a/tests/helpers/__tests__/database-test-utilities.test.ts b/tests/helpers/__tests__/database-test-utilities.test.ts index 7dad68f..c78ebb0 100644 --- a/tests/helpers/__tests__/database-test-utilities.test.ts +++ b/tests/helpers/__tests__/database-test-utilities.test.ts @@ -1,4 +1,4 @@ -import { vi, describe, it, expect, beforeAll, beforeEach, afterAll } from "vitest"; +import { describe, it, expect, beforeAll, beforeEach, afterAll } from "vitest"; import { DatabaseTestHelper } from "../database-test-helper.js"; import { DatabaseTestUtilities } from "../database-test-utilities.js"; import { TestDataFactory } from "../test-data-factory.js"; From c049bdac8f3b7bd698b1d8621515d5fb5062de44 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 30 Apr 2026 17:31:39 +0100 Subject: [PATCH 08/12] refactor(schemas): rename index.schema.ts to global.schema.ts --- api/schemas/{index.schema.ts => global.schema.ts} | 0 api/schemas/installation.schema.ts | 2 +- api/schemas/task.schema.ts | 2 +- api/schemas/wallet.schema.ts | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename api/schemas/{index.schema.ts => global.schema.ts} (100%) diff --git a/api/schemas/index.schema.ts b/api/schemas/global.schema.ts similarity index 100% rename from api/schemas/index.schema.ts rename to api/schemas/global.schema.ts diff --git a/api/schemas/installation.schema.ts b/api/schemas/installation.schema.ts index a82efbb..5bfcb70 100644 --- a/api/schemas/installation.schema.ts +++ b/api/schemas/installation.schema.ts @@ -3,7 +3,7 @@ import { installationIdSchema, paginationSchema, userIdSchema -} from "./index.schema.js"; +} from "./global.schema.js"; export const getInstallationsSchema = { query: z.object({ diff --git a/api/schemas/task.schema.ts b/api/schemas/task.schema.ts index f930453..4358c41 100644 --- a/api/schemas/task.schema.ts +++ b/api/schemas/task.schema.ts @@ -5,7 +5,7 @@ import { installationIdSchema, paginationSchema, userIdSchema -} from "./index.schema.js"; +} from "./global.schema.js"; export const taskIdSchema = z.object({ taskId: cuidSchema diff --git a/api/schemas/wallet.schema.ts b/api/schemas/wallet.schema.ts index 0dc280b..227f42b 100644 --- a/api/schemas/wallet.schema.ts +++ b/api/schemas/wallet.schema.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import { installationIdSchema, paginationSchema } from "./index.schema.js"; +import { installationIdSchema, paginationSchema } from "./global.schema.js"; import { TransactionCategory } from "../../prisma_client/index.js"; export const walletInstallationIdSchema = { From 5ff85106a34637d59014228db11eccb5774dbecd Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 30 Apr 2026 18:14:42 +0100 Subject: [PATCH 09/12] refactor: improve environment variable type safety and increase JSON payload limit --- api/config/firebase.config.ts | 6 +- api/config/stellar.config.ts | 4 +- .../installation/index.controller.ts | 4 +- api/controllers/user/index.controller.ts | 4 +- api/controllers/user/sumsub.controller.ts | 6 +- api/controllers/wallet/index.controller.ts | 2 +- api/index.ts | 2 +- api/middlewares/auth.middleware.ts | 4 +- api/services/cloud-tasks.service.ts | 12 +- api/services/contract.service.ts | 16 +- api/services/kms.service.ts | 10 +- api/services/octokit.service.ts | 8 +- api/services/socket.service.ts | 2 +- api/services/stellar.service.ts | 2 +- api/utils/env.ts | 184 +++++++++--------- 15 files changed, 133 insertions(+), 133 deletions(-) diff --git a/api/config/firebase.config.ts b/api/config/firebase.config.ts index 9305779..c8fc90b 100644 --- a/api/config/firebase.config.ts +++ b/api/config/firebase.config.ts @@ -2,9 +2,9 @@ import admin, { ServiceAccount } from "firebase-admin"; import { Env } from "../utils/env.js"; const serviceAccount: ServiceAccount = { - projectId: Env.firebaseProjectId(), - clientEmail: Env.firebaseClientEmail(), - privateKey: Env.firebasePrivateKey()?.toString().replace(/\\n/g, "\n") + projectId: (Env.firebaseProjectId() || ""), + clientEmail: (Env.firebaseClientEmail() || ""), + privateKey: (Env.firebasePrivateKey() || "")?.replace(/\\n/g, "\n") }; admin.initializeApp({ diff --git a/api/config/stellar.config.ts b/api/config/stellar.config.ts index b6472a2..b3ed355 100644 --- a/api/config/stellar.config.ts +++ b/api/config/stellar.config.ts @@ -1,7 +1,7 @@ import { Horizon, Asset, Networks } from "@stellar/stellar-sdk"; import { Env } from "../utils/env.js"; -export const isMainnet = Env.stellarNetwork() === "public"; +export const isMainnet = (Env.stellarNetwork() || "") === "public"; export const horizonUrl = isMainnet ? "https://horizon.stellar.org" @@ -20,5 +20,5 @@ export const anchorHomeDomain = isMainnet export const xlmAsset = Asset.native(); export const usdcAsset = new Asset( "USDC", - Env.usdcAssetId(true) + (Env.usdcAssetId(true) || "") ); diff --git a/api/controllers/installation/index.controller.ts b/api/controllers/installation/index.controller.ts index e442d1f..64c91fc 100644 --- a/api/controllers/installation/index.controller.ts +++ b/api/controllers/installation/index.controller.ts @@ -160,7 +160,7 @@ export const createInstallation = async (req: Request, res: Response, next: Next connect: { userId } }, subscriptionPackage: { - connect: { id: Env.defaultSubscriptionPackageId(true) } + connect: { id: Env.defaultSubscriptionPackageId(true)! } } }, select @@ -170,7 +170,7 @@ export const createInstallation = async (req: Request, res: Response, next: Next try { // Add USDC trustline only if it's a new wallet if (isNewWallet) { - const masterAccountSecret = Env.stellarMasterSecretKey(true); + const masterAccountSecret = Env.stellarMasterSecretKey(true)!; await stellarService.addTrustLineViaSponsor( masterAccountSecret, diff --git a/api/controllers/user/index.controller.ts b/api/controllers/user/index.controller.ts index 0ac7c74..e34ec9d 100644 --- a/api/controllers/user/index.controller.ts +++ b/api/controllers/user/index.controller.ts @@ -125,7 +125,7 @@ export const createUser = async (req: Request, res: Response, next: NextFunction try { // Add USDC trustline to wallet await stellarService.addTrustLineViaSponsor( - Env.stellarMasterSecretKey(true), + Env.stellarMasterSecretKey(true)!, userWallet.secretKey ); @@ -338,7 +338,7 @@ export const getUser = async (req: Request, res: Response, next: NextFunction) = try { // Add USDC trustline to wallet await stellarService.addTrustLineViaSponsor( - Env.stellarMasterSecretKey(true), + Env.stellarMasterSecretKey(true)!, userWallet.secretKey ); walletStatus.usdcTrustline = true; diff --git a/api/controllers/user/sumsub.controller.ts b/api/controllers/user/sumsub.controller.ts index 03e8e02..9a49f72 100644 --- a/api/controllers/user/sumsub.controller.ts +++ b/api/controllers/user/sumsub.controller.ts @@ -24,9 +24,9 @@ export const generateSumsubSdkToken = async (req: Request, res: Response, next: }); } - const SUMSUB_APP_TOKEN = Env.sumsubAppToken(true); - const SUMSUB_SECRET_KEY = Env.sumsubSecretKey(true); - const SUMSUB_LEVEL_NAME = Env.sumsubLevelName(true); + const SUMSUB_APP_TOKEN = Env.sumsubAppToken(true)!; + const SUMSUB_SECRET_KEY = (Env.sumsubSecretKey(true) || ""); + const SUMSUB_LEVEL_NAME = Env.sumsubLevelName(true)!; const SUMSUB_BASE_URL = Env.sumsubBaseUrl() || "https://api.sumsub.com"; // Generate the request URL, timestamp and request body diff --git a/api/controllers/wallet/index.controller.ts b/api/controllers/wallet/index.controller.ts index bd34583..bdfacf0 100644 --- a/api/controllers/wallet/index.controller.ts +++ b/api/controllers/wallet/index.controller.ts @@ -143,7 +143,7 @@ export const withdrawAsset = async (req: Request, res: Response, next: NextFunct )); } else { // User wallet withdrawals — master account sponsors the transaction fee - const masterSecret = Env.stellarMasterSecretKey(true); + const masterSecret = Env.stellarMasterSecretKey(true)!; ({ txHash } = await stellarService.transferAssetViaSponsor( masterSecret, walletSecret, diff --git a/api/index.ts b/api/index.ts index e28199b..a2aba9c 100644 --- a/api/index.ts +++ b/api/index.ts @@ -77,7 +77,7 @@ app.use( // General API Middleware app.use(apiLimiter); -app.use(express.json()); +app.use(express.json({ limit: "10mb" })); // User routes app.use( diff --git a/api/middlewares/auth.middleware.ts b/api/middlewares/auth.middleware.ts index cd003eb..9717795 100644 --- a/api/middlewares/auth.middleware.ts +++ b/api/middlewares/auth.middleware.ts @@ -99,9 +99,9 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne // The service account email that Cloud Tasks uses to sign OIDC tokens. // This must match the `oidcToken.serviceAccountEmail` configured in the Cloud Tasks service. - const cloudTasksServiceAccountEmail = Env.cloudTasksServiceAccountEmail(true); + const cloudTasksServiceAccountEmail = Env.cloudTasksServiceAccountEmail(true)!; // The URL where this application is hosted - const cloudRunServiceUrl = Env.cloudRunServiceUrl(true); + const cloudRunServiceUrl = Env.cloudRunServiceUrl(true)!; try { // Extract the Bearer token from the Authorization header diff --git a/api/services/cloud-tasks.service.ts b/api/services/cloud-tasks.service.ts index fd2c127..fba8671 100644 --- a/api/services/cloud-tasks.service.ts +++ b/api/services/cloud-tasks.service.ts @@ -74,11 +74,11 @@ export class CloudTasksService { // Service configuration mapping routing queues and target endpoints private readonly config = { - project: Env.gcpProjectId(true), - location: Env.gcpLocationId(true), - cloudRunServiceUrl: Env.cloudRunServiceUrl(true), - cloudRunPrivateServiceUrl: Env.cloudRunPrivateServiceUrl(true), - cloudTasksServiceAccountEmail: Env.cloudTasksServiceAccountEmail(true), + project: Env.gcpProjectId(true)!, + location: Env.gcpLocationId(true)!, + cloudRunServiceUrl: Env.cloudRunServiceUrl(true)!, + cloudRunPrivateServiceUrl: Env.cloudRunPrivateServiceUrl(true)!, + cloudTasksServiceAccountEmail: (Env.cloudTasksServiceAccountEmail(true) || ""), queues: { "pr-analysis": Env.cloudTasksPrAnalysisQueue() || "", "manual-pr-analysis": Env.cloudTasksManualPrAnalysisQueue() || "", @@ -110,7 +110,7 @@ export class CloudTasksService { if (!Env.gcpLocationId()) missing.push("GCP_LOCATION_ID"); if (!Env.cloudRunServiceUrl()) missing.push("CLOUD_RUN_SERVICE_URL"); if (!Env.cloudRunPrivateServiceUrl()) missing.push("CLOUD_RUN_PRIVATE_SERVICE_URL"); - if (!Env.cloudTasksServiceAccountEmail()) missing.push("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); + if (!((Env.cloudTasksServiceAccountEmail() || "") || "")) missing.push("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); if (!Env.cloudTasksPrAnalysisQueue()) missing.push("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); if (!Env.cloudTasksManualPrAnalysisQueue()) missing.push("CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE"); if (!Env.cloudTasksRepoIndexingQueue()) missing.push("CLOUD_TASKS_REPO_INDEXING_QUEUE"); diff --git a/api/services/contract.service.ts b/api/services/contract.service.ts index cf37b24..656e1ae 100644 --- a/api/services/contract.service.ts +++ b/api/services/contract.service.ts @@ -19,8 +19,8 @@ export class ContractService { static { // Verify required environment variables are present const missing: string[] = []; - if (!Env.stellarNetwork()) missing.push("STELLAR_NETWORK"); - if (!Env.stellarRpcUrl()) missing.push("STELLAR_RPC_URL"); + if (!(Env.stellarNetwork() || "")) missing.push("STELLAR_NETWORK"); + if (!(Env.stellarRpcUrl() || "")) missing.push("STELLAR_RPC_URL"); if (!Env.taskEscrowContractId()) missing.push("TASK_ESCROW_CONTRACT_ID"); if (!Env.usdcContractId()) missing.push("USDC_CONTRACT_ID"); if (!Env.stellarMasterPublicKey()) missing.push("STELLAR_MASTER_PUBLIC_KEY"); @@ -31,14 +31,14 @@ export class ContractService { // Soroban network configuration loaded from environment variables private static CONFIG = { - network: Env.stellarNetwork(true), - rpcUrl: Env.stellarRpcUrl(true), - networkPassphrase: Env.stellarNetwork() === "public" + network: ((Env.stellarNetwork(true) || "") || ""), + rpcUrl: ((Env.stellarRpcUrl(true) || "") || ""), + networkPassphrase: (Env.stellarNetwork() || "") === "public" ? Networks.PUBLIC : Networks.TESTNET, - contractId: Env.taskEscrowContractId(true), - usdcContractId: Env.usdcContractId(true), - masterPublicKey: Env.stellarMasterPublicKey(true), + contractId: Env.taskEscrowContractId(true)!, + usdcContractId: Env.usdcContractId(true)!, + masterPublicKey: Env.stellarMasterPublicKey(true)!, maxFee: Env.maxFee() || "1000000" }; diff --git a/api/services/kms.service.ts b/api/services/kms.service.ts index 1d664fb..8f58fc2 100644 --- a/api/services/kms.service.ts +++ b/api/services/kms.service.ts @@ -5,15 +5,15 @@ import { KmsServiceError } from "../models/error.model.js"; import { Env } from "../utils/env.js"; // Verify required environment variables are present -if (!Env.gcpProjectId() || !Env.gcpLocationId() || !Env.gcpKeyRingId() || !Env.gcpKeyId()) { +if (!(Env.gcpProjectId() || "") || !Env.gcpLocationId() || !Env.gcpKeyRingId() || !Env.gcpKeyId()) { throw new KmsServiceError("Missing GCP KMS credentials (GCP_PROJECT_ID, GCP_LOCATION_ID, GCP_KEY_RING_ID, GCP_KEY_ID) in environment variables"); } // Set Google Cloud KMS environment variables -const PROJECT_ID = Env.gcpProjectId(true); -const LOCATION_ID = Env.gcpLocationId(true); -const KEY_RING_ID = Env.gcpKeyRingId(true); -const KEY_ID = Env.gcpKeyId(true); +const PROJECT_ID = ((Env.gcpProjectId(true) || "") || ""); +const LOCATION_ID = Env.gcpLocationId(true)!; +const KEY_RING_ID = Env.gcpKeyRingId(true)!; +const KEY_ID = Env.gcpKeyId(true)!; const client = new KeyManagementServiceClient(); const keyName = client.cryptoKeyPath(PROJECT_ID, LOCATION_ID, KEY_RING_ID, KEY_ID); diff --git a/api/services/octokit.service.ts b/api/services/octokit.service.ts index 2ce7a3a..b1546a0 100644 --- a/api/services/octokit.service.ts +++ b/api/services/octokit.service.ts @@ -16,17 +16,17 @@ import { GitHubAPIError } from "../models/error.model.js"; import { dataLogger, messageLogger } from "../config/logger.config.js"; import { LinkedIssue } from "../models/ai-review.model.js"; -const commentCTA = `${Env.contributorAppUrl(true)}/application`; +const commentCTA = `${Env.contributorAppUrl(true)!}/application`; // Verify required environment variables are present -if (!Env.githubAppId() || !Env.githubAppPrivateKey()) { +if (!((Env.githubAppId() || "") || "") || !((Env.githubAppPrivateKey() || "") || "")) { throw new GitHubAPIError("Missing GitHub App credentials (GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEY) in environment variables"); } export class OctokitService { private static githubApp = new App({ - appId: Env.githubAppId(true), - privateKey: Env.githubAppPrivateKey(true).replace(/\\n/g, "\n") + appId: (Env.githubAppId(true) || ""), + privateKey: (Env.githubAppPrivateKey(true) || "").replace(/\\n/g, "\n") }); private static systemOctokit = new Octokit({ diff --git a/api/services/socket.service.ts b/api/services/socket.service.ts index 4779216..527fb27 100644 --- a/api/services/socket.service.ts +++ b/api/services/socket.service.ts @@ -39,7 +39,7 @@ export class SocketService { this.io = new SocketIOServer(httpServer, { cors: { origin(origin, callback) { - if (!origin || Env.corsOrigins(true).includes(origin)) { + if (!origin || Env.corsOrigins(true)!.includes(origin)) { callback(null, true); } else { callback(new Error("Not allowed by CORS")); diff --git a/api/services/stellar.service.ts b/api/services/stellar.service.ts index 50f2f93..fb41b20 100644 --- a/api/services/stellar.service.ts +++ b/api/services/stellar.service.ts @@ -41,7 +41,7 @@ export class StellarService { try { // Create keypair from the master secret key - this.masterAccount = Keypair.fromSecret(Env.stellarMasterSecretKey()); + this.masterAccount = Keypair.fromSecret(Env.stellarMasterSecretKey() || ""); } catch (error) { throw new StellarServiceError("Invalid Stellar master account credentials", error); } diff --git a/api/utils/env.ts b/api/utils/env.ts index f4e7093..bb17ce6 100644 --- a/api/utils/env.ts +++ b/api/utils/env.ts @@ -5,7 +5,7 @@ import { STATUS_CODES } from "./data.js"; * Env class to get environment variables */ export class Env { - private static getOrThrowError(key: string): string { + private static getOrThrowError(key: string) { const value = process.env[key]; if (!value) { throw new ErrorClass( @@ -18,325 +18,325 @@ export class Env { return value; } - static nodeEnv(throwError: boolean = false): string { + static nodeEnv(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("NODE_ENV"); } - return process.env.NODE_ENV as string; + return process.env.NODE_ENV; } - static corsOrigins(throwError: boolean = false): string[] { + static corsOrigins(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CORS_ORIGINS").split(","); } - return process.env.CORS_ORIGINS?.split(",") as string[]; + return process.env.CORS_ORIGINS?.split(",") || []; } - static databaseUrl(throwError: boolean = false): string { + static databaseUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("DATABASE_URL"); } - return process.env.DATABASE_URL as string; + return process.env.DATABASE_URL; } - static firebaseProjectId(throwError: boolean = false): string { + static firebaseProjectId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("FIREBASE_PROJECT_ID"); } - return process.env.FIREBASE_PROJECT_ID as string; + return process.env.FIREBASE_PROJECT_ID; } - static firebasePrivateKey(throwError: boolean = false): string { + static firebasePrivateKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("FIREBASE_PRIVATE_KEY"); } - return process.env.FIREBASE_PRIVATE_KEY as string; + return process.env.FIREBASE_PRIVATE_KEY; } - static firebaseClientEmail(throwError: boolean = false): string { + static firebaseClientEmail(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("FIREBASE_CLIENT_EMAIL"); } - return process.env.FIREBASE_CLIENT_EMAIL as string; + return process.env.FIREBASE_CLIENT_EMAIL; } - static githubAccessToken(throwError: boolean = false): string { + static githubAccessToken(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GITHUB_ACCESS_TOKEN"); } - return process.env.GITHUB_ACCESS_TOKEN as string; + return process.env.GITHUB_ACCESS_TOKEN; } - static githubAppId(throwError: boolean = false): string { + static githubAppId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GITHUB_APP_ID"); } - return process.env.GITHUB_APP_ID as string; + return process.env.GITHUB_APP_ID; } - static githubAppPrivateKey(throwError: boolean = false): string { + static githubAppPrivateKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GITHUB_APP_PRIVATE_KEY"); } - return process.env.GITHUB_APP_PRIVATE_KEY as string; + return process.env.GITHUB_APP_PRIVATE_KEY; } - static githubWebhookSecret(throwError: boolean = false): string { + static githubWebhookSecret(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GITHUB_WEBHOOK_SECRET"); } - return process.env.GITHUB_WEBHOOK_SECRET as string; + return process.env.GITHUB_WEBHOOK_SECRET; } - static stellarNetwork(throwError: boolean = false): string { + static stellarNetwork(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("STELLAR_NETWORK"); } - return process.env.STELLAR_NETWORK as string; + return process.env.STELLAR_NETWORK; } - static stellarHorizonUrl(throwError: boolean = false): string { + static stellarHorizonUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("STELLAR_HORIZON_URL"); } - return process.env.STELLAR_HORIZON_URL as string; + return process.env.STELLAR_HORIZON_URL; } - static stellarRpcUrl(throwError: boolean = false): string { + static stellarRpcUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("STELLAR_RPC_URL"); } - return process.env.STELLAR_RPC_URL as string; + return process.env.STELLAR_RPC_URL; } - static stellarMasterPublicKey(throwError: boolean = false): string { + static stellarMasterPublicKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("STELLAR_MASTER_PUBLIC_KEY"); } - return process.env.STELLAR_MASTER_PUBLIC_KEY as string; + return process.env.STELLAR_MASTER_PUBLIC_KEY; } - static stellarMasterSecretKey(throwError: boolean = false): string { + static stellarMasterSecretKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("STELLAR_MASTER_SECRET_KEY"); } - return process.env.STELLAR_MASTER_SECRET_KEY as string; + return process.env.STELLAR_MASTER_SECRET_KEY; } - static taskEscrowContractId(throwError: boolean = false): string { + static taskEscrowContractId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("TASK_ESCROW_CONTRACT_ID"); } - return process.env.TASK_ESCROW_CONTRACT_ID as string; + return process.env.TASK_ESCROW_CONTRACT_ID; } - static usdcContractId(throwError: boolean = false): string { + static usdcContractId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("USDC_CONTRACT_ID"); } - return process.env.USDC_CONTRACT_ID as string; + return process.env.USDC_CONTRACT_ID; } - static usdcAssetId(throwError: boolean = false): string { + static usdcAssetId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("USDC_ASSET_ID"); } - return process.env.USDC_ASSET_ID as string; + return process.env.USDC_ASSET_ID; } - static maxFee(throwError: boolean = false): string { + static maxFee(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("MAX_FEE"); } - return process.env.MAX_FEE as string; + return process.env.MAX_FEE; } - static x402PayeeAddress(throwError: boolean = false): string { + static x402PayeeAddress(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("X402_PAYEE_ADDRESS"); } - return process.env.X402_PAYEE_ADDRESS as string; + return process.env.X402_PAYEE_ADDRESS; } - static x402FacilitatorUrl(throwError: boolean = false): string { + static x402FacilitatorUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("X402_FACILITATOR_URL"); } - return process.env.X402_FACILITATOR_URL as string; + return process.env.X402_FACILITATOR_URL; } - static x402ApiKey(throwError: boolean = false): string { + static x402ApiKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("X402_API_KEY"); } - return process.env.X402_API_KEY as string; + return process.env.X402_API_KEY; } - static gcpProjectId(throwError: boolean = false): string { + static gcpProjectId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GCP_PROJECT_ID"); } - return process.env.GCP_PROJECT_ID as string; + return process.env.GCP_PROJECT_ID; } - static gcpLocationId(throwError: boolean = false): string { + static gcpLocationId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GCP_LOCATION_ID"); } - return process.env.GCP_LOCATION_ID as string; + return process.env.GCP_LOCATION_ID; } - static gcpKeyRingId(throwError: boolean = false): string { + static gcpKeyRingId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GCP_KEY_RING_ID"); } - return process.env.GCP_KEY_RING_ID as string; + return process.env.GCP_KEY_RING_ID; } - static gcpKeyId(throwError: boolean = false): string { + static gcpKeyId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("GCP_KEY_ID"); } - return process.env.GCP_KEY_ID as string; + return process.env.GCP_KEY_ID; } - static cloudTasksPrAnalysisQueue(throwError: boolean = false): string { + static cloudTasksPrAnalysisQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); } - return process.env.CLOUD_TASKS_PR_ANALYSIS_QUEUE as string; + return process.env.CLOUD_TASKS_PR_ANALYSIS_QUEUE; } - static cloudTasksManualPrAnalysisQueue(throwError: boolean = false): string { + static cloudTasksManualPrAnalysisQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE"); } - return process.env.CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE as string; + return process.env.CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE; } - static cloudTasksRepoIndexingQueue(throwError: boolean = false): string { + static cloudTasksRepoIndexingQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_REPO_INDEXING_QUEUE"); } - return process.env.CLOUD_TASKS_REPO_INDEXING_QUEUE as string; + return process.env.CLOUD_TASKS_REPO_INDEXING_QUEUE; } - static cloudTasksIncrementalIndexingQueue(throwError: boolean = false): string { + static cloudTasksIncrementalIndexingQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE"); } - return process.env.CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE as string; + return process.env.CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE; } - static cloudTasksBountyPayoutQueue(throwError: boolean = false): string { + static cloudTasksBountyPayoutQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE"); } - return process.env.CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE as string; + return process.env.CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE; } - static cloudTasksClearInstallationQueue(throwError: boolean = false): string { + static cloudTasksClearInstallationQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE"); } - return process.env.CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE as string; + return process.env.CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE; } - static cloudTasksClearRepoQueue(throwError: boolean = false): string { + static cloudTasksClearRepoQueue(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_CLEAR_REPO_QUEUE"); } - return process.env.CLOUD_TASKS_CLEAR_REPO_QUEUE as string; + return process.env.CLOUD_TASKS_CLEAR_REPO_QUEUE; } - static cloudRunServiceUrl(throwError: boolean = false): string { + static cloudRunServiceUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_RUN_SERVICE_URL"); } - return process.env.CLOUD_RUN_SERVICE_URL as string; + return process.env.CLOUD_RUN_SERVICE_URL; } - static cloudRunPrivateServiceUrl(throwError: boolean = false): string { + static cloudRunPrivateServiceUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_RUN_PRIVATE_SERVICE_URL"); } - return process.env.CLOUD_RUN_PRIVATE_SERVICE_URL as string; + return process.env.CLOUD_RUN_PRIVATE_SERVICE_URL; } - static cloudTasksServiceAccountEmail(throwError: boolean = false): string { + static cloudTasksServiceAccountEmail(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); } - return process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL as string; + return process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL; } - static defaultSubscriptionPackageId(throwError: boolean = false): string { + static defaultSubscriptionPackageId(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("DEFAULT_SUBSCRIPTION_PACKAGE_ID"); } - return process.env.DEFAULT_SUBSCRIPTION_PACKAGE_ID as string; + return process.env.DEFAULT_SUBSCRIPTION_PACKAGE_ID; } - static sumsubAppToken(throwError: boolean = false): string { + static sumsubAppToken(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("SUMSUB_APP_TOKEN"); } - return process.env.SUMSUB_APP_TOKEN as string; + return process.env.SUMSUB_APP_TOKEN; } - static sumsubSecretKey(throwError: boolean = false): string { + static sumsubSecretKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("SUMSUB_SECRET_KEY"); } - return process.env.SUMSUB_SECRET_KEY as string; + return process.env.SUMSUB_SECRET_KEY; } - static sumsubWebhookSecret(throwError: boolean = false): string { + static sumsubWebhookSecret(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("SUMSUB_WEBHOOK_SECRET"); } - return process.env.SUMSUB_WEBHOOK_SECRET as string; + return process.env.SUMSUB_WEBHOOK_SECRET; } - static sumsubLevelName(throwError: boolean = false): string { + static sumsubLevelName(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("SUMSUB_LEVEL_NAME"); } - return process.env.SUMSUB_LEVEL_NAME as string; + return process.env.SUMSUB_LEVEL_NAME; } - static sumsubBaseUrl(throwError: boolean = false): string { + static sumsubBaseUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("SUMSUB_BASE_URL"); } - return process.env.SUMSUB_BASE_URL as string; + return process.env.SUMSUB_BASE_URL; } - static logLevel(throwError: boolean = false): string { + static logLevel(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("LOG_LEVEL"); } - return process.env.LOG_LEVEL as string; + return process.env.LOG_LEVEL; } - static statsigApiKey(throwError: boolean = false): string { + static statsigApiKey(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("STATSIG_API_KEY"); } - return process.env.STATSIG_API_KEY as string; + return process.env.STATSIG_API_KEY; } - static port(throwError: boolean = false): number { + static port(throwError: boolean = false) { if (throwError) { return Number(this.getOrThrowError("PORT")); } return Number(process.env.PORT); } - static contributorAppUrl(throwError: boolean = false): string { + static contributorAppUrl(throwError: boolean = false) { if (throwError) { return this.getOrThrowError("CONTRIBUTOR_APP_URL"); } - return process.env.CONTRIBUTOR_APP_URL as string; + return process.env.CONTRIBUTOR_APP_URL; } } From c8574f13c435cd9e8956bb152915bb76cf2a5461 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Thu, 30 Apr 2026 18:35:56 +0100 Subject: [PATCH 10/12] perf(cors): cache allowed origins to avoid repeated evaluation per request --- api/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/api/index.ts b/api/index.ts index a2aba9c..bc67a02 100644 --- a/api/index.ts +++ b/api/index.ts @@ -43,13 +43,15 @@ SocketService.initialize(httpServer); // Define port const PORT = Env.port() || 8080; +// Get allowed origins for CORS +const allowedOrigins = Env.corsOrigins(true); + // Security middleware app.use(helmet()); app.use( cors({ origin(origin, callback) { - // Allowed origins - if (!origin || Env.corsOrigins(true).includes(origin)) { + if (!origin || allowedOrigins.includes(origin)) { return callback(null, true); } callback(new ErrorClass( From d3fa0c1c6c7504287f2ab12101b1c3080ab96a34 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Tue, 5 May 2026 17:13:17 +0100 Subject: [PATCH 11/12] update --- api/routes/_test_/general.test.route.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/routes/_test_/general.test.route.ts b/api/routes/_test_/general.test.route.ts index c54d32b..8b69fa4 100644 --- a/api/routes/_test_/general.test.route.ts +++ b/api/routes/_test_/general.test.route.ts @@ -152,8 +152,6 @@ router.post("/reset-db", async (req: Request, res: Response) => { await prisma.wallet.deleteMany(); await prisma.permission.deleteMany(); - // await prisma.subscriptionPackage.deleteMany(); - responseWrapper({ res, status: STATUS_CODES.OK, From 84a99daaf6e77e3a267e03060bcfba84f04673d6 Mon Sep 17 00:00:00 2001 From: lenny_malcolm0 Date: Tue, 5 May 2026 17:57:43 +0100 Subject: [PATCH 12/12] refactor(env): enhance environment variable validation and clean up redundant fallbacks --- .env.example | 4 +-- api/routes/agent.route.ts | 2 +- api/services/cloud-tasks.service.ts | 3 ++- api/services/contract.service.ts | 4 +-- api/services/kms.service.ts | 4 +-- api/services/octokit.service.ts | 2 +- api/services/stellar.service.ts | 20 +++++++++++---- api/utils/env.ts | 25 +++++++++++++++---- .../api/webhook/sumsub.api.test.ts | 2 +- 9 files changed, 46 insertions(+), 20 deletions(-) diff --git a/.env.example b/.env.example index a190f88..8173534 100644 --- a/.env.example +++ b/.env.example @@ -60,5 +60,5 @@ STATSIG_API_KEY= # Other environment variables NODE_ENV=development PORT=5000 -CORS_ORIGINS="http://localhost:3000,http://localhost:4000,http://localhost:3001" -CONTRIBUTOR_APP_URL="http://localhost:4000" \ No newline at end of file +CORS_ORIGINS=http://localhost:3000,http://localhost:4000,http://localhost:3001 +CONTRIBUTOR_APP_URL=http://localhost:4000 \ No newline at end of file diff --git a/api/routes/agent.route.ts b/api/routes/agent.route.ts index 7add99c..4cb0a54 100644 --- a/api/routes/agent.route.ts +++ b/api/routes/agent.route.ts @@ -12,7 +12,7 @@ import { Env } from "../utils/env.js"; const network = "stellar:testnet" as `${string}:${string}`; const facilitatorUrl = Env.x402FacilitatorUrl(); const x402Config = { - payeeAddress: Env.x402PayeeAddress() || "0", + payeeAddress: Env.x402PayeeAddress() || "", facilitatorUrl: Env.x402FacilitatorUrl() || "" }; diff --git a/api/services/cloud-tasks.service.ts b/api/services/cloud-tasks.service.ts index fba8671..ea0b4dd 100644 --- a/api/services/cloud-tasks.service.ts +++ b/api/services/cloud-tasks.service.ts @@ -110,7 +110,7 @@ export class CloudTasksService { if (!Env.gcpLocationId()) missing.push("GCP_LOCATION_ID"); if (!Env.cloudRunServiceUrl()) missing.push("CLOUD_RUN_SERVICE_URL"); if (!Env.cloudRunPrivateServiceUrl()) missing.push("CLOUD_RUN_PRIVATE_SERVICE_URL"); - if (!((Env.cloudTasksServiceAccountEmail() || "") || "")) missing.push("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); + if (!Env.cloudTasksServiceAccountEmail()) missing.push("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); if (!Env.cloudTasksPrAnalysisQueue()) missing.push("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); if (!Env.cloudTasksManualPrAnalysisQueue()) missing.push("CLOUD_TASKS_MANUAL_PR_ANALYSIS_QUEUE"); if (!Env.cloudTasksRepoIndexingQueue()) missing.push("CLOUD_TASKS_REPO_INDEXING_QUEUE"); @@ -175,6 +175,7 @@ export class CloudTasksService { }, // Set dispatch deadline based on job type dispatchDeadline: { + // TODO: increase analysis timeout to 30 minutes seconds: (type === "pr-analysis" || type === "manual-pr-analysis") ? 600 // 10 minutes : type === "bounty-payout" || type === "clear-installation" diff --git a/api/services/contract.service.ts b/api/services/contract.service.ts index 656e1ae..d888d46 100644 --- a/api/services/contract.service.ts +++ b/api/services/contract.service.ts @@ -31,8 +31,8 @@ export class ContractService { // Soroban network configuration loaded from environment variables private static CONFIG = { - network: ((Env.stellarNetwork(true) || "") || ""), - rpcUrl: ((Env.stellarRpcUrl(true) || "") || ""), + network: Env.stellarNetwork(true)!, + rpcUrl: Env.stellarRpcUrl(true)!, networkPassphrase: (Env.stellarNetwork() || "") === "public" ? Networks.PUBLIC : Networks.TESTNET, diff --git a/api/services/kms.service.ts b/api/services/kms.service.ts index 8f58fc2..6460307 100644 --- a/api/services/kms.service.ts +++ b/api/services/kms.service.ts @@ -5,12 +5,12 @@ import { KmsServiceError } from "../models/error.model.js"; import { Env } from "../utils/env.js"; // Verify required environment variables are present -if (!(Env.gcpProjectId() || "") || !Env.gcpLocationId() || !Env.gcpKeyRingId() || !Env.gcpKeyId()) { +if (!Env.gcpProjectId() || !Env.gcpLocationId() || !Env.gcpKeyRingId() || !Env.gcpKeyId()) { throw new KmsServiceError("Missing GCP KMS credentials (GCP_PROJECT_ID, GCP_LOCATION_ID, GCP_KEY_RING_ID, GCP_KEY_ID) in environment variables"); } // Set Google Cloud KMS environment variables -const PROJECT_ID = ((Env.gcpProjectId(true) || "") || ""); +const PROJECT_ID = Env.gcpProjectId(true)!; const LOCATION_ID = Env.gcpLocationId(true)!; const KEY_RING_ID = Env.gcpKeyRingId(true)!; const KEY_ID = Env.gcpKeyId(true)!; diff --git a/api/services/octokit.service.ts b/api/services/octokit.service.ts index b1546a0..9bc141f 100644 --- a/api/services/octokit.service.ts +++ b/api/services/octokit.service.ts @@ -19,7 +19,7 @@ import { LinkedIssue } from "../models/ai-review.model.js"; const commentCTA = `${Env.contributorAppUrl(true)!}/application`; // Verify required environment variables are present -if (!((Env.githubAppId() || "") || "") || !((Env.githubAppPrivateKey() || "") || "")) { +if (!Env.githubAppId() || !Env.githubAppPrivateKey()) { throw new GitHubAPIError("Missing GitHub App credentials (GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEY) in environment variables"); } diff --git a/api/services/stellar.service.ts b/api/services/stellar.service.ts index fb41b20..6da5fc4 100644 --- a/api/services/stellar.service.ts +++ b/api/services/stellar.service.ts @@ -32,8 +32,9 @@ export class StellarService { * The master account is used to sponsor account creation and fund operations. */ constructor() { + const stellarMasterSecretKey = Env.stellarMasterSecretKey(); // Verify required environment variables are present - if (!Env.stellarMasterSecretKey() || !Env.stellarMasterPublicKey()) { + if (!stellarMasterSecretKey) { throw new StellarServiceError("Missing Stellar master account credentials in environment variables"); } @@ -41,7 +42,7 @@ export class StellarService { try { // Create keypair from the master secret key - this.masterAccount = Keypair.fromSecret(Env.stellarMasterSecretKey() || ""); + this.masterAccount = Keypair.fromSecret(stellarMasterSecretKey); } catch (error) { throw new StellarServiceError("Invalid Stellar master account credentials", error); } @@ -221,15 +222,24 @@ export class StellarService { throw new StellarServiceError("Friendbot funding is only available on Testnet"); } + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 10_000); + try { // Request funding from Friendbot - const response = await fetch(`https://friendbot.stellar.org?addr=${encodeURIComponent(accountAddress)}`); + const response = await fetch( + `https://friendbot.stellar.org?addr=${encodeURIComponent(accountAddress)}`, + { signal: controller.signal } + ); + if (!response.ok) { throw new Error(`Friendbot failed with status ${response.status}`); } return "SUCCESS"; } catch (error) { throw new StellarServiceError("Failed to fund wallet", error); + } finally { + clearTimeout(timeout); } } @@ -401,7 +411,7 @@ export class StellarService { sendAsset, destAsset, sendAmount: amount, - destMin: "0.0000001" // For simplicity, accepting any amount of destAsset. + destMin: "0.0000001" })); } @@ -488,7 +498,7 @@ export class StellarService { sendAsset, destAsset, sendAmount: amount, - destMin: "0.0000001" // For simplicity, accepting any amount of destAsset. + destMin: "0.0000001" })); } diff --git a/api/utils/env.ts b/api/utils/env.ts index bb17ce6..20be5e7 100644 --- a/api/utils/env.ts +++ b/api/utils/env.ts @@ -27,9 +27,15 @@ export class Env { static corsOrigins(throwError: boolean = false) { if (throwError) { - return this.getOrThrowError("CORS_ORIGINS").split(","); + return this.getOrThrowError("CORS_ORIGINS") + .split(",") + .map(origin => origin.trim()) + .filter(Boolean); } - return process.env.CORS_ORIGINS?.split(",") || []; + return (process.env.CORS_ORIGINS || "") + .split(",") + .map(origin => origin.trim()) + .filter(Boolean); } static databaseUrl(throwError: boolean = false) { @@ -327,10 +333,19 @@ export class Env { } static port(throwError: boolean = false) { - if (throwError) { - return Number(this.getOrThrowError("PORT")); + const raw = throwError ? this.getOrThrowError("PORT") : process.env.PORT; + const value = Number(raw); + + if (!Number.isInteger(value) || value <= 0) { + throw new ErrorClass( + "SERVER_MISCONFIGURATION", + null, + "Invalid environment variable: PORT", + STATUS_CODES.INTERNAL_SERVER_ERROR + ); } - return Number(process.env.PORT); + + return value; } static contributorAppUrl(throwError: boolean = false) { diff --git a/tests/integration/api/webhook/sumsub.api.test.ts b/tests/integration/api/webhook/sumsub.api.test.ts index 1394f8d..8d86b07 100644 --- a/tests/integration/api/webhook/sumsub.api.test.ts +++ b/tests/integration/api/webhook/sumsub.api.test.ts @@ -201,7 +201,7 @@ describe("Sumsub Webhook API Integration Tests", () => { .set("Content-Type", "application/json") .send(JSON.stringify(payload)); - expect([STATUS_CODES.INTERNAL_SERVER_ERROR, STATUS_CODES.INTERNAL_SERVER_ERROR]).toContain(response.status); + expect([STATUS_CODES.UNAUTHORIZED, STATUS_CODES.INTERNAL_SERVER_ERROR]).toContain(response.status); }); }); });