diff --git a/.env.example b/.env.example index 7e9ba96..8173534 100644 --- a/.env.example +++ b/.env.example @@ -59,5 +59,6 @@ STATSIG_API_KEY= # Other environment variables NODE_ENV=development -PORT=8080 -CONTRIBUTOR_APP_URL="http://localhost:4000" \ No newline at end of file +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/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 diff --git a/api/config/firebase.config.ts b/api/config/firebase.config.ts index 8ff9f0d..c8fc90b 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() || "")?.replace(/\\n/g, "\n") }; admin.initializeApp({ diff --git a/api/config/logger.config.ts b/api/config/logger.config.ts index 816e0a8..81a4c6e 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 = Env.logLevel() || "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 60d5416..b3ed355 100644 --- a/api/config/stellar.config.ts +++ b/api/config/stellar.config.ts @@ -1,37 +1,24 @@ -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"; +import { Env } from "../utils/env.js"; -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 = (Env.stellarNetwork() || "") === "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! + (Env.usdcAssetId(true) || "") ); diff --git a/api/controllers/installation/github.controller.ts b/api/controllers/installation/github.controller.ts index c5f075d..2deda3e 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. @@ -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 f87a970..64c91fc 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"; @@ -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, @@ -191,7 +192,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 +262,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 +367,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 +448,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 3687754..ab9f058 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"; @@ -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 a8b6a73..3b15db6 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"; @@ -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" }); @@ -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, @@ -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 87f3dc0..1b3eb13 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"; /** @@ -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 1875a4f..6615f3a 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"; @@ -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 cc5600f..ef7d9be 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"; @@ -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 7ef32b5..4093084 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"; @@ -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 0937e34..c13d338 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"; @@ -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 30972d7..e34ec9d 100644 --- a/api/controllers/user/index.controller.ts +++ b/api/controllers/user/index.controller.ts @@ -2,14 +2,15 @@ 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"; 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 ); @@ -154,7 +155,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 +273,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 }); } @@ -316,10 +317,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 } ); @@ -327,7 +328,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 } @@ -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; @@ -355,18 +356,18 @@ 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({ 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 +378,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 +438,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 cbd78e5..9a49f72 100644 --- a/api/controllers/user/sumsub.controller.ts +++ b/api/controllers/user/sumsub.controller.ts @@ -1,10 +1,11 @@ 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"; +import { Env } from "../../utils/env.js"; /** * Generate Sumsub SDK access token @@ -17,16 +18,16 @@ 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" }); } - 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"; @@ -63,13 +64,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 +84,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 0356eae..bdfacf0 100644 --- a/api/controllers/wallet/index.controller.ts +++ b/api/controllers/wallet/index.controller.ts @@ -1,14 +1,15 @@ 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"; +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"; import { statsigService } from "../../services/statsig.service.js"; +import { Env } from "../../utils/env.js"; type USDCBalance = HorizonApi.BalanceLineAsset<"credit_alphanum12">; @@ -135,20 +136,20 @@ 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 )); } 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, destinationAddress, - assetType === "USDC" ? usdcAssetId : xlmAssetId, - assetType === "USDC" ? usdcAssetId : xlmAssetId, + assetType === "USDC" ? usdcAsset : xlmAsset, + assetType === "USDC" ? usdcAsset : xlmAsset, amount, memo )); @@ -180,7 +181,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" }); @@ -287,8 +288,8 @@ export const swapAsset = async (req: Request, res: Response, next: NextFunction) result = await stellarService.swapAsset( walletSecret, amount, - usdcAssetId, - xlmAssetId + usdcAsset, + xlmAsset ); } @@ -319,7 +320,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 +353,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 3998554..a1f6e52 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"; @@ -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 2f09a9f..a78cd83 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"; @@ -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 153ae42..6fb84e6 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"; @@ -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 30811c0..bc67a02 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 "./utilities/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,24 +41,24 @@ const httpServer = createServer(app); SocketService.initialize(httpServer); // Define port -const PORT = process.env.NODE_ENV === "development" - ? 5000 - : (Number(process.env.PORT) || 8080); +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 || ALLOWED_ORIGINS.includes(origin)) { + if (!origin || allowedOrigins.includes(origin)) { return callback(null, true); } callback(new ErrorClass( "CORS_ERROR", null, "Not allowed by CORS", - STATUS_CODES.UNAUTHORIZED + STATUS_CODES.FORBIDDEN )); }, exposedHeaders: ["Payment-Required", "Payment-Response"] @@ -78,7 +79,7 @@ app.use( // General API Middleware app.use(apiLimiter); -app.use(express.json()); +app.use(express.json({ limit: "10mb" })); // User routes app.use( @@ -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 924db55..9717795 100644 --- a/api/middlewares/auth.middleware.ts +++ b/api/middlewares/auth.middleware.ts @@ -1,11 +1,12 @@ 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"; +import { Env } from "../utils/env.js"; // Google OAuth2 client used to verify OIDC tokens. const authClient = new OAuth2Client(); @@ -40,7 +41,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 +50,7 @@ export const validateUser = async (req: Request, res: Response, next: NextFuncti "AUTHENTICATION_FAILED", null, "No authorization token sent", - STATUS_CODES.UNAUTHENTICATED + STATUS_CODES.UNAUTHORIZED )); } }; @@ -92,13 +93,15 @@ 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 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 @@ -109,19 +112,10 @@ export const validateCloudTasksRequest = async (req: Request, _res: Response, ne const token = authHeader.split("Bearer ")[1]; - if (!process.env.CLOUD_RUN_SERVICE_URL) { - throw new ErrorClass( - "SERVER_MISCONFIGURATION", - null, - "Server misconfiguration: CLOUD_RUN_SERVICE_URL is missing", - STATUS_CODES.SERVER_ERROR - ); - } - // Verify the OIDC token const ticket = await authClient.verifyIdToken({ idToken: token, - audience: process.env.CLOUD_RUN_SERVICE_URL + audience: cloudRunServiceUrl }); const payload = ticket.getPayload(); @@ -130,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/middlewares/error.middleware.ts b/api/middlewares/error.middleware.ts index ff95796..466f35e 100644 --- a/api/middlewares/error.middleware.ts +++ b/api/middlewares/error.middleware.ts @@ -1,9 +1,10 @@ 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"; +import { Env } from "../utils/env.js"; /** * Centralized error handling middleware @@ -22,11 +23,11 @@ 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") { - 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 +36,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 +44,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 +52,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 12f2dd1..9aa40b9 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"; /** @@ -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 7c98451..ba76270 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 @@ -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 13df60e..dae5518 100644 --- a/api/middlewares/webhook.middleware.ts +++ b/api/middlewares/webhook.middleware.ts @@ -2,9 +2,10 @@ 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"; +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"); @@ -73,7 +74,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 +86,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 +103,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 +115,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 +132,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 +144,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 +155,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 +205,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 +227,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 +241,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 +264,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 +276,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 +288,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 +304,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 +319,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 } @@ -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 0211972..1e81167 100644 --- a/api/models/error.model.ts +++ b/api/models/error.model.ts @@ -1,4 +1,5 @@ -import { STATUS_CODES } from "../utilities/data.js"; +import { STATUS_CODES } from "../utils/data.js"; +import { Env } from "../utils/env.js"; /** * Base error class for general api errors @@ -14,7 +15,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 +48,7 @@ export class AuthorizationError extends ErrorClass { "UNAUTHORIZED", details, message, - STATUS_CODES.UNAUTHORIZED + STATUS_CODES.FORBIDDEN ); } } @@ -61,7 +62,7 @@ export class ValidationError extends ErrorClass { "VALIDATION_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.BAD_REQUEST ); } } @@ -78,7 +79,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 +117,7 @@ export class KmsServiceError extends ErrorClass { "KMS_SERVICE_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -130,7 +131,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 +145,7 @@ export class EscrowContractError extends ErrorClass { "ESCROW_CONTRACT_ERROR", ErrorUtils.extractAxiosErrorData(details), message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -159,7 +160,7 @@ export class GeminiServiceError extends AIReviewError { details, message, retryable, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -215,7 +216,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; @@ -225,13 +226,13 @@ 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", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -246,7 +247,7 @@ export class GitHubWebhookError extends AIReviewError { details, message, false, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -261,7 +262,7 @@ export class SumsubWebhookError extends AIReviewError { details, message, false, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -275,7 +276,7 @@ export class CloudTasksError extends ErrorClass { "CLOUD_TASKS_ERROR", details, message, - STATUS_CODES.SERVER_ERROR + STATUS_CODES.INTERNAL_SERVER_ERROR ); } } @@ -315,7 +316,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; @@ -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_/contract.test.route.ts b/api/routes/_test_/contract.test.route.ts index ca3b55f..e0cf193 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.OK).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.OK).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.OK).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.OK).json({ message: "Bounty decreased successfully", data: result }); @@ -187,7 +188,7 @@ router.post("/task/approve", taskId ); - res.status(200).json({ + res.status(STATUS_CODES.OK).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.OK).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.OK).json({ message: "Dispute resolved successfully", data: result }); @@ -275,7 +276,7 @@ router.post("/escrow/refund", taskId ); - res.status(200).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 148fd19..8b69fa4 100644 --- a/api/routes/_test_/general.test.route.ts +++ b/api/routes/_test_/general.test.route.ts @@ -6,10 +6,11 @@ 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 "../../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(); @@ -26,7 +27,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 +45,7 @@ router.post("/encryption", // Decrypt to verify const decrypted = await KMSService.decryptWallet(encrypted as any); - res.status(200).json({ + res.status(STATUS_CODES.OK).json({ message: "Encryption test successful", data: { original: text, @@ -54,7 +55,7 @@ router.post("/encryption", } }); } catch (error) { - next(createError(500, "Encryption test failed", { cause: error })); + next(error); } }) as RequestHandler ); @@ -77,7 +78,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.OK).json({ message: "Decryption test successful", data: { original: walletData, @@ -87,7 +88,7 @@ router.post("/decryption", } }); } catch (error) { - next(createError(500, "Decryption test failed", { cause: error })); + next(error); } }) as RequestHandler ); @@ -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, @@ -127,9 +128,9 @@ 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(createError(500, "Failed to create packages", { cause: error })); + next(error); } }); @@ -151,11 +152,9 @@ 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.SUCCESS, + status: STATUS_CODES.OK, data: {}, message: "Database cleared" }); @@ -163,7 +162,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 e410102..a3c4422 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(); @@ -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 6193eb4..3359200 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 { @@ -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(); @@ -21,11 +22,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({ + res.status(STATUS_CODES.CREATED).json({ message: "Wallet created successfully", - data: { wallet, security } + data: wallet }); } catch (error) { next(error); @@ -39,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 }); @@ -56,7 +56,7 @@ router.post("/trustline", try { const { secretKey } = req.body; await stellarService.addTrustLine(secretKey); - res.status(200).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(200).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(200).json({ + res.status(STATUS_CODES.OK).json({ message: "Wallet funded successfully" }); } catch (error) { @@ -105,11 +105,11 @@ router.post("/transfer", const result = await stellarService.transferAsset( sourceSecret, destinationAddress, - xlmAssetId, - xlmAssetId, + xlmAsset, + xlmAsset, amount ); - res.status(200).json({ + res.status(STATUS_CODES.OK).json({ message: "Asset transferred successfully", data: result }); @@ -129,11 +129,11 @@ router.post("/transfer/sponsor", sponsorSecret, accountSecret, destinationAddress, - usdcAssetId, - usdcAssetId, + xlmAsset, + xlmAsset, amount ); - res.status(200).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(200).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(200).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(200).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(200).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(200).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(200).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(200).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 fb2b2e7..4cb0a54 100644 --- a/api/routes/agent.route.ts +++ b/api/routes/agent.route.ts @@ -3,24 +3,27 @@ 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"; +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() || "", + 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" @@ -76,7 +79,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 +92,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/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/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 = { diff --git a/api/services/cloud-tasks.service.ts b/api/services/cloud-tasks.service.ts index 8298482..ea0b4dd 100644 --- a/api/services/cloud-tasks.service.ts +++ b/api/services/cloud-tasks.service.ts @@ -1,18 +1,19 @@ 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"; -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"; /** @@ -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(", ")}`); } @@ -176,10 +175,11 @@ 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" - || type === "clear-repo" + || type === "clear-installation" + || type === "clear-repo" ? 300 // 5 minutes : 1800 // 30 minutes (indexing) } diff --git a/api/services/contract.service.ts b/api/services/contract.service.ts index a2a6540..d888d46 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/github-webhook/installation-webhook.service.ts b/api/services/github-webhook/installation-webhook.service.ts index 9b79a96..80b28bf 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"; @@ -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 aa2cdf0..c619c3b 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"; @@ -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 11db9c3..2e99b50 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"; @@ -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" }); @@ -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,17 +514,22 @@ 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( "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 acd811a..cccf263 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"; @@ -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 8ae7e5c..4ae6770 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"; @@ -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/services/kms.service.ts b/api/services/kms.service.ts index 76d1ad7..6460307 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 a5977ea..9bc141f 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, @@ -10,26 +11,26 @@ 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"; -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 567b85b..527fb27 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 "../utilities/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")); @@ -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/services/statsig.service.ts b/api/services/statsig.service.ts index 44fa0a2..83dbbe6 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(); 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 8c980c1..6da5fc4 100644 --- a/api/services/stellar.service.ts +++ b/api/services/stellar.service.ts @@ -1,17 +1,20 @@ -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"; +import { Env } from "../utils/env.js"; /** * Service for managing Stellar blockchain operations. @@ -21,7 +24,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; /** @@ -29,44 +32,22 @@ 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 (!process.env.STELLAR_MASTER_SECRET_KEY || !process.env.STELLAR_MASTER_PUBLIC_KEY) { + if (!stellarMasterSecretKey) { 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(stellarMasterSecretKey); } 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 +89,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 +151,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,38 +221,56 @@ export class StellarService { if (this.isMainnet) { 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 - await stellar.fundTestnetAccount(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); } } /** * 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 +299,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 +337,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 +366,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 +375,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" + })); } + 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 +450,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 +460,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" + })); } + 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 +552,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 +599,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 +644,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 +675,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 +687,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/api/utilities/data.ts b/api/utils/data.ts similarity index 90% rename from api/utilities/data.ts rename to api/utils/data.ts index ddff84b..b557a14 100644 --- a/api/utilities/data.ts +++ b/api/utils/data.ts @@ -1,51 +1,41 @@ -/** - * 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. */ 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/api/utils/env.ts b/api/utils/env.ts new file mode 100644 index 0000000..20be5e7 --- /dev/null +++ b/api/utils/env.ts @@ -0,0 +1,357 @@ +import { ErrorClass } from "../models/error.model.js"; +import { STATUS_CODES } from "./data.js"; + +/** + * Env class to get environment variables + */ +export class Env { + private static getOrThrowError(key: string) { + const value = process.env[key]; + if (!value) { + throw new ErrorClass( + "SERVER_MISCONFIGURATION", + null, + `Missing environment variable: ${key}`, + STATUS_CODES.INTERNAL_SERVER_ERROR + ); + } + return value; + } + + static nodeEnv(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("NODE_ENV"); + } + return process.env.NODE_ENV; + } + + static corsOrigins(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CORS_ORIGINS") + .split(",") + .map(origin => origin.trim()) + .filter(Boolean); + } + return (process.env.CORS_ORIGINS || "") + .split(",") + .map(origin => origin.trim()) + .filter(Boolean); + } + + static databaseUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("DATABASE_URL"); + } + return process.env.DATABASE_URL; + } + + static firebaseProjectId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("FIREBASE_PROJECT_ID"); + } + return process.env.FIREBASE_PROJECT_ID; + } + + static firebasePrivateKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("FIREBASE_PRIVATE_KEY"); + } + return process.env.FIREBASE_PRIVATE_KEY; + } + + static firebaseClientEmail(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("FIREBASE_CLIENT_EMAIL"); + } + return process.env.FIREBASE_CLIENT_EMAIL; + } + + static githubAccessToken(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GITHUB_ACCESS_TOKEN"); + } + return process.env.GITHUB_ACCESS_TOKEN; + } + + static githubAppId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GITHUB_APP_ID"); + } + return process.env.GITHUB_APP_ID; + } + + static githubAppPrivateKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GITHUB_APP_PRIVATE_KEY"); + } + return process.env.GITHUB_APP_PRIVATE_KEY; + } + + static githubWebhookSecret(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GITHUB_WEBHOOK_SECRET"); + } + return process.env.GITHUB_WEBHOOK_SECRET; + } + + static stellarNetwork(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("STELLAR_NETWORK"); + } + return process.env.STELLAR_NETWORK; + } + + static stellarHorizonUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("STELLAR_HORIZON_URL"); + } + return process.env.STELLAR_HORIZON_URL; + } + + static stellarRpcUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("STELLAR_RPC_URL"); + } + return process.env.STELLAR_RPC_URL; + } + + static stellarMasterPublicKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("STELLAR_MASTER_PUBLIC_KEY"); + } + return process.env.STELLAR_MASTER_PUBLIC_KEY; + } + + static stellarMasterSecretKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("STELLAR_MASTER_SECRET_KEY"); + } + return process.env.STELLAR_MASTER_SECRET_KEY; + } + + static taskEscrowContractId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("TASK_ESCROW_CONTRACT_ID"); + } + return process.env.TASK_ESCROW_CONTRACT_ID; + } + + static usdcContractId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("USDC_CONTRACT_ID"); + } + return process.env.USDC_CONTRACT_ID; + } + + static usdcAssetId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("USDC_ASSET_ID"); + } + return process.env.USDC_ASSET_ID; + } + + static maxFee(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("MAX_FEE"); + } + return process.env.MAX_FEE; + } + + static x402PayeeAddress(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("X402_PAYEE_ADDRESS"); + } + return process.env.X402_PAYEE_ADDRESS; + } + + static x402FacilitatorUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("X402_FACILITATOR_URL"); + } + return process.env.X402_FACILITATOR_URL; + } + + static x402ApiKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("X402_API_KEY"); + } + return process.env.X402_API_KEY; + } + + static gcpProjectId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GCP_PROJECT_ID"); + } + return process.env.GCP_PROJECT_ID; + } + + static gcpLocationId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GCP_LOCATION_ID"); + } + return process.env.GCP_LOCATION_ID; + } + + static gcpKeyRingId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GCP_KEY_RING_ID"); + } + return process.env.GCP_KEY_RING_ID; + } + + static gcpKeyId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("GCP_KEY_ID"); + } + return process.env.GCP_KEY_ID; + } + + static cloudTasksPrAnalysisQueue(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_PR_ANALYSIS_QUEUE"); + } + return process.env.CLOUD_TASKS_PR_ANALYSIS_QUEUE; + } + + 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; + } + + static cloudTasksRepoIndexingQueue(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_REPO_INDEXING_QUEUE"); + } + return process.env.CLOUD_TASKS_REPO_INDEXING_QUEUE; + } + + static cloudTasksIncrementalIndexingQueue(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE"); + } + return process.env.CLOUD_TASKS_INCREMENTAL_INDEXING_QUEUE; + } + + static cloudTasksBountyPayoutQueue(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE"); + } + return process.env.CLOUD_TASKS_BOUNTY_PAYOUT_QUEUE; + } + + static cloudTasksClearInstallationQueue(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE"); + } + return process.env.CLOUD_TASKS_CLEAR_INSTALLATION_QUEUE; + } + + static cloudTasksClearRepoQueue(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_CLEAR_REPO_QUEUE"); + } + return process.env.CLOUD_TASKS_CLEAR_REPO_QUEUE; + } + + static cloudRunServiceUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_RUN_SERVICE_URL"); + } + return process.env.CLOUD_RUN_SERVICE_URL; + } + + static cloudRunPrivateServiceUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_RUN_PRIVATE_SERVICE_URL"); + } + return process.env.CLOUD_RUN_PRIVATE_SERVICE_URL; + } + + static cloudTasksServiceAccountEmail(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL"); + } + return process.env.CLOUD_TASKS_SERVICE_ACCOUNT_EMAIL; + } + + static defaultSubscriptionPackageId(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("DEFAULT_SUBSCRIPTION_PACKAGE_ID"); + } + return process.env.DEFAULT_SUBSCRIPTION_PACKAGE_ID; + } + + static sumsubAppToken(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("SUMSUB_APP_TOKEN"); + } + return process.env.SUMSUB_APP_TOKEN; + } + + static sumsubSecretKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("SUMSUB_SECRET_KEY"); + } + return process.env.SUMSUB_SECRET_KEY; + } + + static sumsubWebhookSecret(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("SUMSUB_WEBHOOK_SECRET"); + } + return process.env.SUMSUB_WEBHOOK_SECRET; + } + + static sumsubLevelName(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("SUMSUB_LEVEL_NAME"); + } + return process.env.SUMSUB_LEVEL_NAME; + } + + static sumsubBaseUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("SUMSUB_BASE_URL"); + } + return process.env.SUMSUB_BASE_URL; + } + + static logLevel(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("LOG_LEVEL"); + } + return process.env.LOG_LEVEL; + } + + static statsigApiKey(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("STATSIG_API_KEY"); + } + return process.env.STATSIG_API_KEY; + } + + static port(throwError: boolean = false) { + 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 value; + } + + static contributorAppUrl(throwError: boolean = false) { + if (throwError) { + return this.getOrThrowError("CONTRIBUTOR_APP_URL"); + } + return process.env.CONTRIBUTOR_APP_URL; + } +} 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/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", 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"; 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/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..aa3b7e0 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"; @@ -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 7af44fc..5badbe8 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"; @@ -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 755694b..b46a444 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"; @@ -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 f60882b..bd4bd21 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); @@ -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 bae9ec9..64e2b08 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"; @@ -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 c426c85..67bd879 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"; @@ -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 cd2757f..7a0a379 100644 --- a/tests/integration/api/task/index.api.test.ts +++ b/tests/integration/api/task/index.api.test.ts @@ -6,10 +6,9 @@ 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"; 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 7f3b56d..a48dc2b 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"; @@ -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 659a3f2..3c51f41 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"; @@ -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 6728a20..bab4994 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"; @@ -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 5ac4e8c..5911286 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"; @@ -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 b729993..14a006c 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"; @@ -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 8454235..824aea5 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"; @@ -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 fbb124c..fead0fd 100644 --- a/tests/integration/api/webhook/github.api.test.ts +++ b/tests/integration/api/webhook/github.api.test.ts @@ -6,10 +6,9 @@ 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"; // 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 38dbc98..8d86b07 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"; @@ -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.UNAUTHORIZED, 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 7bcc55c..01b731c 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", () => { @@ -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 b222885..7bf50c1 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: { @@ -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 7d28b09..8473df3 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; @@ -15,25 +15,29 @@ 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.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(200).json({ message: "success" }); }); + app.get(`${ENDPOINTS.WEBHOOK.PREFIX}/test-skip`, (_req: Request, res: Response) => { + res.status(STATUS_CODES.OK).json({ message: "success" }); + }); const checks = []; for (let i = 0; i < 20; i++) { checks.push( request(app) .get(`${ENDPOINTS.WEBHOOK.PREFIX}/test-skip`) - .expect(STATUS_CODES.SUCCESS) + .expect(STATUS_CODES.OK) ); } await Promise.all(checks); @@ -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.OK).json({ message: "success" }); }); // Limit is 300. const limit = 310; @@ -57,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; @@ -69,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); @@ -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.OK).json({ message: "success" }); }); // Limit is 300. const limit = 310; @@ -94,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; @@ -105,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 6037891..a60165d 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; @@ -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 917851d..beb7326 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"; @@ -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(); }); }); 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", () => {