test: use mongodb testcontainer (@fehmer) (#6808)

This commit is contained in:
Christian Fehmer 2025-08-04 15:10:41 +02:00 committed by GitHub
parent 5af3a81467
commit d9009e51cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 446 additions and 372 deletions

View file

@ -3,10 +3,8 @@ import { ObjectId } from "mongodb";
import * as UserDal from "../../../src/dal/user";
import * as LeaderboardsDal from "../../../src/dal/leaderboards";
import * as PublicDal from "../../../src/dal/public";
import * as Configuration from "../../../src/init/configuration";
import type { DBLeaderboardEntry } from "../../../src/dal/leaderboards";
import type { PersonalBest } from "@monkeytype/schemas/shared";
const configuration = Configuration.getCachedConfiguration();
import * as DB from "../../../src/init/db";
import { LbPersonalBests } from "../../../src/utils/pb";
@ -14,6 +12,9 @@ import { describeIntegration } from "..";
import { pb } from "../../__testData__/users";
describeIntegration()("LeaderboardsDal", () => {
afterEach(async () => {
await DB.collection("users").deleteMany({});
});
describe("update", () => {
it("should ignore unapplicable users on leaderboard", async () => {
//GIVEN
@ -216,22 +217,24 @@ describeIntegration()("LeaderboardsDal", () => {
]);
});
it("should create leaderboard with premium", async () => {
await enablePremiumFeatures(true);
//TODO figure out why premium with expireTimestamp is not working
it.skip("should create leaderboard with premium", async () => {
//GIVEN
const noPremium = await createUser(lbBests(pb(4)));
const lifetime = await createUser(lbBests(pb(3)), premium(-1));
const validPremium = await createUser(lbBests(pb(2)), premium(10));
const validPremium = await createUser(lbBests(pb(2)), premium(1000));
const expiredPremium = await createUser(lbBests(pb(1)), premium(-10));
//WHEN
await LeaderboardsDal.update("time", "15", "english");
const result = (await LeaderboardsDal.get(
"time",
"15",
"english",
0,
50
50,
true
)) as DBLeaderboardEntry[];
//THEN
@ -253,7 +256,6 @@ describeIntegration()("LeaderboardsDal", () => {
]);
});
it("should create leaderboard without premium if feature disabled", async () => {
await enablePremiumFeatures(false);
//GIVEN
// const lifetime = await createUser(lbBests(pb(3)), premium(-1));
@ -264,7 +266,8 @@ describeIntegration()("LeaderboardsDal", () => {
"15",
"english",
0,
50
50,
false
)) as DBLeaderboardEntry[];
//THEN
@ -348,13 +351,3 @@ type ExpectedLbEntry = {
badgeId?: number;
isPremium?: boolean;
};
async function enablePremiumFeatures(premium: boolean): Promise<void> {
const mockConfig = _.merge(await configuration, {
users: { premium: { enabled: premium } },
});
vi.spyOn(Configuration, "getCachedConfiguration").mockResolvedValue(
mockConfig
);
}

View file

@ -7,12 +7,12 @@ import { PersonalBest, PersonalBests } from "@monkeytype/schemas/shared";
import { CustomThemeColors } from "@monkeytype/schemas/configs";
import { describeIntegration } from "..";
const mockPersonalBest = {
const mockPersonalBest: PersonalBest = {
acc: 1,
consistency: 1,
difficulty: "normal" as const,
lazyMode: true,
language: "no",
language: "polish",
punctuation: false,
raw: 230,
wpm: 215,
@ -86,18 +86,19 @@ const mockResultFilter: ResultFilters = {
const mockDbResultFilter = { ...mockResultFilter, _id: new ObjectId() };
describeIntegration()("UserDal", () => {
describeIntegration().sequential("UserDal", () => {
it("should be able to insert users", async () => {
// given
const uid = new ObjectId().toHexString();
const newUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
uid,
};
// when
await UserDAL.addUser(newUser.name, newUser.email, newUser.uid);
const insertedUser = await UserDAL.getUser("userId", "test");
const insertedUser = await UserDAL.getUser(newUser.uid, "test");
// then
expect(insertedUser.email).toBe(newUser.email);
@ -107,10 +108,11 @@ describeIntegration()("UserDal", () => {
it("should error if the user already exists", async () => {
// given
const uid = new ObjectId().toHexString();
const newUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
uid: uid,
};
// when
@ -125,23 +127,23 @@ describeIntegration()("UserDal", () => {
it("isNameAvailable should correctly check if a username is available", async () => {
// given
await UserDAL.addUser("user1", "user1@email.com", "userId1");
await UserDAL.addUser("user2", "user2@email.com", "userId2");
const { uid: user1 } = await UserTestData.createUser({ name: "user1" });
await UserTestData.createUser({ name: "user2" });
const testCases = [
{
name: "user1",
whosChecking: "userId1",
whosChecking: user1,
expected: true,
},
{
name: "USER1",
whosChecking: "userId1",
whosChecking: user1,
expected: true,
},
{
name: "user2",
whosChecking: "userId1",
whosChecking: user1,
expected: false,
},
];
@ -155,57 +157,35 @@ describeIntegration()("UserDal", () => {
it("updatename should not allow unavailable usernames", async () => {
// given
const mockUsers = [...Array(3).keys()]
.map((id) => ({
name: `Test${id}`,
email: `mockemail@email.com${id}`,
uid: `userId${id}`,
}))
.map(({ name, email, uid }) => UserDAL.addUser(name, email, uid));
await Promise.all(mockUsers);
const userToUpdateNameFor = await UserDAL.getUser("userId0", "test");
const userWithNameTaken = await UserDAL.getUser("userId1", "test");
const user1 = await UserTestData.createUser({ name: "bob" });
const user2 = await UserTestData.createUser({ name: "kevin" });
const _decoy = await UserTestData.createUser();
// when, then
await expect(
UserDAL.updateName(
userToUpdateNameFor.uid,
userWithNameTaken.name,
userToUpdateNameFor.name
)
UserDAL.updateName(user1.uid, user2.name, user1.name)
).rejects.toThrow("Username already taken");
});
it("same usernames (different casing) should be available only for the same user", async () => {
await UserDAL.addUser("User1", "user1@test.com", "uid1");
const user1 = await UserTestData.createUser({ name: "bob" });
const user2 = await UserTestData.createUser({ name: "kevin" });
await UserDAL.addUser("User2", "user2@test.com", "uid2");
await UserDAL.updateName(user1.uid, "BOB", user1.name);
const user1 = await UserDAL.getUser("uid1", "test");
const user2 = await UserDAL.getUser("uid2", "test");
await UserDAL.updateName(user1.uid, "user1", user1.name);
const updatedUser1 = await UserDAL.getUser("uid1", "test");
const updatedUser1 = await UserDAL.getUser(user1.uid, "test");
// when, then
expect(updatedUser1.name).toBe("user1");
expect(updatedUser1.name).toBe("BOB");
await expect(
UserDAL.updateName(user2.uid, "USER1", user2.name)
UserDAL.updateName(user2.uid, "bob", user2.name)
).rejects.toThrow("Username already taken");
});
it("UserDAL.updateName should change the name of a user", async () => {
// given
const testUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
};
await UserDAL.addUser(testUser.name, testUser.email, testUser.uid);
const testUser = await UserTestData.createUser({ name: "bob" });
// when
await UserDAL.updateName(testUser.uid, "renamedTestUser", testUser.name);
@ -217,12 +197,7 @@ describeIntegration()("UserDal", () => {
it("clearPb should clear the personalBests of a user", async () => {
// given
const testUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
};
await UserDAL.addUser(testUser.name, testUser.email, testUser.uid);
const testUser = await UserTestData.createUser({ name: "bob" });
await UserDAL.getUsersCollection().updateOne(
{ uid: testUser.uid },
{
@ -259,13 +234,7 @@ describeIntegration()("UserDal", () => {
it("autoBan should automatically ban after configured anticheat triggers", async () => {
// given
const testUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
};
await UserDAL.addUser(testUser.name, testUser.email, testUser.uid);
const testUser = await UserTestData.createUser({ name: "bob" });
// when
Date.now = vi.fn(() => 0);
@ -281,13 +250,7 @@ describeIntegration()("UserDal", () => {
it("autoBan should not ban ban if triggered once", async () => {
// given
const testUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
};
await UserDAL.addUser(testUser.name, testUser.email, testUser.uid);
const testUser = await UserTestData.createUser({ name: "bob" });
// when
Date.now = vi.fn(() => 0);
@ -301,13 +264,7 @@ describeIntegration()("UserDal", () => {
it("autoBan should correctly remove old anticheat triggers", async () => {
// given
const testUser = {
name: "Test",
email: "mockemail@email.com",
uid: "userId",
};
await UserDAL.addUser(testUser.name, testUser.email, testUser.uid);
const testUser = await UserTestData.createUser({ name: "bob" });
// when
Date.now = vi.fn(() => 0);
@ -656,10 +613,11 @@ describeIntegration()("UserDal", () => {
});
it("updateProfile should appropriately handle multiple profile updates", async () => {
await UserDAL.addUser("test name", "test email", "TestID");
const uid = new ObjectId().toHexString();
await UserDAL.addUser("test name", "test email", uid);
await UserDAL.updateProfile(
"TestID",
uid,
{
bio: "test bio",
},
@ -668,7 +626,7 @@ describeIntegration()("UserDal", () => {
}
);
const user = await UserDAL.getUser("TestID", "test add result filters");
const user = await UserDAL.getUser(uid, "test add result filters");
expect(user.profileDetails).toStrictEqual({
bio: "test bio",
});
@ -677,7 +635,7 @@ describeIntegration()("UserDal", () => {
});
await UserDAL.updateProfile(
"TestID",
uid,
{
keyboard: "test keyboard",
socialProfiles: {
@ -694,10 +652,7 @@ describeIntegration()("UserDal", () => {
}
);
const updatedUser = await UserDAL.getUser(
"TestID",
"test add result filters"
);
const updatedUser = await UserDAL.getUser(uid, "test add result filters");
expect(updatedUser.profileDetails).toStrictEqual({
bio: "test bio",
keyboard: "test keyboard",
@ -715,7 +670,7 @@ describeIntegration()("UserDal", () => {
});
await UserDAL.updateProfile(
"TestID",
uid,
{
bio: "test bio 2",
socialProfiles: {
@ -732,10 +687,7 @@ describeIntegration()("UserDal", () => {
}
);
const updatedUser2 = await UserDAL.getUser(
"TestID",
"test add result filters"
);
const updatedUser2 = await UserDAL.getUser(uid, "test add result filters");
expect(updatedUser2.profileDetails).toStrictEqual({
bio: "test bio 2",
keyboard: "test keyboard",
@ -755,10 +707,11 @@ describeIntegration()("UserDal", () => {
});
it("resetUser should reset user", async () => {
await UserDAL.addUser("test name", "test email", "TestID");
const uid = new ObjectId().toHexString();
await UserDAL.addUser("test name", "test email", uid);
await UserDAL.updateProfile(
"TestID",
uid,
{
bio: "test bio",
keyboard: "test keyboard",
@ -772,14 +725,11 @@ describeIntegration()("UserDal", () => {
}
);
await UserDAL.incrementBananas("TestID", 100);
await UserDAL.incrementXp("TestID", 15);
await UserDAL.incrementBananas(uid, 100);
await UserDAL.incrementXp(uid, 15);
await UserDAL.resetUser("TestID");
const resetUser = await UserDAL.getUser(
"TestID",
"test add result filters"
);
await UserDAL.resetUser(uid);
const resetUser = await UserDAL.getUser(uid, "test add result filters");
expect(resetUser.profileDetails).toStrictEqual({
bio: "",
@ -801,14 +751,15 @@ describeIntegration()("UserDal", () => {
});
it("getInbox should return the user's inbox", async () => {
await UserDAL.addUser("test name", "test email", "TestID");
const uid = new ObjectId().toHexString();
await UserDAL.addUser("test name", "test email", uid);
const emptyInbox = await UserDAL.getInbox("TestID");
const emptyInbox = await UserDAL.getInbox(uid);
expect(emptyInbox).toStrictEqual([]);
await UserDAL.addToInbox(
"TestID",
uid,
[
{
subject: `Hello!`,
@ -820,7 +771,7 @@ describeIntegration()("UserDal", () => {
}
);
const inbox = await UserDAL.getInbox("TestID");
const inbox = await UserDAL.getInbox(uid);
expect(inbox).toStrictEqual([
{
@ -830,7 +781,8 @@ describeIntegration()("UserDal", () => {
});
it("addToInbox discards mail if inbox is full", async () => {
await UserDAL.addUser("test name", "test email", "TestID");
const uid = new ObjectId().toHexString();
await UserDAL.addUser("test name", "test email", uid);
const config = {
enabled: true,
@ -838,7 +790,7 @@ describeIntegration()("UserDal", () => {
};
await UserDAL.addToInbox(
"TestID",
uid,
[
{
subject: "Hello 1!",
@ -848,7 +800,7 @@ describeIntegration()("UserDal", () => {
);
await UserDAL.addToInbox(
"TestID",
uid,
[
{
subject: "Hello 2!",
@ -857,7 +809,7 @@ describeIntegration()("UserDal", () => {
config
);
const inbox = await UserDAL.getInbox("TestID");
const inbox = await UserDAL.getInbox(uid);
expect(inbox).toStrictEqual([
{
@ -867,13 +819,13 @@ describeIntegration()("UserDal", () => {
});
it("addToInboxBulk should add mail to multiple users", async () => {
await UserDAL.addUser("test name", "test email", "TestID");
await UserDAL.addUser("test name 2", "test email 2", "TestID2");
const { uid: user1 } = await UserTestData.createUser();
const { uid: user2 } = await UserTestData.createUser();
await UserDAL.addToInboxBulk(
[
{
uid: "TestID",
uid: user1,
mail: [
{
subject: `Hello!`,
@ -881,7 +833,7 @@ describeIntegration()("UserDal", () => {
],
},
{
uid: "TestID2",
uid: user2,
mail: [
{
subject: `Hello 2!`,
@ -895,8 +847,8 @@ describeIntegration()("UserDal", () => {
}
);
const inbox = await UserDAL.getInbox("TestID");
const inbox2 = await UserDAL.getInbox("TestID2");
const inbox = await UserDAL.getInbox(user1);
const inbox2 = await UserDAL.getInbox(user2);
expect(inbox).toStrictEqual([
{
@ -955,7 +907,7 @@ describeIntegration()("UserDal", () => {
const streak = await UserDAL.updateStreak(uid, milis);
await expect(streak).toBe(expectedStreak);
expect(streak).toBe(expectedStreak);
}
});
@ -1013,7 +965,7 @@ describeIntegration()("UserDal", () => {
const streak = await UserDAL.updateStreak(uid, milis);
await expect(streak).toBe(expectedStreak);
expect(streak).toBe(expectedStreak);
}
});
@ -1055,7 +1007,7 @@ describeIntegration()("UserDal", () => {
const streak = await UserDAL.updateStreak(uid, milis);
await expect(streak).toBe(expectedStreak);
expect(streak).toBe(expectedStreak);
}
});
});

View file

@ -1,17 +1,8 @@
import { Collection, Db, MongoClient, WithId } from "mongodb";
import { afterAll, beforeAll, afterEach } from "vitest";
import * as MongoDbMock from "vitest-mongodb";
import { MongoDbMockConfig } from "../global-setup";
import { isIntegrationTest } from ".";
import { setupCommonMocks } from "../setup-common-mocks";
process.env["MODE"] = "dev";
//process.env["MONGOMS_DISTRO"] = "ubuntu-22.04";
if (!isIntegrationTest) {
console.error("wrong environment");
process.exit();
}
if (!process.env["REDIS_URI"]) {
// use mock if not set
@ -20,15 +11,9 @@ if (!process.env["REDIS_URI"]) {
let db: Db;
let client: MongoClient;
const collectionsForCleanUp = ["users"];
beforeAll(async () => {
//don't add any configuration here, add to global-setup.ts instead.
console.log("integration setup mongo");
await MongoDbMock.setup(MongoDbMockConfig);
client = new MongoClient(globalThis.__MONGO_URI__);
client = new MongoClient(process.env["TEST_DB_URL"] as string);
await client.connect();
db = client.db();
@ -41,22 +26,16 @@ beforeAll(async () => {
//
},
}));
setupCommonMocks();
});
afterEach(async () => {
if (globalThis.__MONGO_URI__) {
await Promise.all(
collectionsForCleanUp.map((collection) =>
db.collection(collection).deleteMany({})
)
);
}
//nothing
});
afterAll(async () => {
await client?.close();
await MongoDbMock.teardown();
// @ts-ignore
db = undefined;
//@ts-ignore

View file

@ -100,7 +100,8 @@ describe("Loaderboard Controller", () => {
"60",
"english",
0,
50
50,
false
);
});
@ -139,7 +140,8 @@ describe("Loaderboard Controller", () => {
"60",
"english",
page,
pageSize
pageSize,
false
);
});

View file

@ -1,23 +1,32 @@
import * as MongoDbMock from "vitest-mongodb";
import { GenericContainer, StartedTestContainer, Wait } from "testcontainers";
import { isIntegrationTest } from "./__integration__";
let startedMongoContainer: StartedTestContainer | undefined;
export async function setup(): Promise<void> {
process.env.TZ = "UTC";
if (isIntegrationTest) {
console.log("integration download mongomock");
await MongoDbMock.setup(MongoDbMockConfig);
//use testcontainer to start mongodb
//const network = await new Network(new RandomUuid()).start();
const mongoContainer = new GenericContainer("mongo:5.0.13")
//.withName("monkeytype-mongo-test")
.withExposedPorts(27017)
// .withNetwork(network)
//.withNetworkMode(network.getName())
.withWaitStrategy(Wait.forListeningPorts());
startedMongoContainer = await mongoContainer.start();
const mongoUrl = `mongodb://${startedMongoContainer?.getHost()}:${startedMongoContainer?.getMappedPort(
27017
)}`;
process.env["TEST_DB_URL"] = mongoUrl;
}
}
export async function teardown(): Promise<void> {
if (isIntegrationTest) {
await MongoDbMock.teardown();
await startedMongoContainer?.stop();
}
}
export const MongoDbMockConfig = {
serverOptions: {
binary: {
version: "6.0.12",
},
},
};

View file

@ -1,15 +1,8 @@
import { afterAll, beforeAll, afterEach } from "vitest";
import { isIntegrationTest } from "./__integration__";
import { BASE_CONFIGURATION } from "../src/constants/base-configuration";
import { setupCommonMocks } from "./setup-common-mocks";
process.env["MODE"] = "dev";
//process.env["MONGOMS_DISTRO"] = "ubuntu-22.04";
if (isIntegrationTest) {
console.error("wrong environment");
process.exit();
}
if (!process.env["REDIS_URI"]) {
// use mock if not set
@ -43,7 +36,7 @@ beforeAll(async () => {
});
afterEach(async () => {
//noting
//nothing
});
afterAll(async () => {

View file

@ -98,9 +98,9 @@
"oxlint": "1.8.0",
"readline-sync": "1.4.10",
"supertest": "6.2.3",
"testcontainers": "11.4.0",
"tsx": "4.16.2",
"typescript": "5.5.4",
"vitest": "2.1.9",
"vitest-mongodb": "1.0.0"
"vitest": "2.1.9"
}
}

View file

@ -45,7 +45,8 @@ export async function getLeaderboard(
mode2,
language,
page,
pageSize
pageSize,
req.ctx.configuration.users.premium.enabled
);
if (leaderboard === false) {

View file

@ -33,7 +33,8 @@ export async function get(
mode2: string,
language: string,
page: number,
pageSize: number
pageSize: number,
premiumFeaturesEnabled: boolean = false
): Promise<DBLeaderboardEntry[] | false> {
if (page < 0 || pageSize < 0) {
throw new MonkeyError(500, "Invalid page or pageSize");
@ -50,9 +51,6 @@ export async function get(
.limit(limit)
.toArray();
const premiumFeaturesEnabled = (await getCachedConfiguration(true)).users
.premium.enabled;
if (!premiumFeaturesEnabled) {
return preset.map((it) => omit(it, "isPremium"));
}

View file

@ -9,8 +9,14 @@ export default defineConfig({
setupFiles: isIntegrationTest
? ["__tests__/__integration__/setup-integration-tests.ts"]
: ["__tests__/setup-tests.ts"],
pool: "forks", //this should be the default value, however the CI fails without this set.
//pool: "forks", //this should be the default value, however the CI fails without this set.
// run integration tests single threaded bevcause they share the same mongodb
pool: isIntegrationTest ? "threads" : "forks",
poolOptions: {
threads: {
singleThread: true,
},
},
coverage: {
include: ["**/*.ts"],
},

519
pnpm-lock.yaml generated
View file

@ -267,6 +267,9 @@ importers:
supertest:
specifier: 6.2.3
version: 6.2.3
testcontainers:
specifier: 11.4.0
version: 11.4.0
tsx:
specifier: 4.16.2
version: 4.16.2
@ -276,9 +279,6 @@ importers:
vitest:
specifier: 2.1.9
version: 2.1.9(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)
vitest-mongodb:
specifier: 1.0.0
version: 1.0.0
frontend:
dependencies:
@ -1338,6 +1338,9 @@ packages:
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
engines: {node: '>=6.9.0'}
'@balena/dockerignore@1.0.2':
resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==}
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
@ -2929,6 +2932,12 @@ packages:
'@types/damerau-levenshtein@1.0.0':
resolution: {integrity: sha512-8XQ1jJHlOl6HjZ3/fU9Yrm/14jxM4gXVezPWiwkyiG0GnYROsI6wdh8DwKccAFGDNiNYBooTZkRXVe4du6plKA==}
'@types/docker-modem@3.0.6':
resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==}
'@types/dockerode@3.3.42':
resolution: {integrity: sha512-U1jqHMShibMEWHdxYhj3rCMNCiLx5f35i4e3CEUuW+JSSszc/tVqc6WCAPdhwBymG5R/vgbcceagK0St7Cq6Eg==}
'@types/eslint@8.56.11':
resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==}
@ -3007,6 +3016,9 @@ packages:
'@types/node-fetch@2.6.1':
resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==}
'@types/node@18.19.121':
resolution: {integrity: sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ==}
'@types/node@20.14.11':
resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==}
@ -3049,6 +3061,15 @@ packages:
'@types/sizzle@2.3.8':
resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==}
'@types/ssh2-streams@0.1.12':
resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==}
'@types/ssh2@0.5.52':
resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==}
'@types/ssh2@1.15.5':
resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==}
'@types/string-similarity@4.0.2':
resolution: {integrity: sha512-LkJQ/jsXtCVMK+sKYAmX/8zEq+/46f1PTQw7YtmQwb74jemS1SlNLmARM2Zml9DgdDTWKAtc5L13WorpHPDjDA==}
@ -3091,9 +3112,6 @@ packages:
'@types/whatwg-url@11.0.5':
resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==}
'@types/whatwg-url@8.2.2':
resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==}
'@typescript-eslint/eslint-plugin@8.0.1':
resolution: {integrity: sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -3522,6 +3540,9 @@ packages:
asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
asn1@0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
@ -3559,9 +3580,6 @@ packages:
async-lock@1.4.1:
resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==}
async-mutex@0.4.1:
resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==}
async-retry@1.3.3:
resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
@ -3649,6 +3667,36 @@ packages:
bare-events@2.4.2:
resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==}
bare-events@2.6.0:
resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==}
bare-fs@4.1.6:
resolution: {integrity: sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==}
engines: {bare: '>=1.16.0'}
peerDependencies:
bare-buffer: '*'
peerDependenciesMeta:
bare-buffer:
optional: true
bare-os@3.6.1:
resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==}
engines: {bare: '>=1.14.0'}
bare-path@3.0.0:
resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==}
bare-stream@2.6.5:
resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==}
peerDependencies:
bare-buffer: '*'
bare-events: '*'
peerDependenciesMeta:
bare-buffer:
optional: true
bare-events:
optional: true
base64-arraybuffer@1.0.2:
resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
engines: {node: '>= 0.6.0'}
@ -3671,6 +3719,9 @@ packages:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'}
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
bcrypt@5.1.1:
resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==}
engines: {node: '>= 10.0.0'}
@ -3752,18 +3803,11 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
bson@5.5.1:
resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==}
engines: {node: '>=14.20.1'}
bson@6.8.0:
resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==}
engines: {node: '>=16.20.1'}
deprecated: a critical bug affecting only useBigInt64=true deserialization usage is fixed in bson@6.10.3
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
buffer-crc32@1.0.0:
resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
engines: {node: '>=8.0.0'}
@ -3784,6 +3828,10 @@ packages:
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
buildcheck@0.0.6:
resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==}
engines: {node: '>=10.0.0'}
builtin-modules@1.1.1:
resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==}
engines: {node: '>=0.10.0'}
@ -3801,6 +3849,10 @@ packages:
peerDependencies:
esbuild: '>=0.18'
byline@5.0.0:
resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==}
engines: {node: '>=0.10.0'}
bytes@3.0.0:
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
engines: {node: '>= 0.8'}
@ -3948,6 +4000,9 @@ packages:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
chownr@2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
engines: {node: '>=10'}
@ -4345,6 +4400,10 @@ packages:
typescript:
optional: true
cpu-features@0.0.10:
resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==}
engines: {node: '>=10.0.0'}
crc-32@1.2.2:
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
engines: {node: '>=0.8'}
@ -4685,6 +4744,18 @@ packages:
discontinuous-range@1.0.0:
resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==}
docker-compose@1.2.0:
resolution: {integrity: sha512-wIU1eHk3Op7dFgELRdmOYlPYS4gP8HhH1ZmZa13QZF59y0fblzFDFmKPhyc05phCy2hze9OEvNZAsoljrs+72w==}
engines: {node: '>= 6.0.0'}
docker-modem@5.0.6:
resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==}
engines: {node: '>= 8.0'}
dockerode@4.0.7:
resolution: {integrity: sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA==}
engines: {node: '>= 8.0'}
doctrine@2.1.0:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
@ -5289,10 +5360,6 @@ packages:
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
engines: {node: '>= 0.8'}
find-cache-dir@3.3.2:
resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
engines: {node: '>=8'}
find-my-way@4.5.1:
resolution: {integrity: sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==}
engines: {node: '>=10'}
@ -5440,6 +5507,9 @@ packages:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
engines: {node: '>= 0.8'}
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
@ -5552,6 +5622,10 @@ packages:
resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
get-port@7.1.0:
resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==}
engines: {node: '>=16'}
get-proto@1.0.1:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
@ -7267,6 +7341,9 @@ packages:
resolution: {integrity: sha512-vAeqvq915Qgdn0sYxwldsVSIKNn2HAzUHXG7orgYTrMUD7Vfq3B1W5WYsa0oV/JRgLR6SH5MrFPsvckgc4mxxg==}
hasBin: true
mkdirp-classic@0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
mkdirp@0.5.6:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
@ -7323,41 +7400,9 @@ packages:
moment@2.30.1:
resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
mongodb-connection-string-url@2.6.0:
resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==}
mongodb-connection-string-url@3.0.1:
resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==}
mongodb-memory-server-core@9.4.1:
resolution: {integrity: sha512-lobapXaysH64zrn521NTkmqHc3krSPUFkuuZ8A/BmQV8ON7p2SzAEvpoJPDXIeJkxIzYw06dYL6Gn5OcZdEElA==}
engines: {node: '>=14.20.1'}
mongodb-memory-server@9.4.1:
resolution: {integrity: sha512-qONlW4sKPbtk9pqFnlPn7R73G3Q4TuebJJ5pHfoiKTqVJquojQ8xWmkCyz+/YnpA2vYBo/jib+nXvjfKwh7cjg==}
engines: {node: '>=14.20.1'}
mongodb@5.9.2:
resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==}
engines: {node: '>=14.20.1'}
peerDependencies:
'@aws-sdk/credential-providers': ^3.188.0
'@mongodb-js/zstd': ^1.0.0
kerberos: ^1.0.0 || ^2.0.0
mongodb-client-encryption: '>=2.3.0 <3'
snappy: ^7.2.2
peerDependenciesMeta:
'@aws-sdk/credential-providers':
optional: true
'@mongodb-js/zstd':
optional: true
kerberos:
optional: true
mongodb-client-encryption:
optional: true
snappy:
optional: true
mongodb@6.3.0:
resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==}
engines: {node: '>=16.20.1'}
@ -7465,10 +7510,6 @@ packages:
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
engines: {node: '>= 0.4.0'}
new-find-package-json@2.0.0:
resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==}
engines: {node: '>=12.22.0'}
next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
@ -7989,9 +8030,6 @@ packages:
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
engines: {node: '>= 14.16'}
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
@ -8078,10 +8116,6 @@ packages:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'}
pkg-dir@4.2.0:
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
engines: {node: '>=8'}
plugin-error@2.0.1:
resolution: {integrity: sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==}
engines: {node: '>=10.13.0'}
@ -8239,6 +8273,13 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
proper-lockfile@4.1.2:
resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
properties-reader@2.3.0:
resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==}
engines: {node: '>=14'}
proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
@ -9021,6 +9062,7 @@ packages:
source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'}
deprecated: The work that was done in this beta branch won't be included in future versions
sourcemap-codec@1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
@ -9048,6 +9090,9 @@ packages:
spdx-license-ids@3.0.18:
resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
split-ca@1.0.1:
resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==}
split-string@3.1.0:
resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
engines: {node: '>=0.10.0'}
@ -9066,6 +9111,13 @@ packages:
resolution: {integrity: sha512-pNxSMf5DtwhpZ8gUcOGCGZIWtCcyAUx9oLgAtlO4ag7DvlfnETL0BGqXaISc84pNrXvTWmt8Wal1FWKxdTsL3Q==}
hasBin: true
ssh-remote-port-forward@1.0.4:
resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==}
ssh2@1.16.0:
resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==}
engines: {node: '>=10.16.0'}
ssri@10.0.6:
resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@ -9129,6 +9181,9 @@ packages:
streamx@2.18.0:
resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==}
streamx@2.22.1:
resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==}
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
@ -9315,6 +9370,16 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
tar-fs@2.1.3:
resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==}
tar-fs@3.1.0:
resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==}
tar-stream@2.2.0:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
@ -9360,6 +9425,9 @@ packages:
resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
engines: {node: '>=18'}
testcontainers@11.4.0:
resolution: {integrity: sha512-eX5nc/Fi5I0LHqwxw6BuUvWNfdl+M2sKX6fX/47RP89Xs5nU6smd0iD7dpFogxy8/wACjlucLoutJc7b5mtq7w==}
text-decoder@1.1.1:
resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==}
@ -9508,10 +9576,6 @@ packages:
tr46@1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
tr46@3.0.0:
resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
engines: {node: '>=12'}
tr46@4.1.1:
resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==}
engines: {node: '>=14'}
@ -9634,6 +9698,9 @@ packages:
resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==}
hasBin: true
tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@ -9763,6 +9830,10 @@ packages:
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
engines: {node: '>=14.0'}
undici@7.12.0:
resolution: {integrity: sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==}
engines: {node: '>=20.18.1'}
unescape-js@1.1.4:
resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==}
@ -10140,9 +10211,6 @@ packages:
yaml:
optional: true
vitest-mongodb@1.0.0:
resolution: {integrity: sha512-IG39uQ4JpJf62rx9H0FUYwluXVQI5/Am6yrD9dE92SwJnFsJwpN4AynZkBbDuedvqFzG2GWK6mzzwU3vq28N0w==}
vitest@2.1.9:
resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==}
engines: {node: ^18.0.0 || >=20.0.0}
@ -10251,10 +10319,6 @@ packages:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
whatwg-url@11.0.0:
resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==}
engines: {node: '>=12'}
whatwg-url@13.0.0:
resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==}
engines: {node: '>=16'}
@ -10481,10 +10545,6 @@ packages:
yargs@7.1.2:
resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==}
yauzl@3.1.3:
resolution: {integrity: sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==}
engines: {node: '>=12'}
yn@3.1.1:
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
engines: {node: '>=6'}
@ -11312,6 +11372,8 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@balena/dockerignore@1.0.2': {}
'@bcoe/v8-coverage@0.2.3': {}
'@colors/colors@1.5.0':
@ -12998,6 +13060,17 @@ snapshots:
'@types/damerau-levenshtein@1.0.0': {}
'@types/docker-modem@3.0.6':
dependencies:
'@types/node': 20.14.11
'@types/ssh2': 1.15.5
'@types/dockerode@3.3.42':
dependencies:
'@types/docker-modem': 3.0.6
'@types/node': 20.14.11
'@types/ssh2': 1.15.5
'@types/eslint@8.56.11':
dependencies:
'@types/estree': 1.0.7
@ -13083,6 +13156,10 @@ snapshots:
'@types/node': 20.14.11
form-data: 3.0.1
'@types/node@18.19.121':
dependencies:
undici-types: 5.26.5
'@types/node@20.14.11':
dependencies:
undici-types: 5.26.5
@ -13127,6 +13204,19 @@ snapshots:
'@types/sizzle@2.3.8': {}
'@types/ssh2-streams@0.1.12':
dependencies:
'@types/node': 20.14.11
'@types/ssh2@0.5.52':
dependencies:
'@types/node': 20.14.11
'@types/ssh2-streams': 0.1.12
'@types/ssh2@1.15.5':
dependencies:
'@types/node': 18.19.121
'@types/string-similarity@4.0.2': {}
'@types/stylis@4.2.5': {}
@ -13175,11 +13265,6 @@ snapshots:
dependencies:
'@types/webidl-conversions': 7.0.3
'@types/whatwg-url@8.2.2':
dependencies:
'@types/node': 20.14.11
'@types/webidl-conversions': 7.0.3
'@typescript-eslint/eslint-plugin@8.0.1(@typescript-eslint/parser@8.2.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)':
dependencies:
'@eslint-community/regexpp': 4.11.0
@ -13579,7 +13664,7 @@ snapshots:
archiver@7.0.1:
dependencies:
archiver-utils: 5.0.2
async: 3.2.5
async: 3.2.6
buffer-crc32: 1.0.0
readable-stream: 4.5.2
readdir-glob: 1.1.3
@ -13713,6 +13798,10 @@ snapshots:
asap@2.0.6: {}
asn1@0.2.6:
dependencies:
safer-buffer: 2.1.2
assertion-error@2.0.1: {}
assign-symbols@1.0.0: {}
@ -13742,10 +13831,6 @@ snapshots:
async-lock@1.4.1: {}
async-mutex@0.4.1:
dependencies:
tslib: 2.6.3
async-retry@1.3.3:
dependencies:
retry: 0.13.1
@ -13851,6 +13936,31 @@ snapshots:
bare-events@2.4.2:
optional: true
bare-events@2.6.0:
optional: true
bare-fs@4.1.6:
dependencies:
bare-events: 2.6.0
bare-path: 3.0.0
bare-stream: 2.6.5(bare-events@2.6.0)
optional: true
bare-os@3.6.1:
optional: true
bare-path@3.0.0:
dependencies:
bare-os: 3.6.1
optional: true
bare-stream@2.6.5(bare-events@2.6.0):
dependencies:
streamx: 2.22.1
optionalDependencies:
bare-events: 2.6.0
optional: true
base64-arraybuffer@1.0.2: {}
base64-js@1.5.1: {}
@ -13873,6 +13983,10 @@ snapshots:
basic-ftp@5.0.5: {}
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
bcrypt@5.1.1(encoding@0.1.13):
dependencies:
'@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)
@ -14020,12 +14134,8 @@ snapshots:
node-releases: 2.0.19
update-browserslist-db: 1.1.3(browserslist@4.25.1)
bson@5.5.1: {}
bson@6.8.0: {}
buffer-crc32@0.2.13: {}
buffer-crc32@1.0.0: {}
buffer-equal-constant-time@1.0.1: {}
@ -14044,6 +14154,9 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
buildcheck@0.0.6:
optional: true
builtin-modules@1.1.1: {}
bullmq@1.91.1:
@ -14069,6 +14182,8 @@ snapshots:
esbuild: 0.25.0
load-tsconfig: 0.2.5
byline@5.0.0: {}
bytes@3.0.0: {}
bytes@3.1.2: {}
@ -14259,6 +14374,8 @@ snapshots:
dependencies:
readdirp: 4.1.2
chownr@1.1.4: {}
chownr@2.0.0: {}
ci-info@2.0.0: {}
@ -14667,6 +14784,12 @@ snapshots:
optionalDependencies:
typescript: 5.5.4
cpu-features@0.0.10:
dependencies:
buildcheck: 0.0.6
nan: 2.20.0
optional: true
crc-32@1.2.2: {}
crc32-stream@6.0.0:
@ -14982,6 +15105,31 @@ snapshots:
discontinuous-range@1.0.0: {}
docker-compose@1.2.0:
dependencies:
yaml: 2.5.0
docker-modem@5.0.6:
dependencies:
debug: 4.4.1
readable-stream: 3.6.2
split-ca: 1.0.1
ssh2: 1.16.0
transitivePeerDependencies:
- supports-color
dockerode@4.0.7:
dependencies:
'@balena/dockerignore': 1.0.2
'@grpc/grpc-js': 1.11.1
'@grpc/proto-loader': 0.7.13
docker-modem: 5.0.6
protobufjs: 7.3.2
tar-fs: 2.1.3
uuid: 10.0.0
transitivePeerDependencies:
- supports-color
doctrine@2.1.0:
dependencies:
esutils: 2.0.3
@ -15967,12 +16115,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
find-cache-dir@3.3.2:
dependencies:
commondir: 1.0.1
make-dir: 3.1.0
pkg-dir: 4.2.0
find-my-way@4.5.1:
dependencies:
fast-decode-uri-component: 1.0.1
@ -16170,10 +16312,6 @@ snapshots:
optionalDependencies:
debug: 4.3.6(supports-color@5.5.0)
follow-redirects@1.15.6(debug@4.4.1):
optionalDependencies:
debug: 4.4.1
fontawesome-subset@4.4.0(@fortawesome/fontawesome-free@5.15.4):
dependencies:
lodash: 4.17.21
@ -16248,6 +16386,8 @@ snapshots:
fresh@2.0.0: {}
fs-constants@1.0.0: {}
fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
@ -16398,6 +16538,8 @@ snapshots:
get-port@6.1.2: {}
get-port@7.1.0: {}
get-proto@1.0.1:
dependencies:
dunder-proto: 1.0.1
@ -18458,6 +18600,8 @@ snapshots:
transitivePeerDependencies:
- encoding
mkdirp-classic@0.5.3: {}
mkdirp@0.5.6:
dependencies:
minimist: 1.2.8
@ -18498,58 +18642,11 @@ snapshots:
moment@2.30.1: {}
mongodb-connection-string-url@2.6.0:
dependencies:
'@types/whatwg-url': 8.2.2
whatwg-url: 11.0.0
mongodb-connection-string-url@3.0.1:
dependencies:
'@types/whatwg-url': 11.0.5
whatwg-url: 13.0.0
mongodb-memory-server-core@9.4.1:
dependencies:
async-mutex: 0.4.1
camelcase: 6.3.0
debug: 4.4.1
find-cache-dir: 3.3.2
follow-redirects: 1.15.6(debug@4.4.1)
https-proxy-agent: 7.0.5
mongodb: 5.9.2
new-find-package-json: 2.0.0
semver: 7.6.3
tar-stream: 3.1.7
tslib: 2.6.3
yauzl: 3.1.3
transitivePeerDependencies:
- '@aws-sdk/credential-providers'
- '@mongodb-js/zstd'
- kerberos
- mongodb-client-encryption
- snappy
- supports-color
mongodb-memory-server@9.4.1:
dependencies:
mongodb-memory-server-core: 9.4.1
tslib: 2.6.3
transitivePeerDependencies:
- '@aws-sdk/credential-providers'
- '@mongodb-js/zstd'
- kerberos
- mongodb-client-encryption
- snappy
- supports-color
mongodb@5.9.2:
dependencies:
bson: 5.5.1
mongodb-connection-string-url: 2.6.0
socks: 2.8.3
optionalDependencies:
'@mongodb-js/saslprep': 1.1.8
mongodb@6.3.0(socks@2.8.3):
dependencies:
'@mongodb-js/saslprep': 1.1.8
@ -18646,12 +18743,6 @@ snapshots:
netmask@2.0.2: {}
new-find-package-json@2.0.0:
dependencies:
debug: 4.4.1
transitivePeerDependencies:
- supports-color
next-tick@1.1.0: {}
nice-try@1.0.5: {}
@ -19225,8 +19316,6 @@ snapshots:
pathval@2.0.0: {}
pend@1.2.0: {}
perfect-debounce@1.0.0: {}
perfect-scrollbar@1.5.5: {}
@ -19300,10 +19389,6 @@ snapshots:
pirates@4.0.6: {}
pkg-dir@4.2.0:
dependencies:
find-up: 4.1.0
plugin-error@2.0.1:
dependencies:
ansi-colors: 1.1.0
@ -19449,6 +19534,16 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.1
proper-lockfile@4.1.2:
dependencies:
graceful-fs: 4.2.11
retry: 0.12.0
signal-exit: 3.0.7
properties-reader@2.3.0:
dependencies:
mkdirp: 1.0.4
proto-list@1.2.4: {}
proto3-json-serializer@2.0.2:
@ -19906,8 +20001,7 @@ snapshots:
- encoding
- supports-color
retry@0.12.0:
optional: true
retry@0.12.0: {}
retry@0.13.1: {}
@ -20474,6 +20568,8 @@ snapshots:
spdx-license-ids@3.0.18: {}
split-ca@1.0.1: {}
split-string@3.1.0:
dependencies:
extend-shallow: 3.0.2
@ -20492,6 +20588,19 @@ snapshots:
get-stdin: 8.0.0
nearley: 2.20.1
ssh-remote-port-forward@1.0.4:
dependencies:
'@types/ssh2': 0.5.52
ssh2: 1.16.0
ssh2@1.16.0:
dependencies:
asn1: 0.2.6
bcrypt-pbkdf: 1.0.2
optionalDependencies:
cpu-features: 0.0.10
nan: 2.20.0
ssri@10.0.6:
dependencies:
minipass: 7.1.2
@ -20553,6 +20662,14 @@ snapshots:
optionalDependencies:
bare-events: 2.4.2
streamx@2.22.1:
dependencies:
fast-fifo: 1.3.2
text-decoder: 1.1.1
optionalDependencies:
bare-events: 2.6.0
optional: true
string-argv@0.3.2: {}
string-similarity@4.0.4: {}
@ -20827,6 +20944,31 @@ snapshots:
tapable@2.2.1: {}
tar-fs@2.1.3:
dependencies:
chownr: 1.1.4
mkdirp-classic: 0.5.3
pump: 3.0.0
tar-stream: 2.2.0
tar-fs@3.1.0:
dependencies:
pump: 3.0.0
tar-stream: 3.1.7
optionalDependencies:
bare-fs: 4.1.6
bare-path: 3.0.0
transitivePeerDependencies:
- bare-buffer
tar-stream@2.2.0:
dependencies:
bl: 4.1.0
end-of-stream: 1.4.4
fs-constants: 1.0.0
inherits: 2.0.4
readable-stream: 3.6.2
tar-stream@3.1.7:
dependencies:
b4a: 1.6.6
@ -20904,6 +21046,27 @@ snapshots:
glob: 10.4.5
minimatch: 9.0.5
testcontainers@11.4.0:
dependencies:
'@balena/dockerignore': 1.0.2
'@types/dockerode': 3.3.42
archiver: 7.0.1
async-lock: 1.4.1
byline: 5.0.0
debug: 4.4.1
docker-compose: 1.2.0
dockerode: 4.0.7
get-port: 7.1.0
proper-lockfile: 4.1.2
properties-reader: 2.3.0
ssh-remote-port-forward: 1.0.4
tar-fs: 3.1.0
tmp: 0.2.3
undici: 7.12.0
transitivePeerDependencies:
- bare-buffer
- supports-color
text-decoder@1.1.1:
dependencies:
b4a: 1.6.6
@ -21042,10 +21205,6 @@ snapshots:
dependencies:
punycode: 2.3.1
tr46@3.0.0:
dependencies:
punycode: 2.3.1
tr46@4.1.1:
dependencies:
punycode: 2.3.1
@ -21169,6 +21328,8 @@ snapshots:
turbo-windows-64: 2.3.3
turbo-windows-arm64: 2.3.3
tweetnacl@0.14.5: {}
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
@ -21322,6 +21483,8 @@ snapshots:
dependencies:
'@fastify/busboy': 2.1.1
undici@7.12.0: {}
unescape-js@1.1.4:
dependencies:
string.fromcodepoint: 0.2.1
@ -21746,18 +21909,6 @@ snapshots:
tsx: 4.16.2
yaml: 2.5.0
vitest-mongodb@1.0.0:
dependencies:
debug: 4.3.6(supports-color@5.5.0)
mongodb-memory-server: 9.4.1
transitivePeerDependencies:
- '@aws-sdk/credential-providers'
- '@mongodb-js/zstd'
- kerberos
- mongodb-client-encryption
- snappy
- supports-color
vitest@2.1.9(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1):
dependencies:
'@vitest/expect': 2.1.9
@ -21910,11 +22061,6 @@ snapshots:
whatwg-mimetype@3.0.0: {}
whatwg-url@11.0.0:
dependencies:
tr46: 3.0.0
webidl-conversions: 7.0.0
whatwg-url@13.0.0:
dependencies:
tr46: 4.1.1
@ -22265,11 +22411,6 @@ snapshots:
y18n: 3.2.2
yargs-parser: 5.0.1
yauzl@3.1.3:
dependencies:
buffer-crc32: 0.2.13
pend: 1.2.0
yn@3.1.1: {}
yocto-queue@0.1.0: {}