diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index 4a194fd59..cafde7f64 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -108,12 +108,6 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | codecovcli --verbose do-upload --fail-on-error --flag persona --name persona --dir packages/persona - - name: Codecov upload sessions coverage - if: ${{ always() }} # using always() to always run this step because i am uploading test results and coverage in one step - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - run: | - codecovcli --verbose do-upload --fail-on-error --flag sessions --name sessions --dir packages/sessions - name: Codecov upload shard coverage if: ${{ always() }} # using always() to always run this step because i am uploading test results and coverage in one step env: diff --git a/docker-compose.yml b/docker-compose.yml index 6715d6366..f454b8cd7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +name: rustyserver + services: nginx: build: @@ -63,4 +65,4 @@ services: # - db volumes: - pgadmin: + pgadmin: diff --git a/package.json b/package.json index bc7820dd7..49efaf9f6 100644 --- a/package.json +++ b/package.json @@ -37,13 +37,11 @@ "@sentry/profiling-node": "8.34.0", "adminjs": "^7.8.13", "fastify": "^5.0.0", - "lobby": "link:packages/lobby", "moment": "^2.30.1", "pino": "^9.4.0", "pino-pretty": "^11.2.2", "rusty-motors-chat": "link:src/chat", "rusty-motors-cli": "link:packages/cli", - "rusty-motors-connection": "link:packages/connection", "rusty-motors-database": "link:packages/database", "rusty-motors-gateway": "link:packages/gateway", "rusty-motors-lobby": "link:packages/lobby", @@ -52,7 +50,6 @@ "rusty-motors-nps": "link:packages/nps", "rusty-motors-patch": "link:packages/patch", "rusty-motors-personas": "link:packages/persona", - "rusty-motors-sessions": "link:packages/sessions", "rusty-motors-shard": "link:packages/shard", "rusty-motors-shared": "link:packages/shared", "rusty-motors-shared-packets": "link:packages/shared-packets", @@ -72,7 +69,7 @@ "@tsconfig/node-lts": "^20.1.3", "@tsconfig/node20": "^20.1.4", "@types/chai": "5.0.0", - "@types/node": "^22.7.5", + "@types/node": "^20.16.11", "@types/sinon": "17.0.3", "@types/sinon-chai": "4.0.0", "@typescript-eslint/eslint-plugin": "^8.8.1", @@ -117,4 +114,4 @@ } }, "packageManager": "pnpm@9.12.1+sha512.e5a7e52a4183a02d5931057f7a0dbff9d5e9ce3161e33fa68ae392125b79282a8a8a470a51dfc8a0ed86221442eb2fb57019b0990ed24fab519bf0e1bc5ccfc4" -} +} \ No newline at end of file diff --git a/packages/core/src/serializationHelpers.test.ts b/packages/core/src/serializationHelpers.test.ts deleted file mode 100644 index 2fe247f86..000000000 --- a/packages/core/src/serializationHelpers.test.ts +++ /dev/null @@ -1,335 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { - clamp16, - clamp32, - deserializeBool, - deserializeByte, - deserializeDWord, - deserializeFloat, - deserializeString, - deserializeWord, - serializeBool, - serializeByte, - serializeDWord, - serializeFloat, - serializeString, - serializeWord, - sizeOfBool, - sizeOfByte, - sizeOfDWord, - sizeOfFloat, - sizeOfString, - sizeOfWord, -} from "./serializationHelpers.js"; - -describe("serializationHelpers", () => { - describe("serializeBool()", () => { - it("should serialize a boolean value", () => { - // Arrange - const input = true; - const expected = Buffer.from([1]); - - // Act - const actual = serializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - - it("should serialize a boolean value", () => { - // Arrange - const input = false; - const expected = Buffer.from([0]); - - // Act - const actual = serializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeBool()", () => { - it("should deserialize a boolean value", () => { - // Arrange - const input = Buffer.from([1]); - const expected = true; - - // Act - const actual = deserializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - - it("should deserialize a boolean value", () => { - // Arrange - const input = Buffer.from([0]); - const expected = false; - - // Act - const actual = deserializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfBool()", () => { - it("should return the size of a boolean value", () => { - // Arrange - const expected = 1; - - // Act - const actual = sizeOfBool(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeByte()", () => { - it("should serialize a byte value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([1]); - - // Act - const actual = serializeByte(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeByte()", () => { - it("should deserialize a byte value", () => { - // Arrange - const input = Buffer.from([1]); - const expected = 1; - - // Act - const actual = deserializeByte(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfByte()", () => { - it("should return the size of a byte value", () => { - // Arrange - const expected = 1; - - // Act - const actual = sizeOfByte(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeWord()", () => { - it("should serialize a word value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([0, 1]); - - // Act - const actual = serializeWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeWord()", () => { - it("should deserialize a word value", () => { - // Arrange - const input = Buffer.from([0, 1]); - const expected = 1; - - // Act - const actual = deserializeWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfWord()", () => { - it("should return the size of a word value", () => { - // Arrange - const expected = 2; - - // Act - const actual = sizeOfWord(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeDWord()", () => { - it("should serialize a dword value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([0, 0, 0, 1]); - - // Act - const actual = serializeDWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeDWord()", () => { - it("should deserialize a dword value", () => { - // Arrange - const input = Buffer.from([0, 0, 0, 1]); - const expected = 1; - - // Act - const actual = deserializeDWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfDWord()", () => { - it("should return the size of a dword value", () => { - // Arrange - const expected = 4; - - // Act - const actual = sizeOfDWord(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeFloat()", () => { - it("should serialize a float value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([63, 128, 0, 0]); - - // Act - const actual = serializeFloat(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeFloat()", () => { - it("should deserialize a float value", () => { - // Arrange - const input = Buffer.from([63, 128, 0, 0]); - const expected = 1; - - // Act - const actual = deserializeFloat(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfFloat()", () => { - it("should return the size of a float value", () => { - // Arrange - const expected = 4; - - // Act - const actual = sizeOfFloat(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeString()", () => { - it("should serialize a string value", () => { - // Arrange - const input = "test"; - const expected = Buffer.from([0, 4, 116, 101, 115, 116]); - - // Act - const actual = serializeString(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeString()", () => { - it("should deserialize a string value", () => { - // Arrange - const input = Buffer.from([0, 4, 116, 101, 115, 116]); - const expected = "test"; - - // Act - const actual = deserializeString(input); - - // Assert - expect(actual).toEqual(expected); - }); - - it("should throw an error if the size is bigger than the buffer length - 2", () => { - // Arrange - const input = Buffer.from([0, 5, 116, 101, 115, 116]); - - // Act - const actual = () => deserializeString(input); - - // Assert - expect(actual).toThrowError("Size is bigger than the buffer length - 2"); - }); - }); - - describe("sizeOfString()", () => { - it("should return the size of a string value", () => { - // Arrange - const input = "test"; - const expected = 6; - - // Act - const actual = sizeOfString(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); -}); - -describe("clamp16()", () => { - it("should clamp a value between 0 and 65535", () => { - // Arrange - const input = 65536; - const expected = 65535; - - // Act - const actual = clamp16(input); - - // Assert - expect(actual).toEqual(expected); - }); -}); - -describe("clamp32()", () => { - it("should clamp a value between 0 and 4294967295", () => { - // Arrange - const input = 4294967296; - const expected = 4294967295; - - // Act - const actual = clamp32(input); - - // Assert - expect(actual).toEqual(expected); - }); -}); diff --git a/packages/core/src/serializationHelpers.ts b/packages/core/src/serializationHelpers.ts deleted file mode 100644 index 9e4185cf7..000000000 --- a/packages/core/src/serializationHelpers.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { ServerError } from "rusty-motors-shared"; - -/** - * Clamp a value between 0 and 255 - * @param {number} value - * @returns {number} - */ -export function clamp16(value: number): number { - return Math.max(0, Math.min(65535, value)); -} - -/** - * Clamp a value between 0 and 65535 - * @param {number} value - * @returns {number} - */ -export function clamp32(value: number): number { - return Math.max(0, Math.min(4294967295, value)); -} - -/** - * Serializes a boolean to a buffer. - * @param {boolean} bool - * @returns {Buffer} - */ -export function serializeBool(bool: boolean): Buffer { - const buf = Buffer.alloc(1); - - buf.writeUInt8(bool ? 1 : 0); - - return buf; -} - -/** - * Serializes a byte to a buffer. - * @param {number} byte - * @returns {Buffer} - */ -export function serializeByte(byte: number): Buffer { - const buf = Buffer.alloc(1); - - buf.writeUInt8(byte); - - return buf; -} - -/** - * Serializes a word to a buffer. - * @param {number} word - * @returns {Buffer} - */ -export function serializeWord(word: number): Buffer { - const buf = Buffer.alloc(2); - - buf.writeUInt16BE(word); - - return buf; -} - -/** - * Serializes a dword to a buffer. - * @param {number} dword - * @returns {Buffer} - */ -export function serializeDWord(dword: number): Buffer { - const buf = Buffer.alloc(4); - - buf.writeUInt32BE(dword); - - return buf; -} - -/** - * Serializes a float to a buffer. - * @param {number} f - * @returns {Buffer} - */ -export function serializeFloat(f: number): Buffer { - const buf = Buffer.alloc(4); - - buf.writeFloatBE(f); - - return buf; -} - -/** - * Serializes a string to a buffer. The buffer will be prefixed with the length of the string. - * @param {string} str - * @returns {Buffer} - */ -export function serializeString(str: string): Buffer { - const buf = Buffer.alloc(str.length + 2); - - buf.writeUInt16BE(str.length); - buf.write(str, 2); - - return buf; -} - -/** - * Deserializes a boolean from a buffer. - * @param {Buffer} buff - * @returns {boolean} - */ -export function deserializeBool(buff: Buffer): boolean { - return buff.readUInt8() === 1; -} - -/** - * Deserializes a byte from a buffer. - * @param {Buffer} buff - * @returns {number} - */ -export function deserializeByte(buff: Buffer): number { - return buff.readUInt8(); -} - -/** - * Deserializes a word from a buffer. - * @param {Buffer} buff - * @returns {number} - */ -export function deserializeWord(buff: Buffer): number { - return buff.readUInt16BE(); -} - -/** - * Deserializes a dword from a buffer. - * @param {Buffer} buff - * @returns {number} - */ -export function deserializeDWord(buff: Buffer): number { - return buff.readUInt32BE(); -} - -/** - * Deserializes a float from a buffer. - * @param {Buffer} buff - * @returns {number} - */ -export function deserializeFloat(buff: Buffer): number { - return buff.readFloatBE(); -} - -/** - * Deserializes a string from a buffer. The buffer is expected to be prefixed with the length of the string. - * @param {Buffer} buf - * @returns {string} - */ -export function deserializeString(buf: Buffer): string { - const size = buf.readUInt16BE(); - if (size > buf.length - 2) { - throw new ServerError("Size is bigger than the buffer length - 2"); - } - const str = buf.subarray(2, size + 2).toString("utf8"); - - return str; -} - -export function sizeOfBool() { - return 1; -} - -export function sizeOfByte() { - return 1; -} - -export function sizeOfWord() { - return 2; -} - -export function sizeOfDWord() { - return 4; -} - -export function sizeOfFloat() { - return 4; -} - -/** - * Returns the size of a string, including the length prefix. - * @param {string} string - * @returns {number} - */ -export function sizeOfString(string: string): number { - return string.length + 2; -} diff --git a/packages/database/index.ts b/packages/database/index.ts index c6862e9c3..0b6b47d05 100644 --- a/packages/database/index.ts +++ b/packages/database/index.ts @@ -4,7 +4,6 @@ export { updateSessionKey, updateUser, } from "./src/DatabaseManager.js"; -export { getWarehouseInventory } from "./src/functions/getWarehouseInventory.js"; export type { WarehouseInventory } from "./src/functions/getWarehouseInventory.js"; export * from "./src/services/database.js"; import * as DatabaseSchema from "./src/__generated__/schema.json"; diff --git a/packages/database/src/functions/createNewCar.ts b/packages/database/src/functions/createNewCar.ts deleted file mode 100644 index 9903baa37..000000000 --- a/packages/database/src/functions/createNewCar.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { eq } from "drizzle-orm"; -import { getDatabase } from "rusty-motors-database"; -import { - brandedPart as brandedPartSchema, - part as partSchema, - player as playerSchema, - stockAssembly as stockAssemblySchema, - stockVehicleAttributes as stockVehicleAttributesSchema, - tunables as tunablesSchema, - warehouse as warehouseSchema, -} from "rusty-motors-schema"; -import { getServerLogger } from "rusty-motors-shared"; -import { transferPartAssembly } from "./transferPartAssembly"; -/** - * Create a new car - * - * This function creates a new car for a player. - * - * The car is created using a branded part, a skin, and a trade-in part. - * The car is added to the player's lot and the trade-in part is removed from the player's lot. - * The player's account is debited for the cost of the car and the trade-in value is added to the player's account. - * The car is removed from the wholesaler's lot. - * The transaction is committed if all operations are successful. - * If any operation fails, the transaction is rolled back and an error is thrown. - * - * @param {number} lotOwnerId - * @param {number} brandedPartId - * @param {number} _skinId - * @param {number} playerId - * @param {number} tradeInId - * @returns {Promise} The new car's ID - * @throws {Error} If the lot owner ID is not found - * @throws {Error} If the branded part ID is not found - * @throws {Error} If the skin ID is not found - * @throws {Error} If the player ID is not found - * @throws {Error} If the trade-in ID is not found - * @throws {Error} If the car is out of stock - * @throws {Error} If the trade-in is not owned by the player - * @throws {Error} If the trade-in value cannot be determined - * @throws {Error} If the trade-in lot is not found - * @throws {Error} If the trade-in can not be scrapped - * @throws {Error} If the trade-in value can not be added to the player's account - * @throws {Error} If the trade-in cannot be removed from the player's lot - * @throws {Error} If the player does not have enough money to buy the car - * @throws {Error} If the car cannot be removed from the wholesaler's lot - * @throws {Error} If the car cannot be added to the player's lot - * @throws {Error} If the part cannot be created - * @throws {Error} If the vehicle cannot be created - * @throws {Error} If the player does not have enough room in their lot - * @throws {Error} If the sale cannot be recorded - */ -export async function createNewCar( - lotOwnerId: number, - brandedPartId: number, - _skinId: number, - playerId: number, - tradeInId: number, -): Promise { - const log = getServerLogger({ name: "createNewCar" }); - - log.debug(`Creating new car for player ${playerId}`); - let currentAbstractCarId = 0; - let currentPartId = 0; - let currentParentPartId = 0; - let currentBrandedPartId = 0; - let currentAttachmentPointId = 0; - let currentMaxItemWear = 0; - let currentRetailPrice = 0; - let scrapyardLotId = 0; - let tradeInValue = 0; - let cost = 0; - let rc = 0; - let dealOfTheDayBrandedPartId = 0; - let dealOfTheDayDiscount = 0; - let ownerID = 0; - let retailPrice = 0; - let maxItemWear = 0; - let tradeInPartCount = 0; - let carPartCount = 0; - let currectPartCounter = 0; - let carClass = 0; - - type record = { - partId: number; - parentPartId: number; - brandedPartId: number; - attachmentPointId: number; - abstractPartTypeId: number; - parentAbstractPartTypeId: number; - maxItemWear: number; - retailPrice: number; - }; - - const partRecords: record[] = []; - - const db = getDatabase(); - - const parts = await db - .select() - .from(stockAssemblySchema) - .where(eq(brandedPartSchema.brandedPartId, brandedPartId)); - - if (parts.length === 0) { - throw Error(`Branded part ${brandedPartId} not found`); - } - - await db.transaction(async (tx) => { - log.debug("Transaction started"); - - let tradeInValue = 0; - let scrapyardLotId = 0; - let dealOfTheDayBrandedPartId: number | null = null; - let dealOfTheDayDiscount = 0; - let ownerID = 0; - let retailPrice = 0; - let maxItemWear = 0; - let tradeInPartCount = 0; - let carPartCount = 0; - - dealOfTheDayBrandedPartId = await tx - .select({ - brandedPartId: warehouseSchema.brandedPartId, - }) - .from(warehouseSchema) - .where(eq(warehouseSchema.playerId, lotOwnerId)) - .limit(1) - .then((result) => { - return result[0]?.brandedPartId ?? null; - }); - - if (!dealOfTheDayBrandedPartId) { - log.debug("Deal of the day not found"); - } - - const lotExists: boolean = await tx - .select({ - playerID: warehouseSchema.playerId, - }) - .from(warehouseSchema) - .where(eq(warehouseSchema.playerId, lotOwnerId)) - .limit(1) - .then((result) => { - return !!result[0]; - }); - - if (!lotExists) { - tx.rollback(); - throw new Error(`Lot owner ${lotOwnerId} not found`); - } - - if (tradeInId) { - const validTradeIn = await tx - .select({ - ownerID: partSchema.ownerId, - }) - .from(partSchema) - .where(eq(partSchema.partId, tradeInId)) - .limit(1) - .then((result) => { - return result[0]?.ownerID === playerId; - }); - - if (!validTradeIn) { - tx.rollback(); - throw new Error( - `Trade-in ${tradeInId} not owned by player ${playerId}`, - ); - } - - tradeInValue = await tx - .select({ - scrapValue: partSchema.scrapValue, - }) - .from(partSchema) - .where(eq(partSchema.partId, tradeInId)) - .limit(1) - .then((result) => { - return result[0]?.scrapValue ?? 0; - }); - - if (!tradeInValue) { - tx.rollback(); - throw new Error(`Trade-in value not found for part ${tradeInId}`); - } - - const scrapyardLotFound = await tx - .select({ - playerID: warehouseSchema.playerId, - }) - .from(warehouseSchema) - .where(eq(warehouseSchema.playerId, scrapyardLotId)) - .then((result) => { - return !!result[0]; - }); - - if (!scrapyardLotFound) { - tx.rollback(); - throw new Error(`Scrapyard lot ${scrapyardLotId} not found`); - } - - try { - const resultOfScrap = await transferPartAssembly( - tradeInId, - scrapyardLotId, - ); - } catch (error) { - log.error(`Error scrapping trade-in ${tradeInId}: ${error}`); - tx.rollback(); - throw error; - } - - // Get the owner - - const newOwner = await tx - .select() - .from(playerSchema) - .where(eq(playerSchema.playerId, playerId)) - .limit(1) - .then((result) => { - return result[0]; - }); - - if (!newOwner) { - log.error(`Player ${playerId} not found`); - tx.rollback(); - throw new Error(`Player ${playerId} not found`); - } - - const oldBankBalance = newOwner.bankBalance; - - if (oldBankBalance === null) { - log.error(`Error getting bank balance for player ${playerId}`); - tx.rollback(); - throw new Error(`Error getting bank balance for player ${playerId}`); - } - - if (tradeInValue > 0) { - const newbankBalance = oldBankBalance + tradeInValue; - try { - await tx - .update(playerSchema) - .set({ - bankBalance: newbankBalance, - }) - .where(eq(playerSchema.playerId, playerId)); - } catch (error) { - log.error( - `Error adding trade-in value to player ${playerId}: ${error}`, - ); - tx.rollback(); - throw new Error( - `Error adding trade-in value to player ${playerId}: ${error}`, - ); - } - } - - // Old car trade-in complete - } - - const result = await tx - .select({ - carClass: stockVehicleAttributesSchema.carClass, - retailPrice: stockVehicleAttributesSchema.retailPrice, - }) - .from(stockVehicleAttributesSchema) - .where(eq(stockVehicleAttributesSchema.brandedPartId, brandedPartId)) - .limit(1); - - if (typeof result[0] === "undefined") { - tx.rollback(); - throw new Error(`Car ${brandedPartId} out of stock`); - } - - carClass = result[0].carClass; - retailPrice = result[0].retailPrice; - - if (dealOfTheDayBrandedPartId === brandedPartId) { - dealOfTheDayDiscount = await tx - .select({ - discount: tunablesSchema.dealOfTheDayDiscount, - }) - .from(tunablesSchema) - .limit(1) - .then((result) => { - return result[0]?.discount ?? 0; - }); - } - - log.debug("Transaction committed"); - }); - log.resetName(); - return Promise.resolve(0); -} diff --git a/packages/database/src/functions/getAbstractPartTypeId.ts b/packages/database/src/functions/getAbstractPartTypeId.ts deleted file mode 100644 index d6ca9567b..000000000 --- a/packages/database/src/functions/getAbstractPartTypeId.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { eq } from "drizzle-orm"; -import { getDatabase } from "rusty-motors-database"; -import { - brandedPart as brandedPartSchema, - part as partSchema, - partType as partTypeSchema, -} from "rusty-motors-schema"; -import { getServerLogger } from "rusty-motors-shared"; - -/** - * Get the abstract part type id from the partId - * - * @param partId The part id - * @returns The abstract part type id - * @throws {Error} If the part ID is not found - * @throws {Error} If the abstract part type ID is not found - */ -export async function getAbstractPartTypeId(partId: number): Promise { - const log = getServerLogger(); - log.setName("getAbstractPartTypeId"); - - log.debug(`Getting abstract part type ID for part ${partId}`); - - const db = getDatabase(); - - const abstractPartTypeId = await db - .select() - .from(partSchema) - .leftJoin( - brandedPartSchema, - eq(partSchema.brandedPartId, brandedPartSchema.brandedPartId), - ) - .leftJoin( - partTypeSchema, - eq(brandedPartSchema.partTypeId, partTypeSchema.partTypeId), - ) - .where(eq(partSchema.partId, partId)) - .limit(1) - .then((rows) => { - if (rows.length === 0) { - throw new Error(`Part ${partId} not found`); - } - - return rows[0]?.part_type?.abstractPartTypeId; - }); - - if (typeof abstractPartTypeId === "undefined") { - log.error(`Abstract part type ID not found for part ${partId}`); - throw new Error(`Abstract part type ID not found for part ${partId}`); - } - - return abstractPartTypeId; -} diff --git a/packages/database/src/functions/getWarehouseInventory.ts b/packages/database/src/functions/getWarehouseInventory.ts deleted file mode 100644 index e104e6f89..000000000 --- a/packages/database/src/functions/getWarehouseInventory.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { db, getTuneables, sql } from "../../index.js"; -import { getServerLogger } from "rusty-motors-shared"; - -export type WarehouseInventory = { - inventory: { - brandedPartId: number; - retailPrice: number | null; - isDealOfTheDay: number; - }[]; - dealOfTheDayDiscount: number; -}; - -export async function getWarehouseInventory( - warehouseId: number, - brandId: number, -): Promise { - const log = getServerLogger({ name: "getWarehouseInventory" }); - - log.debug( - `Getting warehouse inventory for part ${brandId} in warehouse ${warehouseId}`, - ); - - let inventoryCars: { - brandedPartId: number; - retailPrice: number | null; - isDealOfTheDay: number; - }[] = []; - - const tunables = getTuneables(); - - const dealOfTheDayDiscount = tunables.getDealOfTheDayDiscount(); - const dealOfTheDayBrandedPartId = tunables.getDealOfTheDayBrandedPartId(); - - if (dealOfTheDayDiscount < 1) { - log.warn("Deal of the day not found"); - } - - if (brandId > 0) { - inventoryCars = await db.query(sql` - SELECT - brandedPartId: warehouseSchema.brandedPartId, - retailPrice: stockVehicleAttributesSchema.retailPrice, - isDealOfTheDay: warehouseSchema.isDealOfTheDay, - FROM warehouse w - LEFT JOIN branded_part bp ON w.brandedPartId = bp.brandedPartId - LEFT JOIN model m ON bp.modelId = m.modelId - LEFT JOIN stock_vehicle_attributes sva ON w.brandedPartId = sva.brandedPartId - WHERE w.playerId = ${warehouseId} AND m.brandId = ${brandId} - `); - } else { - inventoryCars = await db.query(sql` - SELECT - brandedPartId: warehouseSchema.brandedPartId, - retailPrice: stockVehicleAttributesSchema.retailPrice, - isDealOfTheDay: warehouseSchema.isDealOfTheDay, - FROM warehouse w - LEFT JOIN branded_part bp ON w.brandedPartId = bp.brandedPartId - LEFT JOIN model m ON bp.modelId = m.modelId - LEFT JOIN stock_vehicle_attributes sva ON w.brandedPartId = sva.brandedPartId - WHERE w.playerId = ${warehouseId} - `); - } - - const inventory = { - inventory: inventoryCars, - dealOfTheDayDiscount: dealOfTheDayDiscount ?? 0, - }; - - return inventory; -} diff --git a/packages/database/src/functions/transferPartAssembly.ts b/packages/database/src/functions/transferPartAssembly.ts deleted file mode 100644 index 1c6252a95..000000000 --- a/packages/database/src/functions/transferPartAssembly.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { eq } from "drizzle-orm"; -import { getDatabase } from "rusty-motors-database"; -import { - part as partSchema, - player as playerSchema, - vehicle as vehicleSchema, -} from "rusty-motors-schema"; -import { getServerLogger } from "rusty-motors-shared"; -import { getAbstractPartTypeId } from "./getAbstractPartTypeId"; - -const ABSTRACT_PART_TYPE_ID_CAR = 101; - -/** - * Transfer a part assembly - * - * This function transfers a part assembly from one owner to another, including all child parts. - * - * This function does NOT use a transaction. - * - * @param {number} partId - * @param {number} newOwnerId - * - * @returns {Promise} - * @throws {Error} If the part ID is not found - * @throws {Error} If the new owner ID is not found - * @throws {Error} If the part cannot be transferred - */ -export async function transferPartAssembly( - partId: number, - newOwnerId: number, -): Promise { - const log = getServerLogger(); - const db = getDatabase(); - log.setName("transferPartAssembly"); - - log.debug(`Transferring part assembly ${partId} to new owner ${newOwnerId}`); - - const topPart = await db - .select() - .from(partSchema) - .where(eq(partSchema.partId, partId)) - .limit(1) - .then((rows) => rows[0]); - - if (typeof topPart === "undefined") { - log.error(`Part ${partId} not found`); - throw new Error(`Part ${partId} not found`); - } - - if (topPart.ownerId === null) { - log.error(`Part ${partId} has no owner`); - throw new Error(`Part ${partId} has no owner`); - } - - if (topPart.ownerId === newOwnerId) { - log.error(`Part ${partId} is already owned by ${newOwnerId}`); - throw new Error(`Part ${partId} is already owned by ${newOwnerId}`); - } - - const newOwnerExists = await db - .select() - .from(playerSchema) - .where(eq(playerSchema.playerId, newOwnerId)) - .limit(1) - .then((rows) => rows[0] !== undefined); - - if (!newOwnerExists) { - log.error(`Owner ${newOwnerId} not found`); - throw new Error(`Owner ${newOwnerId} not found`); - } - - const children = await db - .select() - .from(partSchema) - .where(eq(partSchema.parentPartId, partId)) - .then((rows) => rows); - - if (children.length === 0) { - log.error(`Part ${partId} has no children`); - throw new Error(`Part ${partId} has no children`); - } - - try { - // If the part is a car, update the owner ID in the vehicle table - const isPartACar = await getAbstractPartTypeId(topPart.brandedPartId).then( - (abstractPartTypeId) => abstractPartTypeId === ABSTRACT_PART_TYPE_ID_CAR, - ); - - if (isPartACar) { - const car = await db - .select() - .from(vehicleSchema) - .where(eq(vehicleSchema.vehicleId, partId)) - .limit(1) - .then((rows) => rows[0]); - - if (typeof car === "undefined") { - log.error(`Vehicle ${partId} not found`); - throw Error(`Vehicle ${partId} not found`); - } - - // Remove the vehicle from the old owner's lot - const oldOwner = await db - .select() - .from(playerSchema) - .where(eq(playerSchema.playerId, topPart.ownerId)) - .limit(1) - .then((rows) => rows[0]); - - if (typeof oldOwner === "undefined") { - log.error(`Owner ${topPart.ownerId} not found`); - throw Error(`Owner ${topPart.ownerId} not found`); - } - - if (oldOwner.numCarsOwned > 0) { - oldOwner.numCarsOwned--; - try { - await db - .update(playerSchema) - .set(oldOwner) - .where(eq(playerSchema.playerId, topPart.ownerId)); - } catch (error) { - log.error( - `Error updating old owner ${topPart.ownerId}: ${String(error)}`, - ); - throw new Error( - `Error updating old owner ${topPart.ownerId}: ${String(error)}`, - ); - } - } else { - log.error(`Owner ${topPart.ownerId} has no cars`); - throw Error(`Owner ${topPart.ownerId} has no cars`); - } - } - - // Transfer the children - - for (const child of children) { - await transferPartAssembly(child.partId, newOwnerId); - } - - // Update the parent part's owner ID - await db - .update(partSchema) - .set({ ownerId: newOwnerId }) - .where(eq(partSchema.partId, partId)); - } catch (error) { - log.error(`Error transferring part ${partId}: ${String(error)}`); - throw new Error(`Error transferring part ${partId}: ${String(error)}`); - } - - log.debug(`Part assembly ${partId} transferred to new owner ${newOwnerId}`); -} diff --git a/packages/database/src/models/Lobby.ts b/packages/database/src/models/Lobby.ts deleted file mode 100644 index 5a54095dd..000000000 --- a/packages/database/src/models/Lobby.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { ServerError } from "rusty-motors-shared"; -import { SerializedBuffer } from "rusty-motors-shared"; - -export class LobbyModel extends SerializedBuffer { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - override deserialize(_inputBuffer: Buffer): LobbyModel { - throw new ServerError("Method not implemented."); - } - override serialize(): Buffer { - throw new ServerError("Method not implemented."); - } - serializeSize(): number { - throw new ServerError("Method not implemented."); - } - static schema = `CREATE TABLE IF NOT EXISTS "lobbies" - ( - "lobyID" integer NOT NULL, - "raceTypeID" integer NOT NULL, - "turfID" integer NOT NULL, - "riffName" character(32) NOT NULL, - "eTerfName" character(265) NOT NULL, - "clientArt" character(11) NOT NULL, - "elementID" integer NOT NULL, - "terfLength" integer NOT NULL, - "startSlice" integer NOT NULL, - "endSlice" integer NOT NULL, - "dragStageLeft" integer NOT NULL, - "dragStageRight" integer NOT NULL, - "dragStagingSlice" integer NOT NULL, - "gridSpreadFactor" real NOT NULL, - "linear" smallint NOT NULL, - "numPlayersMin" smallint NOT NULL, - "numPlayersMax" smallint NOT NULL, - "numPlayersDefault" smallint NOT NULL, - "bnumPlayersEnable" smallint NOT NULL, - "numLapsMin" smallint NOT NULL, - "numLapsMax" smallint NOT NULL, - "numLapsDefault" smallint NOT NULL, - "bnumLapsEnabled" smallint NOT NULL, - "numRoundsMin" smallint NOT NULL, - "numRoundsMax" smallint NOT NULL, - "numRoundsDefault" smallint NOT NULL, - "bnumRoundsEnabled" smallint NOT NULL, - "bWeatherDefault" smallint NOT NULL, - "bWeatherEnabled" smallint NOT NULL, - "bNightDefault" smallint NOT NULL, - "bNightEnabled" smallint NOT NULL, - "bBackwardDefault" smallint NOT NULL, - "bBackwardEnabled" smallint NOT NULL, - "bTrafficDefault" smallint NOT NULL, - "bTrafficEnabled" smallint NOT NULL, - "bDamageDefault" smallint NOT NULL, - "bDamageEnabled" smallint NOT NULL, - "bAIDefault" smallint NOT NULL, - "bAIEnabled" smallint NOT NULL, - "topDog" character(13) NOT NULL, - "terfOwner" character(33) NOT NULL, - "qualifingTime" integer NOT NULL, - "clubNumPlayers" integer NOT NULL, - "clubNumLaps" integer NOT NULL, - "clubNumRounds" integer NOT NULL, - "bClubNight" smallint NOT NULL, - "bClubWeather" smallint NOT NULL, - "bClubBackwards" smallint NOT NULL, - "topSeedsMP" integer NOT NULL, - "lobbyDifficulty" integer NOT NULL, - "ttPointForQualify" integer NOT NULL, - "ttCashForQualify" integer NOT NULL, - "ttPointBonusFasterIncs" integer NOT NULL, - "ttCashBonusFasterIncs" integer NOT NULL, - "ttTimeIncrements" integer NOT NULL, - "victoryPoints1" integer NOT NULL, - "victoryCash1" integer NOT NULL, - "victoryPoints2" integer NOT NULL, - "victoryCash2" integer NOT NULL, - "victoryPoints3" integer NOT NULL, - "victoryCash3" integer NOT NULL, - "minLevel" smallint NOT NULL, - "minResetSlice" integer NOT NULL, - "maxResetSlice" integer NOT NULL, - "bnewbieFlag" smallint NOT NULL, - "bdriverHelmetFlag" smallint NOT NULL, - "clubNumPlayersMax" smallint NOT NULL, - "clubNumPlayersMin" smallint NOT NULL, - "clubNumPlayersDefault" smallint NOT NULL, - "numClubsMax" smallint NOT NULL, - "numClubsMin" smallint NOT NULL, - "racePointsFactor" real NOT NULL, - "bodyClassMax" smallint NOT NULL, - "powerClassMax" smallint NOT NULL, - "clubLogoID" integer NOT NULL, - "teamtWeather" smallint NOT NULL, - "teamtNight" smallint NOT NULL, - "teamtBackwards" smallint NOT NULL, - "teamtNumLaps" smallint NOT NULL, - "raceCashFactor" real NOT NULL - );`; -} diff --git a/packages/database/src/models/Player.ts b/packages/database/src/models/Player.ts deleted file mode 100644 index d2b2cc455..000000000 --- a/packages/database/src/models/Player.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ServerError } from "rusty-motors-shared"; -import { SerializedBuffer } from "rusty-motors-shared"; - -export class PlayerModel extends SerializedBuffer { - override serialize(): Buffer { - throw new ServerError("Method not implemented."); - } - serializeSize(): number { - throw new ServerError("Method not implemented."); - } - - static schema = `CREATE TABLE Player ( - PlayerID int NOT NULL, - CustomerID int NOT NULL, - PlayerTypeID int NOT NULL, - StockClassicClass char NOT NULL, - StockMuscleClass char NOT NULL, - ModifiedClassicClass char NOT NULL, - ModifiedMuscleClass char NOT NULL, - OutlawClass char NOT NULL, - DragClass char NOT NULL, - ChallengeScore int NOT NULL, - ChallengeRung int NOT NULL, - LastLoggedIn datetime NOT NULL, - TotalTimePlayed datetime NOT NULL, - TimesLoggedIn smallint NOT NULL, - NumUnreadMail smallint NOT NULL, - BankBalance int NOT NULL, - NumCarsOwned smallint NOT NULL, - IsLoggedIn tinyint NOT NULL, - DriverStyle tinyint NOT NULL, - LPCode smallint NOT NULL, - CarInfoSetting int NOT NULL, - CarNum1 varchar(2) NOT NULL, - CarNum2 varchar(2) NOT NULL, - CarNum3 varchar(2) NOT NULL, - CarNum4 varchar(2) NOT NULL, - CarNum5 varchar(2) NOT NULL, - CarNum6 varchar(2) NOT NULL, - LPText varchar(8) NOT NULL, - DLNumber varchar(20) NOT NULL, - Persona varchar(30) NOT NULL, - Address varchar(128) NOT NULL, - Residence varchar(20) NOT NULL -);`; -} diff --git a/packages/database/src/models/Session.ts b/packages/database/src/models/Session.ts deleted file mode 100644 index 617f43bcb..000000000 --- a/packages/database/src/models/Session.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @global - * @typedef {object} Session - * @property {number} customer_id - * @property {string} sessionkey - * @property {string} skey - * @property {string} context_id - * @property {string} connection_id - */ -export default {}; diff --git a/packages/database/src/seeders/index.ts b/packages/database/src/seeders/index.ts deleted file mode 100644 index c37a7309a..000000000 --- a/packages/database/src/seeders/index.ts +++ /dev/null @@ -1,206 +0,0 @@ -const playerCsvHeader = [ - "player_id", - "customer_id", - "player_type_id", - "sanctioned_score", - "challenge_score", - "last_logged_in", - "times_logged_in", - "bank_balance", - "num_cars_owned", - "is_logged_in", - "driver_style", - "lp_code", - "lp_text", - "car_num_1", - "car_num_2", - "car_num_3", - "car_num_4", - "car_num_5", - "car_num_6", - "dl_number", - "persona", - "address", - "residence", - "vehicle_id", - "current_race_id", - "offline_driver_skill", - "offline_grudge", - "offline_reputation", - "total_time_played", - "car_info_setting", - "stock_classic_class", - "stock_muscle_class", - "modified_classic_class", - "modified_muscle_class", - "outlaw_class", - "drag_class", - "challenge_rung", - "offline_ai_car_class", - "offline_ai_skin_id", - "offline_ai_car_bpt_id", - "offline_ai_state", - "bodytype", - "skin_color", - "hair_color", - "shirt_color", - "pants_color", - "offline_driver_style", - "offline_driver_attitude", - "evaded_fuzz", - "pinks_won", - "num_unread_mail", - "total_races_run", - "total_races_won", - "total_races_completed", - "total_winnings", - "insurance_risk_points", - "insurance_rating", - "challenge_races_run", - "challenge_races_won", - "challenge_races_completed", - "cars_lost", - "cars_won", -]; - -const playerCsvRow = [ - [ - 6, - 0, - 1, - 0, - 0, - new Date(0), - 0, - 999999, - 0, - 0, - 0, - 0, - null, - 0, - 0, - 0, - 0, - 0, - 0, - "xxx", - "All Factory Ford", - "1240 A Street", - "ABCDEFGHIJKLMNOPQRST", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], -]; - -export function csvRowToPlayer( - row: (string | number | Date | null)[], -): typeof playerSchema.$inferSelect { - return { - playerId: row[0] as number, - customerId: row[1] as number, - playerTypeId: row[2] as number, - sanctionedScore: row[3] as number, - challengeScore: row[4] as number, - lastLoggedIn: row[5] as Date, - timesLoggedIn: row[6] as number, - bankBalance: row[7] as number, - numCarsOwned: row[8] as number, - isLoggedIn: row[9] as number, - driverStyle: row[10] as number, - lpCode: row[11] as number, - lpText: row[12] as string | null, - carNum1: row[13] as string, - carNum2: row[14] as string, - carNum3: row[15] as string, - carNum4: row[16] as string, - carNum5: row[17] as string, - carNum6: row[18] as string, - dlNumber: row[19] as string, - persona: row[20] as string, - address: row[21] as string, - residence: row[22] as string, - vehicleId: row[23] as number | null, - currentRaceId: row[24] as number | null, - offlineDriverSkill: row[25] as number | null, - offlineGrudge: row[26] as number | null, - offlineReputation: row[27] as number | null, - totalTimePlayed: row[28] as number | null, - carInfoSetting: row[29] as number | null, - stockClassicClass: row[30] as number | null, - stockMuscleClass: row[31] as number | null, - modifiedClassicClass: row[32] as number | null, - modifiedMuscleClass: row[33] as number | null, - outlawClass: row[34] as number | null, - dragClass: row[35] as number | null, - challengeRung: row[36] as number | null, - offlineAiCarClass: row[37] as number | null, - offlineAiSkinId: row[38] as number | null, - offlineAiCarBptId: row[39] as number | null, - offlineAiState: row[40] as number | null, - bodytype: row[41] as number | null, - skinColor: row[42] as number | null, - hairColor: row[43] as number | null, - shirtColor: row[44] as number | null, - pantsColor: row[45] as number | null, - offlineDriverStyle: row[46] as number | null, - offlineDriverAttitude: row[47] as number | null, - evadedFuzz: row[48] as number | null, - pinksWon: row[49] as number | null, - numUnreadMail: row[50] as number | null, - totalRacesRun: row[51] as number | null, - totalRacesWon: row[52] as number | null, - totalRacesCompleted: row[53] as number | null, - totalWinnings: row[54] as number | null, - insuranceRiskPoints: row[55] as number | null, - insuranceRating: row[56] as number | null, - challengeRacesRun: row[57] as number | null, - challengeRacesWon: row[58] as number | null, - challengeRacesCompleted: row[59] as number | null, - carsLost: row[60] as number | null, - carsWon: row[61] as number | null, - }; -} - -for (const row of playerCsvRow) { - if (row.length !== playerCsvHeader.length) { - throw new Error( - `Row length does not match header length: got ${row.length}, expected ${playerCsvHeader.length}`, - ); - } - - const player = [ - csvRowToPlayer( - row.map((value, index) => { - if (typeof value === "undefined") { - throw new Error(`Undefined value at index ${playerCsvHeader[index]}`); - } - - return value; - }), - ), - ]; -} diff --git a/packages/database/test/Player.test.ts b/packages/database/test/Player.test.ts deleted file mode 100644 index 45c333938..000000000 --- a/packages/database/test/Player.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { PlayerModel } from "../src/models/Player.js"; - -describe("Player model", function () { - it("should have a schema property", function () { - expect(PlayerModel.schema).not.equal(""); - }); -}); diff --git a/packages/gateway/index.ts b/packages/gateway/index.ts index 60b379531..34622ec62 100644 --- a/packages/gateway/index.ts +++ b/packages/gateway/index.ts @@ -2,5 +2,4 @@ export { getGatewayServer, Gateway } from "./src/GatewayServer.js"; export { createCommandEncryptionPair, createDataEncryptionPair, - verifyLegacyCipherSupport, } from "./src/encryption.js"; diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index ae856d22c..e4de3b2cf 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -1,6 +1,6 @@ import { Socket, createServer as createSocketServer } from "node:net"; import FastifySensible from "@fastify/sensible"; -import fastify, { type FastifyInstance } from "fastify"; +import fastify from "fastify"; import { ConsoleThread } from "rusty-motors-cli"; import { receiveLobbyData } from "rusty-motors-lobby"; import { receiveLoginData } from "rusty-motors-login"; @@ -9,6 +9,7 @@ import { Configuration, getServerConfiguration, type ServerLogger, + type State, } from "rusty-motors-shared"; import { addOnDataHandler, @@ -26,23 +27,10 @@ import { gameMessageProcessors, } from "rusty-motors-nps"; import { receiveChatData } from "rusty-motors-chat"; - -/** - * Options for the GatewayServer. - */ -type GatewayOptions = { - config?: Configuration; - log?: ServerLogger; - backlogAllowedCount?: number; - listeningPortList?: number[]; - socketConnectionHandler?: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: ServerLogger; - }) => void; -}; +import type { GatewayOptions } from "./types.js"; +import { addPortRouter } from "./portRouters.js"; +import { npsPortRouter } from "./npsPortRouter.js"; +import { mcotsPortRouter } from "./mcotsPortRouter.js"; /** * Gateway server @@ -100,24 +88,12 @@ export class Gateway { Gateway._instance = this; } - /** - * @return {FastifyInstance} - */ - getWebServer(): FastifyInstance { - if (this.webServer === undefined) { - throw Error("webServer is undefined"); - } - return this.webServer; - } - start() { this.log.debug("Starting GatewayServer in start()"); this.log.info("Server starting"); // Check if there are any listening ports specified - if (this.listeningPortList.length === 0) { - throw Error("No listening ports specified"); - } + this.ensureListeningPortsSpecified(); // Mark the GatewayServer as running this.log.debug("Marking GatewayServer as running"); @@ -127,23 +103,13 @@ export class Gateway { this.init(); this.listeningPortList.forEach(async (port) => { - const server = createSocketServer((s) => { - this.socketconnection({ - incomingSocket: s, - log: this.log, - }); - }); - - // Listen on the specified port - - server.listen(port, "0.0.0.0", this.backlogAllowedCount, () => { - this.log.debug(`Listening on port ${port}`); - }); - - // Add the server to the list of servers - this.activeServers.push(server); + this.startNewServer(port); }); + this.startWebServer(); + } + + private startWebServer() { if (this.webServer === undefined) { throw Error("webServer is undefined"); } @@ -166,6 +132,29 @@ export class Gateway { ); } + private ensureListeningPortsSpecified() { + if (this.listeningPortList.length === 0) { + throw Error("No listening ports specified"); + } + } + + private startNewServer(port: number) { + const server = createSocketServer((s) => { + this.socketconnection({ + incomingSocket: s, + log: this.log, + }); + }); + + // Listen on the specified port + server.listen(port, "0.0.0.0", this.backlogAllowedCount, () => { + this.log.debug(`Listening on port ${port}`); + }); + + // Add the server to the list of servers + this.activeServers.push(server); + } + async restart() { // Stop the GatewayServer await this.stop(); @@ -190,19 +179,7 @@ export class Gateway { this.status = "stopping"; // Stop the servers - this.activeServers.forEach((server) => { - server.close(); - }); - - // Stop the read thread - if (this.readThread !== undefined) { - this.readThread.stop(); - } - - if (this.webServer === undefined) { - throw Error("webServer is undefined"); - } - await this.webServer.close(); + await this.shutdownServers(); // Stop the timer if (this.timer !== null) { @@ -218,6 +195,22 @@ export class Gateway { createInitialState({}).save(); } + private async shutdownServers() { + this.activeServers.forEach((server) => { + server.close(); + }); + + // Stop the read thread + if (this.readThread !== undefined) { + this.readThread.stop(); + } + + if (this.webServer === undefined) { + throw Error("webServer is undefined"); + } + await this.webServer.close(); + } + /** * @param {string} event */ @@ -253,19 +246,11 @@ export class Gateway { this.webServer = fastify({}); this.webServer.register(FastifySensible); - let state = fetchStateFromDatabase(); - - state = addOnDataHandler(state, 8226, receiveLoginData); - state = addOnDataHandler(state, 8227, receiveChatData); - state = addOnDataHandler(state, 8228, receivePersonaData); - state = addOnDataHandler(state, 7003, receiveLobbyData); - state = addOnDataHandler(state, 9000, receiveChatData); - state = addOnDataHandler(state, 43300, receiveTransactionsData); - - state.save(); - - populatePortToMessageTypes(portToMessageTypes); - populateGameMessageProcessors(gameMessageProcessors); + addPortRouter(8226, npsPortRouter); + addPortRouter(8227, npsPortRouter); + addPortRouter(8228, npsPortRouter); + addPortRouter(7003, npsPortRouter); + addPortRouter(43300, mcotsPortRouter); this.log.debug("GatewayServer initialized"); } diff --git a/packages/gateway/src/encryption.ts b/packages/gateway/src/encryption.ts index f68a5fc8c..6ff9af740 100644 --- a/packages/gateway/src/encryption.ts +++ b/packages/gateway/src/encryption.ts @@ -14,36 +14,50 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { createCipheriv, createDecipheriv, getCiphers } from "node:crypto"; -import { McosEncryptionPair } from "rusty-motors-shared"; +import { createCipheriv, createDecipheriv } from "node:crypto"; +import { + McosEncryptionPair, + verifyLegacyCipherSupport, +} from "rusty-motors-shared"; /** * This function creates a new encryption pair for use with the game server * * @param {string} key The key to use for encryption * @returns {McosEncryptionPair} The encryption pair + * @throws Error if the key is too short + * @throws Error if the server does not support the legacy ciphers */ export function createCommandEncryptionPair(key: string): McosEncryptionPair { - if (key.length < 16) { - throw Error("Key too short"); - } + try { + verifyLegacyCipherSupport(); + + if (key.length < 16) { + throw Error("Key too short"); + } - const sKey = key.slice(0, 16); + const sKey = key.slice(0, 16); - // Deepcode ignore HardcodedSecret: This uses an empty IV - const desIV = Buffer.alloc(8); + // Deepcode ignore HardcodedSecret: This uses an empty IV + const desIV = Buffer.alloc(8); - const gsCipher = createCipheriv("des-cbc", Buffer.from(sKey, "hex"), desIV); - gsCipher.setAutoPadding(false); + const gsCipher = createCipheriv("des-cbc", Buffer.from(sKey, "hex"), desIV); + gsCipher.setAutoPadding(false); - const gsDecipher = createDecipheriv( - "des-cbc", - Buffer.from(sKey, "hex"), - desIV, - ); - gsDecipher.setAutoPadding(false); + const gsDecipher = createDecipheriv( + "des-cbc", + Buffer.from(sKey, "hex"), + desIV, + ); + gsDecipher.setAutoPadding(false); - return new McosEncryptionPair(gsCipher, gsDecipher); + return new McosEncryptionPair(gsCipher, gsDecipher); + } catch (error) { + const err = new Error(`Error creating command encryption pair: ${error}`, { + cause: error, + }); + throw err; + } } /** @@ -66,16 +80,3 @@ export function createDataEncryptionPair(key: string): McosEncryptionPair { return new McosEncryptionPair(tsCipher, tsDecipher); } - -/** - * This function checks if the server supports the legacy ciphers - * - * @returns void - * @throws Error if the server does not support the legacy ciphers - */ -export function verifyLegacyCipherSupport() { - const cipherList = getCiphers(); - if (!cipherList.includes("des-cbc") || !cipherList.includes("rc4")) { - throw Error("Legacy ciphers not available"); - } -} diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 0935c0ca9..1e625445e 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -14,44 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { - type OnDataHandler, - type ServerLogger, - type ServiceResponse, - fetchStateFromDatabase, - getOnDataHandler, -} from "rusty-motors-shared"; +import { type ServerLogger } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; -import { newSocket, type ConnectedSocket } from "rusty-motors-socket"; import { Socket } from "node:net"; -import { getGatewayServer } from "./GatewayServer.js"; -import { getPortMessageType, UserStatusManager } from "rusty-motors-nps"; -import { BasePacket } from "rusty-motors-shared-packets"; -import * as Sentry from "@sentry/node"; -import { socketErrorHandler } from "./socketErrorHandler.js"; - -/** - * Handle the end of a socket connection - * - * @param {object} options - * @param {string} options.connectionId The connection ID - * @param {import("pino").Logger} [options.log=getServerLogger({ name: "socketEndHandler" })] The logger to use - */ -// export function socketEndHandler({ -// connectionId, -// log = getServerLogger({ -// name: "socketEndHandler", -// }), -// }: { -// connectionId: string; -// log?: ServerLogger; -// }) { -// log.debug(`Connection ${connectionId} ended`); - -// // Remove the socket from the global state -// removeSocket(fetchStateFromDatabase(), connectionId).save(); -// } +import { randomUUID } from "node:crypto"; +import { tagSocketWithId } from "./socketUtility.js"; +import { getPortRouter } from "./portRouters.js"; /** * Handle incoming TCP connections @@ -64,7 +33,7 @@ import { socketErrorHandler } from "./socketErrorHandler.js"; export function onSocketConnection({ incomingSocket, log = getServerLogger({ - name: "onDataHandler", + name: "gatewayServer.onSocketConnection", }), }: { incomingSocket: Socket; @@ -73,160 +42,185 @@ export function onSocketConnection({ // Get the local port and remote address const { localPort, remoteAddress } = incomingSocket; + // If the local port or remote address is undefined, throw an error if (localPort === undefined || remoteAddress === undefined) { throw Error("localPort or remoteAddress is undefined"); } - const socket = newSocket(incomingSocket); - - // ======================= - // Handle incoming socket in shadow mode - // ======================= - - try { - // Get expected message type - const messageType = getPortMessageType(localPort); - log.debug(`[${socket.id}] Expected message type: ${messageType}`); - - switch (messageType) { - case "Game": { - // Handle game messages - // Create a new user status - const userStatus = UserStatusManager.newUserStatus(); - log.debug(`[${socket.id}] Created new user status`); - - UserStatusManager.addUserStatus(userStatus); - log.debug(`[${socket.id}] Added user status to manager`); - - break; - } - - case "Server": { - // Handle server messages - break; - } - - default: { - log.warn(`[${socket.id}] No message type found`); - break; - } - } - } catch (error) { - log.error(`[${socket.id}] Error handling socket: ${error}`); - } - - - - socket.on("error", (error) => - socketErrorHandler({ connectionId: socket.id, error }), + const socketWithId = tagSocketWithId( + incomingSocket, + Date.now(), + randomUUID(), ); - // Add the data handler to the socket - socket.on("inData", (data) => { - socketDataHandler(socket, data, log); - }); - - log.debug( - `[${socket.id}] Socket connection established on port ${localPort} from ${remoteAddress}`, - ); - - if (localPort === 7003) { - // Sent ok to login packet - socket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); - } + /* + * At this point, we have a tagged socket with an ID. + */ + + const portRouter = getPortRouter(localPort); + + // Hand the socket to the port router + portRouter({ taggedSocket: socketWithId }) + .then(() => { + log.debug(`[${socketWithId.id}] Port router finished`); + }) + .catch((error) => { + log.error(`[${socketWithId.id}] Error in port router: ${error}`); + }); + + // // Should end here + + // try { + // // Get expected message type + // const messageType = getPortMessageType(localPort); + // log.debug(`[${socketWithId.id}] Expected message type: ${messageType}`); + + // switch (messageType) { + // case "Game": { + // // Handle game messages + // // Create a new user status + // const userStatus = UserStatusManager.newUserStatus(); + // log.debug(`[${socketWithId.id}] Created new user status`); + + // UserStatusManager.addUserStatus(userStatus); + // log.debug(`[${socketWithId.id}] Added user status to manager`); + + // break; + // } + + // case "Server": { + // // Handle server messages + // break; + // } + + // default: { + // log.warn(`[${socketWithId.id}] No message type found`); + // break; + // } + // } + // } catch (error) { + // log.error(`[${socketWithId.id}] Error handling socket: ${error}`); + // } + + // socketWithId.socket.on("error", (error) => + // socketErrorHandler({ connectionId: socketWithId.id, error }), + // ); + + // // Add the data handler to the socket + // socketWithId.socket.on("data", (data) => { + // socketDataHandler(socketWithId, data, log); + // }); + + // log.debug( + // `[${socketWithId.id}] Socket connection established on port ${localPort} from ${remoteAddress}`, + // ); + + // if (localPort === 7003) { + // // Sent ok to login packet + // log.debug(`[${socketWithId.id}] Sending ok to login packet`); + // socketWithId.socket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); + // } } -function socketDataHandler( - socket: ConnectedSocket, - incomingDataAsBuffer: Buffer, - log: ServerLogger, -) { - log.trace( - `[${socket.id}] Received data: ${incomingDataAsBuffer.toString("hex")}`, - ); - - // This is a new TCP socket, so it's probably not using HTTP - // Let's look for a port onData handler - /** @type {OnDataHandler | undefined} */ - const portOnDataHandler: OnDataHandler | undefined = getOnDataHandler( - fetchStateFromDatabase(), - socket.port, - ); - - // If there is no onData handler, log a warning and return - if (!portOnDataHandler) { - log.warn(`[${socket.id}] No onData handler found for port ${socket.port}`); - log.warn(`[${socket.id}] Received data: ${socket.peek().toString("hex")}`); - return; - } - - // Deserialize the raw message - const rawMessage = new BasePacket({ - connectionId: socket.id, - messageId: 0, - messageSequence: 0, - messageSource: "", - }); - rawMessage.deserialize(incomingDataAsBuffer); - - // Log the raw message - log.trace(`[${socket.id}] Raw message: ${rawMessage.toHexString()}`); - - log.debug(`[${socket.id}] Handling data with ${portOnDataHandler.name}`); - - Sentry.startSpan( - { - name: "onDataHandler", - op: "onDataHandler", - }, - async () => { - portOnDataHandler({ - connectionId: socket.id, - message: rawMessage, - }) - .then((response: ServiceResponse) => { - log.debug( - `[${socket.id}] Data handler returned with ${response.messages.length} messages`, - ); - const { messages } = response; - - // Log the messages - log.trace( - `[${socket.id}] Messages: ${messages.map((m) => m.toString()).join(", ")}`, - ); - - // Serialize the messages - const serializedMessages = messages.map((m) => m.serialize()); - - try { - // Send the messages - serializedMessages.forEach((m) => { - socket.write(m); - log.trace(`[${socket.id}] Sent message: ${m.toString("hex")}`); - }); - } catch (error) { - const err = new Error( - `[${socket.id}] Error sending messages: ${(error as Error).message}`, - { cause: error }, - ); - throw err; - } - }) - .catch((error: Error) => { - const err = new Error(`[${socket.id}] Error in onData handler: ${error.message}`, { - cause: error, - }); - log.fatal(`${err.message}`); - const id = Sentry.captureException(err); - console.trace(error); - log.fatal(`Sentry event ID: ${id}`); - void getGatewayServer({}).stop(); - Sentry.flush(200).then(() => { - log.debug("Sentry flushed"); - // Call server shutdown - void getGatewayServer({}).shutdown(); - }); - }); - }, - ); -} +// function socketDataHandler( +// taggedSocket: TaggedSocket, +// incomingDataAsBuffer: Buffer, +// log: ServerLogger, +// ) { +// log.trace( +// `[${taggedSocket.id}] Received data: ${incomingDataAsBuffer.toString("hex")}`, +// ); + +// // This is a new TCP socket, so it's probably not using HTTP +// // Let's look for a port onData handler +// /** @type {OnDataHandler | undefined} */ +// const portOnDataHandler: OnDataHandler | undefined = getOnDataHandler( +// fetchStateFromDatabase(), +// taggedSocket.socket.localPort || 0, +// ); + +// // If there is no onData handler, log a warning and return +// if (!portOnDataHandler) { +// log.warn( +// `[${taggedSocket.id}] No onData handler found for port ${taggedSocket.socket.localPort}`, +// ); +// return; +// } + +// // Deserialize the raw message +// const rawMessage = new BasePacket({ +// connectionId: taggedSocket.id, +// messageId: 0, +// sequence: 0, +// messageSource: "", +// }); +// rawMessage.deserialize(incomingDataAsBuffer); + +// // Log the raw message +// log.trace(`[${taggedSocket.id}] Raw message: ${rawMessage.toHexString()}`); + +// log.debug( +// `[${taggedSocket.id}] Handling data with ${portOnDataHandler.name}`, +// ); + +// Sentry.startSpan( +// { +// name: "onDataHandler", +// op: "onDataHandler", +// }, +// async () => { +// portOnDataHandler({ +// connectionId: taggedSocket.id, +// message: rawMessage, +// }) +// .then((response: ServiceResponse) => { +// log.debug( +// `[${taggedSocket.id}] Data handler returned with ${response.messages.length} messages`, +// ); +// const { messages } = response; + +// // Log the messages +// log.trace( +// `[${taggedSocket.id}] Messages: ${messages.map((m) => m.toString()).join(", ")}`, +// ); + +// // Serialize the messages +// const serializedMessages = messages.map((m) => m.serialize()); + +// try { +// // Send the messages +// serializedMessages.forEach((m) => { +// taggedSocket.socket.write(m); +// log.trace( +// `[${taggedSocket.id}] Sent message: ${m.toString("hex")}`, +// ); +// }); +// } catch (error) { +// const err = new Error( +// `[${taggedSocket.id}] Error sending messages: ${(error as Error).message}`, +// { cause: error }, +// ); +// throw err; +// } +// }) +// .catch((error: Error) => { +// const err = new Error( +// `[${taggedSocket.id}] Error in onData handler: ${error.message}`, +// { +// cause: error, +// }, +// ); +// log.fatal(`${err.message}`); +// const id = Sentry.captureException(err); +// console.trace(error); +// log.fatal(`Sentry event ID: ${id}`); +// void getGatewayServer({}).stop(); +// Sentry.flush(200).then(() => { +// log.debug("Sentry flushed"); +// // Call server shutdown +// void getGatewayServer({}).shutdown(); +// }); +// }); +// }, +// ); +// } diff --git a/packages/gateway/src/mcotsPortRouter.ts b/packages/gateway/src/mcotsPortRouter.ts new file mode 100644 index 000000000..4663123ad --- /dev/null +++ b/packages/gateway/src/mcotsPortRouter.ts @@ -0,0 +1,106 @@ +import { getServerLogger, type ServerLogger } from "rusty-motors-shared"; +import type { TaggedSocket } from "./socketUtility.js"; +import { + ServerPacket, + type SerializableInterface, +} from "rusty-motors-shared-packets"; +import { receiveTransactionsData } from "rusty-motors-transactions"; + +/** + * Handles the routing of messages for the MCOTS (Motor City Online Transaction Server) ports. + * + * @param taggedSocket - The socket object that contains the tagged information for routing. + */ + +export async function mcotsPortRouter({ + taggedSocket, + log = getServerLogger({ + name: "gatewayServer.mcotsPortRouter", + }), +}: { + taggedSocket: TaggedSocket; + log?: ServerLogger; +}): Promise { + const { socket, id } = taggedSocket; + + const port = socket.localPort || 0; + + if (port === 0) { + log.error(`[${id}] Local port is undefined`); + socket.end(); + return; + } + + log.debug(`[${taggedSocket.id}] MCOTS port router started for port ${port}`); + + // Handle the socket connection here + socket.on("data", (data) => { + try { + log.debug(`[${id}] Received data: ${data.toString("hex")}`); + const initialPacket = parseInitialMessage(data); + log.debug(`[${id}] Initial packet(str): ${initialPacket}`); + log.debug(`[${id}] initial Packet(hex): ${initialPacket.toHexString()}`); + routeInitialMessage(id, port, initialPacket) + .then((response) => { + // Send the response back to the client + log.debug(`[${id}] Sending response: ${response.toString("hex")}`); + socket.write(response); + }) + .catch((error) => { + log.error(`[${id}] Error routing initial message: ${error}`); + }); + } catch (error) { + log.error(`[${id}] Error parsing initial message: ${error}`); + } + }); + + socket.on("end", () => { + log.debug(`[${id}] Socket closed`); + }); + + socket.on("error", (error) => { + log.error(`[${id}] Socket error: ${error}`); + }); +} + +function parseInitialMessage(data: Buffer): ServerPacket { + const initialPacket = new ServerPacket(); + initialPacket.deserialize(data); + return initialPacket; +} + +async function routeInitialMessage( + id: string, + port: number, + initialPacket: ServerPacket, + log = getServerLogger({ name: "gatewayServer.routeInitialMessage" }), +): Promise { + // Route the initial message to the appropriate handler + // Messages may be encrypted, this will be handled by the handler + + log.debug(`Routing message for port ${port}: ${initialPacket.toHexString()}`); + let responses: SerializableInterface[] = []; + + switch (port) { + case 43300: + // Handle transactions packet + responses = ( + await receiveTransactionsData({ + connectionId: id, + message: initialPacket, + }) + ).messages; + break; + default: + console.log(`No handler found for port ${port}`); + break; + } + + // Send responses back to the client + log.debug(`[${id}] Sending ${responses.length} responses`); + + // Serialize the responses + const serializedResponses = responses.map((response) => response.serialize()); + + return Buffer.concat(serializedResponses); +} diff --git a/packages/gateway/src/npsPortRouter.ts b/packages/gateway/src/npsPortRouter.ts new file mode 100644 index 000000000..854bde973 --- /dev/null +++ b/packages/gateway/src/npsPortRouter.ts @@ -0,0 +1,126 @@ +import { getServerLogger, type ServerLogger } from "rusty-motors-shared"; +import type { TaggedSocket } from "./socketUtility.js"; +import { + GamePacket, + type SerializableInterface, +} from "rusty-motors-shared-packets"; +import { receiveLobbyData } from "rusty-motors-lobby"; +import { receiveChatData } from "rusty-motors-chat"; +import { receivePersonaData } from "rusty-motors-personas"; +import { receiveLoginData } from "rusty-motors-login"; + +/** + * Handles routing for the NPS (Network Play System) ports. + * + * @param taggedSocket - The socket that has been tagged with additional metadata. + */ + +export async function npsPortRouter({ + taggedSocket, + log = getServerLogger({ + name: "gatewayServer.npsPortRouter", + }), +}: { + taggedSocket: TaggedSocket; + log?: ServerLogger; +}): Promise { + const { socket, id } = taggedSocket; + + const port = socket.localPort || 0; + + if (port === 0) { + log.error(`[${id}] Local port is undefined`); + socket.end(); + return; + } + log.debug(`[${taggedSocket.id}] NPS port router started for port ${port}`); + + if (port === 7003) { + // Sent ok to login packet + log.debug(`[${id}] Sending ok to login packet`); + taggedSocket.socket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); + } + + // Handle the socket connection here + socket.on("data", (data) => { + log.debug(`[${id}] Received data: ${data.toString("hex")}`); + const initialPacket = parseInitialMessage(data); + log.debug(`[${id}] Initial packet(str): ${initialPacket}`); + log.debug(`[${id}] initial Packet(hex): ${initialPacket.toHexString()}`); + routeInitialMessage(id, port, initialPacket) + .then((response) => { + // Send the response back to the client + log.debug(`[${id}] Sending response: ${response.toString("hex")}`); + socket.write(response); + }) + .catch((error) => { + log.error(`[${id}] Error routing initial message: ${error}`); + }); + }); + + socket.on("end", () => { + log.debug(`[${id}] Socket closed`); + }); + + socket.on("error", (error) => { + log.error(`[${id}] Socket error: ${error}`); + }); +} + +function parseInitialMessage(data: Buffer): GamePacket { + const initialPacket = new GamePacket(); + initialPacket.deserialize(data); + return initialPacket; +} + +async function routeInitialMessage( + id: string, + port: number, + initialPacket: GamePacket, + log = getServerLogger({ name: "gatewayServer.routeInitialMessage" }), +): Promise { + // Route the initial message to the appropriate handler + // Messages may be encrypted, this will be handled by the handler + + console.log( + `Routing message for port ${port}: ${initialPacket.toHexString()}`, + ); + let responses: SerializableInterface[] = []; + + switch (port) { + case 7003: + responses = ( + await receiveLobbyData({ connectionId: id, message: initialPacket }) + ).messages; + break; + case 8226: + // Handle login packet + responses = ( + await receiveLoginData({ connectionId: id, message: initialPacket }) + ).messages; + break; + case 8227: + // Handle chat packet + responses = ( + await receiveChatData({ connectionId: id, message: initialPacket }) + ).messages; + break; + case 8228: + // responses =Handle persona packet + responses = ( + await receivePersonaData({ connectionId: id, message: initialPacket }) + ).messages; + break; + default: + console.log(`No handler found for port ${port}`); + break; + } + + // Send responses back to the client + log.debug(`[${id}] Sending ${responses.length} responses`); + + // Serialize the responses + const serializedResponses = responses.map((response) => response.serialize()); + + return Buffer.concat(serializedResponses); +} diff --git a/packages/gateway/src/portRouters.ts b/packages/gateway/src/portRouters.ts new file mode 100644 index 000000000..9d5960ec1 --- /dev/null +++ b/packages/gateway/src/portRouters.ts @@ -0,0 +1,81 @@ +import { getServerLogger, type ServerLogger } from "rusty-motors-shared"; +import type { TaggedSocket } from "./socketUtility.js"; +type PortRouter = (portRouterArgs: { + taggedSocket: TaggedSocket; + log?: ServerLogger; +}) => Promise; + +/** + * A map that associates port numbers with their corresponding router functions. + * Each router function takes a `Socket` object as an argument and returns a `Promise`. + */ +const portRouters = new Map(); + +/** + * Registers a router function for a specific port. + * + * @param port - The port number to associate with the router. + * @param router - A function that handles the socket connection for the specified port. + */ + +export function addPortRouter(port: number, router: PortRouter) { + if (!Number.isInteger(port) || port < 0 || port > 65535) { + throw new Error(`Invalid port number: ${port}`); + } + portRouters.set(port, router); +} +/** + * Handles the case where no router is found for the given socket. + * + * This function will terminate the socket connection and throw an error + * indicating that no router was found for the port. + * + * @param taggedSocket - The socket connection that could not be routed. + * @throws {Error} Throws an error indicating no router was found for the port. + */ + +async function notFoundRouter({ + taggedSocket, + log = getServerLogger({ + name: "gatewayServer.notFoundRouter", + }), +}: { + taggedSocket: TaggedSocket; + log?: ServerLogger; +}) { + taggedSocket.socket.on("error", (error) => { + console.error(`[${taggedSocket.id}] Socket error: ${error}`); + }); + taggedSocket.socket.end(); + log.error( + `[${taggedSocket.id}] No router found for port ${taggedSocket.socket.localPort}`, + ); +} +/** + * Retrieves the router function associated with a given port. + * + * @param port - The port number for which to retrieve the router. + * @returns A function that takes a socket and returns a promise resolving to void. + * If no router is found for the given port, returns the `notFoundRouter` function. + */ + +export function getPortRouter(port: number): PortRouter { + if (!Number.isInteger(port) || port < 0 || port > 65535) { + throw new Error(`Invalid port number: ${port}`); + } + const router = portRouters.get(port); + if (typeof router === "undefined") { + return notFoundRouter; + } + return router; +} + +/** + * Clears all entries from the portRouters map. + * + * This function removes all key-value pairs from the portRouters map, + * effectively resetting it to an empty state. + */ +export function clearPortRouters() { + portRouters.clear(); +} diff --git a/packages/gateway/src/socketUtility.ts b/packages/gateway/src/socketUtility.ts new file mode 100644 index 000000000..af669b10e --- /dev/null +++ b/packages/gateway/src/socketUtility.ts @@ -0,0 +1,44 @@ +import type { Socket } from "net"; + +export type TaggedSocket = { + id: string; + socket: Socket; + connectionStamp: number; +}; + +/** + * Tags a socket with an ID and a connection timestamp. + * + * @param socket - The socket to be tagged. + * @param connectionStamp - The timestamp of the connection. + * @param id - The unique identifier to tag the socket with. + * @returns An object containing the id, socket, and connectionStamp. + */ + +export function tagSocketWithId( + socket: Socket, + connectionStamp: number, + id: string, +): TaggedSocket { + return { id, socket, connectionStamp }; +} + +/** + * Attempts to write data to a socket and returns a promise that resolves when the write is successful, + * or rejects if an error occurs during the write operation. + * + * @param socket - The tagged socket to which the data will be written. + * @param data - The string data to be written to the socket. + * @returns A promise that resolves when the data is successfully written, or rejects with an error if the write fails. + */ +export async function trySocketWrite(socket: TaggedSocket, data: string): Promise { + return new Promise((resolve, reject) => { + socket.socket.write(data, (error) => { + if (error) { + reject(error); + } else { + resolve(); + } + }); + }); +} diff --git a/packages/gateway/src/types.ts b/packages/gateway/src/types.ts new file mode 100644 index 000000000..95e2e9c36 --- /dev/null +++ b/packages/gateway/src/types.ts @@ -0,0 +1,19 @@ +import type { Socket } from "net"; +import type { Configuration, ServerLogger } from "rusty-motors-shared"; + +/** + * Options for the GatewayServer. + */ +export type GatewayOptions = { + config?: Configuration; + log?: ServerLogger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: ServerLogger; + }) => void; +}; diff --git a/packages/gateway/test/mcotsPortRouter.test.ts b/packages/gateway/test/mcotsPortRouter.test.ts new file mode 100644 index 000000000..c744f5f18 --- /dev/null +++ b/packages/gateway/test/mcotsPortRouter.test.ts @@ -0,0 +1,112 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { mcotsPortRouter } from "../src/mcotsPortRouter.js"; +import type { TaggedSocket } from "../src/socketUtility.js"; +import { ServerPacket } from "rusty-motors-shared-packets"; + +describe("mcotsPortRouter", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should log an error and close the socket if local port is undefined", async () => { + const mockSocket = { + localPort: undefined, + end: vi.fn(), + on: vi.fn(), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await mcotsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "[test-id] Local port is undefined", + ); + expect(mockSocket.end).toHaveBeenCalled(); + }); + + it("should handle data event and route initial message", async () => { + const mockSocket = { + localPort: 43300, + write: vi.fn(), + on: vi.fn((event, callback) => { + if (event === "data") { + callback(Buffer.from([0x74, 0x65, 0x73, 0x74, 0x2d, 0x64, 0x61, 0x74, 0x61])); + } + }), + }; + const mockLog = { + debug: vi.fn(), + error: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id-mcots" }; + + const mockServerPacket = { + deserialize: vi.fn(), + toHexString: vi.fn().mockReturnValue("746573742d64617461"), + }; + vi.spyOn(ServerPacket.prototype, "deserialize").mockImplementation( + mockServerPacket.deserialize, + ); + vi.spyOn(ServerPacket.prototype, "toHexString").mockImplementation( + mockServerPacket.toHexString, + ); + + await mcotsPortRouter({ taggedSocket, log: mockLog }); + + expect(mockLog.debug).toHaveBeenCalledWith( + "[test-id-mcots] Received data: 746573742d64617461", + ); + expect(mockLog.debug).toHaveBeenCalledWith( + "[test-id-mcots] Initial packet(str): ServerPacket {length: 0, sequence: 0, messageId: 0}", + ); + expect(mockLog.debug).toHaveBeenCalledWith( + "[test-id-mcots] initial Packet(hex): 746573742d64617461", + ); + }); + + it("should log socket end event", async () => { + const mockSocket = { + localPort: 43300, + on: vi.fn((event, callback) => { + if (event === "end") { + callback(); + } + }), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await mcotsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.debug).toHaveBeenCalledWith("[test-id] Socket closed"); + }); + + it("should log socket error event", async () => { + const mockSocket = { + localPort: 43300, + on: vi.fn((event, callback) => { + if (event === "error") { + callback(new Error("test-error")); + } + }), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await mcotsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "[test-id] Socket error: Error: test-error", + ); + }); +}); diff --git a/packages/gateway/test/npsPortRouter.test.ts b/packages/gateway/test/npsPortRouter.test.ts new file mode 100644 index 000000000..02b01e72f --- /dev/null +++ b/packages/gateway/test/npsPortRouter.test.ts @@ -0,0 +1,139 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { npsPortRouter } from "../src/npsPortRouter.js"; +import type { TaggedSocket } from "../src/socketUtility.js"; +import { GamePacket } from "rusty-motors-shared-packets"; + +describe("npsPortRouter", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should log an error and close the socket if local port is undefined", async () => { + const mockSocket = { + localPort: undefined, + end: vi.fn(), + on: vi.fn(), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await npsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "[test-id] Local port is undefined", + ); + expect(mockSocket.end).toHaveBeenCalled(); + }); + + it("should log the start of the router and send ok to login packet for port 7003", async () => { + const mockSocket = { + localPort: 7003, + write: vi.fn(), + on: vi.fn(), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await npsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "[test-id] NPS port router started for port 7003", + ); + expect(mockLogger.debug).toHaveBeenCalledWith( + "[test-id] Sending ok to login packet", + ); + expect(mockSocket.write).toHaveBeenCalledWith( + Buffer.from([0x02, 0x30, 0x00, 0x00]), + ); + }); + + it("should handle data event and route initial message", async () => { + const mockSocket = { + localPort: 8228, + write: vi.fn(), + on: vi.fn((event, callback) => { + if (event === "data") { + callback(Buffer.from([0x01, 0x02, 0x03])); + } + }), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id-nps" }; + + const mockGamePacket = { + deserialize: vi.fn(), + toHexString: vi.fn().mockReturnValue("010203"), + }; + vi.spyOn(GamePacket.prototype, "deserialize").mockImplementation( + mockGamePacket.deserialize, + ); + vi.spyOn(GamePacket.prototype, "toHexString").mockImplementation( + mockGamePacket.toHexString, + ); + + await npsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "[test-id-nps] Received data: 010203", + ); + expect(mockLogger.debug).toHaveBeenCalledWith( + "[test-id-nps] Initial packet(str): GamePacket {length: 0, messageId: 0}", + ); + expect(mockLogger.debug).toHaveBeenCalledWith( + "[test-id-nps] initial Packet(hex): 010203", + ); + }); + + it("should log socket end event", async () => { + const mockSocket = { + localPort: 7003, + on: vi.fn((event, callback) => { + if (event === "end") { + callback(); + } + }), + write: vi.fn(), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await npsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.debug).toHaveBeenCalledWith("[test-id] Socket closed"); + }); + + it("should log socket error event", async () => { + const mockSocket = { + localPort: 7003, + on: vi.fn((event, callback) => { + if (event === "error") { + callback(new Error("Test error")); + } + }), + write: vi.fn(), + }; + const mockLogger = { + error: vi.fn(), + debug: vi.fn(), + }; + const taggedSocket: TaggedSocket = { socket: mockSocket, id: "test-id" }; + + await npsPortRouter({ taggedSocket, log: mockLogger }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "[test-id] Socket error: Error: Test error", + ); + }); +}); diff --git a/packages/gateway/test/portRouters.test.ts b/packages/gateway/test/portRouters.test.ts new file mode 100644 index 000000000..311999da6 --- /dev/null +++ b/packages/gateway/test/portRouters.test.ts @@ -0,0 +1,181 @@ +import { describe, expect, it, vi } from "vitest"; +import { + addPortRouter, + clearPortRouters, + getPortRouter, +} from "../src/portRouters.js"; +import { beforeEach } from "vitest"; + +describe("addPortRouter", () => { + it("should add a router for a specific port", () => { + // arrange + const port = 8080; + const mockRouter = vi.fn().mockResolvedValue(undefined); + + // act + addPortRouter(port, mockRouter); + const retrievedRouter = getPortRouter(port); + + // assert + expect(retrievedRouter).toBe(mockRouter); + }); + + it("should overwrite an existing router for the same port", () => { + // arrange + const port = 8080; + const mockRouter1 = vi.fn().mockResolvedValue(undefined); + const mockRouter2 = vi.fn().mockResolvedValue(undefined); + + // act + addPortRouter(port, mockRouter1); + addPortRouter(port, mockRouter2); + const retrievedRouter = getPortRouter(port); + + // assert + expect(retrievedRouter).toBe(mockRouter2); + }); + + it("should handle multiple ports correctly", () => { + // arrange + const port1 = 8080; + const port2 = 9090; + const mockRouter1 = vi.fn().mockResolvedValue(undefined); + const mockRouter2 = vi.fn().mockResolvedValue(undefined); + + // act + addPortRouter(port1, mockRouter1); + addPortRouter(port2, mockRouter2); + const retrievedRouter1 = getPortRouter(port1); + const retrievedRouter2 = getPortRouter(port2); + + // assert + expect(retrievedRouter1).toBe(mockRouter1); + expect(retrievedRouter2).toBe(mockRouter2); + }); + + describe("getPortRouter", () => { + beforeEach(() => { + clearPortRouters(); + vi.resetAllMocks(); + }); + + it("should return the correct router for a specific port", () => { + // arrange + const port = 8080; + const mockRouter = vi.fn().mockResolvedValue(undefined); + addPortRouter(port, mockRouter); + + // act + const retrievedRouter = getPortRouter(port); + + // assert + expect(retrievedRouter).toBe(mockRouter); + }); + + it("should return notFoundRouter if no router is found for the port", () => { + // arrange + const port = 8080; + // act + const retrievedRouter = getPortRouter(port); + + // assert + expect(retrievedRouter).toBeInstanceOf(Function); + expect(retrievedRouter.name).toBe("notFoundRouter"); + }); + + it("should return the correct router after overwriting an existing router for the same port", () => { + // arrange + const port = 8080; + const mockRouter1 = vi.fn().mockResolvedValue(undefined); + const mockRouter2 = vi.fn().mockResolvedValue(undefined); + addPortRouter(port, mockRouter1); + addPortRouter(port, mockRouter2); + + // act + const retrievedRouter = getPortRouter(port); + + // assert + expect(retrievedRouter).toBe(mockRouter2); + }); + + it("should handle multiple ports correctly", () => { + // arrange + const port1 = 8080; + const port2 = 9090; + const mockRouter1 = vi.fn().mockResolvedValue(undefined); + const mockRouter2 = vi.fn().mockResolvedValue(undefined); + addPortRouter(port1, mockRouter1); + addPortRouter(port2, mockRouter2); + + // act + const retrievedRouter1 = getPortRouter(port1); + const retrievedRouter2 = getPortRouter(port2); + + // assert + expect(retrievedRouter1).toBe(mockRouter1); + expect(retrievedRouter2).toBe(mockRouter2); + }); + }); +describe("clearPortRouters", () => { + beforeEach(() => { + clearPortRouters(); + vi.resetAllMocks(); + }); + + it("should clear all routers", () => { + // arrange + const port1 = 8080; + const port2 = 9090; + const mockRouter1 = vi.fn().mockResolvedValue(undefined); + const mockRouter2 = vi.fn().mockResolvedValue(undefined); + addPortRouter(port1, mockRouter1); + addPortRouter(port2, mockRouter2); + + // act + clearPortRouters(); + const retrievedRouter1 = getPortRouter(port1); + const retrievedRouter2 = getPortRouter(port2); + + // assert + expect(retrievedRouter1).toBeInstanceOf(Function); + expect(retrievedRouter1.name).toBe("notFoundRouter"); + expect(retrievedRouter2).toBeInstanceOf(Function); + expect(retrievedRouter2.name).toBe("notFoundRouter"); + }); + + describe("addPortRouter", () => { + it("should throw an error if the port number is not an integer", () => { + // arrange + const port = 8080.5; + const mockRouter = vi.fn().mockResolvedValue(undefined); + + // act & assert + expect(() => addPortRouter(port, mockRouter)).toThrow( + `Invalid port number: ${port}` + ); + }); + + it("should throw an error if the port number is negative", () => { + // arrange + const port = -1; + const mockRouter = vi.fn().mockResolvedValue(undefined); + + // act & assert + expect(() => addPortRouter(port, mockRouter)).toThrow( + `Invalid port number: ${port}` + ); + }); + + it("should throw an error if the port number is greater than 65535", () => { + // arrange + const port = 65536; + const mockRouter = vi.fn().mockResolvedValue(undefined); + + // act & assert + expect(() => addPortRouter(port, mockRouter)).toThrow( + `Invalid port number: ${port}` + ); + }); + }); +}); +}); diff --git a/packages/gateway/src/socketErrorHandler.test.ts b/packages/gateway/test/socketErrorHandler.test.ts similarity index 76% rename from packages/gateway/src/socketErrorHandler.test.ts rename to packages/gateway/test/socketErrorHandler.test.ts index 98c905e50..533f53ca8 100644 --- a/packages/gateway/src/socketErrorHandler.test.ts +++ b/packages/gateway/test/socketErrorHandler.test.ts @@ -1,16 +1,14 @@ import { describe, it, expect, vi } from "vitest"; -import { socketErrorHandler } from "./socketErrorHandler.js"; +import { socketErrorHandler } from "../src/socketErrorHandler.js"; import { type ServerLogger } from "rusty-motors-shared"; describe("socketErrorHandler", () => { - it("should log a debug message when error code is ECONNRESET", () => { const connectionId = "12345"; const error = { code: "ECONNRESET" } as NodeJS.ErrnoException; - const mockLogger = { - debug: vi.fn(), - } as unknown as ServerLogger; - + const mockLogger = { + debug: vi.fn(), + } as unknown as ServerLogger; socketErrorHandler({ connectionId, error, log: mockLogger }); @@ -25,14 +23,12 @@ describe("socketErrorHandler", () => { code: "EUNKNOWN", message: "Unknown error", } as NodeJS.ErrnoException; - const mockLogger = { - debug: vi.fn(), - } as unknown as ServerLogger; - + const mockLogger = { + debug: vi.fn(), + } as unknown as ServerLogger; expect(() => socketErrorHandler({ connectionId, error, log: mockLogger }), ).toThrow(`Socket error: ${error.message} on connection ${connectionId}`); }); - }); diff --git a/packages/gateway/test/socketUtility.test.ts b/packages/gateway/test/socketUtility.test.ts new file mode 100644 index 000000000..252f1ff0d --- /dev/null +++ b/packages/gateway/test/socketUtility.test.ts @@ -0,0 +1,96 @@ +import type { Socket } from "net"; +import { describe, expect, it, vi } from "vitest"; +import { tagSocketWithId, trySocketWrite } from "../src/socketUtility.js"; + +describe("tagSocketWithId", () => { + it("returns an object with the correct properties", () => { + // arrange + const mockSocket = {} as Socket; + const connectionStamp = Date.now(); + const id = "12345"; + + // act + const result = tagSocketWithId(mockSocket, connectionStamp, id); + + // assert + expect(result).toHaveProperty("id"); + expect(result).toHaveProperty("socket"); + expect(result).toHaveProperty("connectionStamp"); + }); + + it("returns an object with the correct values", () => { + // arrange + const mockSocket = {} as Socket; + const connectionStamp = Date.now(); + const id = "12345"; + + // act + const result = tagSocketWithId(mockSocket, connectionStamp, id); + + // assert + expect(result.id).toBe(id); + expect(result.socket).toBe(mockSocket); + expect(result.connectionStamp).toBe(connectionStamp); + }); + + describe("tagSocketWithId", () => { + it("returns an object with the correct properties", () => { + // arrange + const mockSocket = {} as Socket; + const connectionStamp = Date.now(); + const id = "12345"; + + // act + const result = tagSocketWithId(mockSocket, connectionStamp, id); + + // assert + expect(result).toHaveProperty("id"); + expect(result).toHaveProperty("socket"); + expect(result).toHaveProperty("connectionStamp"); + }); + }); + + describe("trySocketWrite", () => { + it("resolves when data is successfully written", async () => { + // arrange + const mockTaggedSocket = { + id: "12345", + connectionStamp: Date.now(), + socket: { + write: vi.fn((_data, callback) => callback()), + }, + }; + const data = "test data"; + + // act & assert + await expect( + trySocketWrite(mockTaggedSocket, data), + ).resolves.toBeUndefined(); + expect(mockTaggedSocket.socket.write).toHaveBeenCalledWith( + data, + expect.any(Function), + ); + }); + + it("rejects when an error occurs during write", async () => { + // arrange + const mockTaggedSocket = { + id: "12345", + connectionStamp: Date.now(), + socket: { + write: vi.fn((_data, callback) => callback(new Error("Write error"))), + }, + }; + const data = "test data"; + + // act & assert + await expect(trySocketWrite(mockTaggedSocket, data)).rejects.toThrow( + "Write error", + ); + expect(mockTaggedSocket.socket.write).toHaveBeenCalledWith( + data, + expect.any(Function), + ); + }); + }); +}); diff --git a/packages/gateway/tsconfig.json b/packages/gateway/tsconfig.json index a23e9e608..9d9e04652 100644 --- a/packages/gateway/tsconfig.json +++ b/packages/gateway/tsconfig.json @@ -4,5 +4,5 @@ "incremental": true, "composite": true }, - "include": ["index.ts", "src"] + "include": ["index.ts", "src/**/*.ts", "test/mcotsPortRouter.test.ts"], } diff --git a/packages/gateway/tsconfig.test.json b/packages/gateway/tsconfig.test.json new file mode 100644 index 000000000..ec7d9532e --- /dev/null +++ b/packages/gateway/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "test/**/*.test.ts" + ], +} \ No newline at end of file diff --git a/packages/mcots/src/messageProcessors/processServerLogin.ts b/packages/mcots/src/messageProcessors/processServerLogin.ts index 2b5df0633..b2c6ca7e7 100644 --- a/packages/mcots/src/messageProcessors/processServerLogin.ts +++ b/packages/mcots/src/messageProcessors/processServerLogin.ts @@ -27,7 +27,8 @@ export async function processServerLogin( log.debug(`Sending LoginCompleteMessage: ${response.toString()}`); // Send response packet - const responsePacket = new ServerPacket(response.getMessageId()); + const responsePacket = new ServerPacket(); + responsePacket.setMessageId(response.getMessageId()); responsePacket.setDataBuffer(response.serialize()); responsePacket.setSequence(message.sequence); diff --git a/packages/mcots/src/messageProcessors/processStockCarInfo.ts b/packages/mcots/src/messageProcessors/processStockCarInfo.ts index 114b377fa..454ae7be7 100644 --- a/packages/mcots/src/messageProcessors/processStockCarInfo.ts +++ b/packages/mcots/src/messageProcessors/processStockCarInfo.ts @@ -51,7 +51,8 @@ export async function processStockCarInfo( responsePacket.setDealerId(lotOwnerId); responsePacket.setBrandId(brandId); - const response = new ServerPacket(141); + const response = new ServerPacket(); + response.setMessageId(141); if (inventoryCars.inventory.length > StockCarInfo.MAX_CARS_PER_MESSAGE) { log.error( diff --git a/packages/mcots/src/messageProcessors/sendSuccess.ts b/packages/mcots/src/messageProcessors/sendSuccess.ts index 16df99596..ae27e7acc 100644 --- a/packages/mcots/src/messageProcessors/sendSuccess.ts +++ b/packages/mcots/src/messageProcessors/sendSuccess.ts @@ -9,7 +9,8 @@ export function sendSuccess( pReply.setMessageId(101); pReply.msgReply = 438; - const response = new ServerPacket(101); + const response = new ServerPacket(); + response.setMessageId(101); response.setDataBuffer(pReply.serialize()); response.setSequence(message.sequence); diff --git a/packages/nps/index.ts b/packages/nps/index.ts index d20b9a179..ae866827b 100644 --- a/packages/nps/index.ts +++ b/packages/nps/index.ts @@ -16,10 +16,6 @@ export { MiniUserInfo, MiniUserList } from "./messageStructs/MiniUserList.js"; export { ProfileList } from "./messageStructs/ProfileList.js"; export { UserInfo } from "./messageStructs/UserInfo.js"; export { UserStatus } from "./messageStructs/UserStatus.js"; -export { - getUser, - populateGameUsers, -} from "./services/account.js"; export { gameProfiles, getCustomerId, diff --git a/packages/nps/services/account.ts b/packages/nps/services/account.ts deleted file mode 100644 index 76b315705..000000000 --- a/packages/nps/services/account.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { LoginSchema, db } from "rusty-motors-database"; -import { getServerLogger } from "rusty-motors-shared"; -import type { DatabaseSchema } from "rusty-motors-database"; - -const log = getServerLogger({}); - -export async function populateGameUsers(): Promise { - await LoginSchema(db).insertOrIgnore({ - customer_id: 1, - login_name: "admin", - password: "admin", - login_level: 1, - }); -} - -/** - * Retrieves a user from the database based on the provided username and password. - * - * @param username - The username of the user to retrieve. - * @param password - The password of the user to retrieve. - * @returns A Promise that resolves to the user record from the database, or null if the user is not found. - */ -export async function getUser( - username: string, - password: string, -): Promise { - log.debug( - `Getting user: ${username}, password: ${"*".repeat(password.length)}`, - ); - - const userAccount = await LoginSchema(db).findOne({ - login_name: username, - password, - }); - - if (!userAccount) { - log.warn(`User ${username} not found`); - } - - return userAccount; -} - -/** - * Checks if the user is a super user. - * - * @param username - The username of the user. - * @param password - The password of the user. - * @returns A promise that resolves to a boolean indicating if the user is a super user. - */ -export async function isSuperUser( - username: string, - password: string, -): Promise { - const user = await getUser(username, password); - return user ? user.login_level === 1 : false; -} - -// Path: packages/nps/services/account.ts diff --git a/packages/nps/test/account.test.ts b/packages/nps/test/account.test.ts deleted file mode 100644 index 7dd0a79e6..000000000 --- a/packages/nps/test/account.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { - getUser, - isSuperUser, - populateGameUsers, -} from "../services/account.js"; - -describe("getUser", () => { - it("returns the user record if found", async () => { - // arrange - const username = "admin"; - const password = "admin"; - populateGameUsers(); - - // act - const result = await getUser(username, password); - - // assert - expect(result).not.toBeNull(); - expect(result?.login_name).toBe(username); - expect(result?.password).toBe(password); - }); - - it("returns null if the user is not found", async () => { - // arrange - const username = "nonexistent"; - const password = "password"; - - // act - const result = await getUser(username, password); - - // assert - expect(result).toBeNull(); - }); - - it("returns true if the user is a super user", async () => { - // arrange - const username = "admin"; - const password = "admin"; - - // act - const result = await isSuperUser(username, password); - - // assert - expect(result).toBe(true); - }); - - it("returns false if the user is not a super user", async () => { - // arrange - const username = "regularuser"; - const password = "password"; - - // act - const result = await isSuperUser(username, password); - - // assert - expect(result).toBe(false); - }); -}); diff --git a/packages/sessions/index.ts b/packages/sessions/index.ts deleted file mode 100644 index 6cd038bec..000000000 --- a/packages/sessions/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - saveClientConnection, - findClientByCustomerId, - hasClientEncryptionPair, - newClientConnection, - setClientEncryption, - clearConnectedClients, -} from "./src/index.js"; diff --git a/packages/sessions/package.json b/packages/sessions/package.json deleted file mode 100644 index 93ad32293..000000000 --- a/packages/sessions/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "rusty-motors-sessions", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "npx @biomejs/biome lint --write .", - "format": "npx @biomejs/biome format --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/profiling-node": "8.34.0", - "short-unique-id": "^5.2.0" - }, - "description": "", - "devDependencies": { - "@vitest/coverage-v8": "2.1.2", - "vitest": "^2.1.2" - } -} diff --git a/packages/sessions/src/index.ts b/packages/sessions/src/index.ts deleted file mode 100644 index e36c3b33f..000000000 --- a/packages/sessions/src/index.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { createCipheriv, createDecipheriv } from "node:crypto"; - -/** - * Represents a pair of encryption and decryption functions. - */ -type CipherPair = { - /** The encryption function */ - encrypt: (data: Buffer) => Buffer; - /** The decryption function */ - decrypt: (data: Buffer) => Buffer; -}; - -/** - * Generates a pair of cipher and decipher functions for game encryption. - * @returns The cipher and decipher functions. - */ -function createGameEncryptionPair(key: string): CipherPair { - try { - assertStringIsHex(key); - if (key.length !== 16) { - throw Error( - `Invalid game key length: ${key.length}. The key must be 16 bytes long.`, - ); - } - - // The key used by the game 8 bytes long. - // Since the key is in hex format, we need to slice it to 16 characters. - key = key.slice(0, 16); - - // The IV is intentionally required to be all zeros. - const iv = Buffer.alloc(8); - const keyBuffer = Buffer.from(key, "hex"); - - // The algorithm is intentionally set to "des-cbc". - // This is because the game uses this insecure algorithm. - // We are intentionally using an insecure algorithm here to match the game. - const cipher = createCipheriv("des-cbc", keyBuffer, iv); - const decipher = createDecipheriv("des-cbc", keyBuffer, iv); - - return { - encrypt: cipher.update.bind(cipher), - decrypt: decipher.update.bind(decipher), - }; - } catch (error: unknown) { - const err = new Error(`Failed to create game encryption pair`); - err.cause = error; - throw err; - } -} - -/** - * Generates a pair of encryption and decryption functions for the server. - * - * @param key - The key to use for encryption and decryption. Must be 16 hex characters. - * @returns {CipherPair} The encryption and decryption functions. - */ -function createServerEncryptionPair(key: string): CipherPair { - try { - assertStringExists(key); - assertStringIsHex(key); - if (key.length !== 16) { - throw Error( - `Invalid server key length: ${key.length}. The key must be 16 bytes long.`, - ); - } - - // The IV is intentionally required to be empty. - const iv = Buffer.alloc(0); - const keyBuffer = Buffer.from(key, "hex"); - - // The algorithm is intentionally set to "rc4". - // This is because the game uses this insecure algorithm. - // We are intentionally using an insecure algorithm here to match the game. - const cipher = createCipheriv("rc4", keyBuffer, iv); - const decipher = createDecipheriv("rc4", keyBuffer, iv); - - return { - encrypt: cipher.update.bind(cipher), - decrypt: decipher.update.bind(decipher), - }; - } catch (error: unknown) { - const err = new Error(`Failed to create server encryption pair`); - err.cause = error; - throw err; - } -} - -type ConnectedClient = { - /** The connection ID for the client */ - connectionId: string; - /** The customer ID for the client */ - customerId: number; - /** The session key for the client */ - sessionKey?: string; - /** The game encryption pair for the client, if known */ - gameEncryptionPair?: ReturnType; - /** The server encryption pair for the client, if known */ - serverEncryptionPair?: ReturnType; - /** Whether the game encryption handshake is complete */ - gameEncryptionHandshakeComplete: boolean; - /** Whether the server encryption handshake is complete */ - serverEncryptionHandshakeComplete: boolean; -}; - -/** - * Sets the client encryption for a connected client. - * - * @param client - The connected client to set the encryption for. - * @param sessionKey - The session key to associate with the client. - * @returns The updated connected client with the encryption set. - */ -export function setClientEncryption( - client: ConnectedClient, - sessionKey: string, -): ConnectedClient { - try { - const gameEncryptionPair = createGameEncryptionPair(sessionKey); - const serverEncryptionPair = createServerEncryptionPair(sessionKey); - client.sessionKey = sessionKey; - client.gameEncryptionPair = gameEncryptionPair; - client.serverEncryptionPair = serverEncryptionPair; - } catch (error: unknown) { - const err = new Error(`Failed to set client encryption`); - err.cause = error; - throw err; - } - return client; -} - -/** - * Represents a record of connected clients. - * The key is the connection ID. - * The value is the connected client. - */ -const connectedClients: Record = {}; - -/** - * Finds a connected client by their customer ID. - * - * @param customerId - The customer ID to search for. - * @returns The connected client with the specified customer ID. - * @throws Error if no client is found with the given customer ID. - */ -export function findClientByCustomerId(customerId: number): ConnectedClient { - const client = Object.values(connectedClients).find( - (client) => client.customerId === customerId, - ); - if (typeof client === "undefined") { - throw new Error(`Client with customer ID ${customerId} not found`); - } - return client; -} - -type connectionType = "game" | "server"; - -/** - * Checks if a client has an encryption pair based on the connection type. - * @param client - The connected client. - * @param connectionType - The type of connection ("game" or "server"). - * @returns A boolean indicating whether the client has an encryption pair. - */ -export function hasClientEncryptionPair( - client: ConnectedClient, - connectionType: connectionType, -): boolean { - if (connectionType === "game") { - return !!client.gameEncryptionPair; - } else { - return !!client.serverEncryptionPair; - } -} - -/** - * Creates a new client connection. - * - * @param connectionId - The ID of the connection. - * @param customerId - The ID of the customer. - * @param sessionKey - The session key (optional). - * @returns A ConnectedClient object representing the new client connection. - */ -export function newClientConnection( - connectionId: string, - customerId: number, - sessionKey?: string, -): ConnectedClient { - return { - connectionId, - customerId, - sessionKey, - gameEncryptionHandshakeComplete: false, - serverEncryptionHandshakeComplete: false, - }; -} - -/** - * Saves the client connection with the specified connection ID. - * - * @param connectionId - The ID of the connection. - * @param client - The connected client to be saved. - */ -export function saveClientConnection( - connectionId: string, - client: ConnectedClient, -): void { - connectedClients[connectionId] = client; -} - -/** - * Clears all connected clients. - */ -export function clearConnectedClients(): void { - for (const connectionId in connectedClients) { - delete connectedClients[connectionId]; - } -} - -function assertStringExists(str: string): void { - if (str === "" || typeof str === "undefined") { - throw new Error("String not provided"); - } -} - -/** - * Asserts that a given string is a valid hexadecimal string. - * - * @param str - The string to be validated. - * @throws {Error} If the string is not a valid hexadecimal string. - */ -function assertStringIsHex(str: string): void { - if (!/^[0-9a-fA-F]+$/.test(str)) { - throw new Error(`Invalid hex string: ${str}`); - } -} diff --git a/packages/sessions/test/index.test.ts b/packages/sessions/test/index.test.ts deleted file mode 100644 index 57070ffa3..000000000 --- a/packages/sessions/test/index.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { beforeEach, describe, expect, it } from "vitest"; -import { - saveClientConnection, - clearConnectedClients, - findClientByCustomerId, - hasClientEncryptionPair, - newClientConnection, - setClientEncryption, -} from "../index.js"; - -describe("Client connections", () => { - beforeEach(() => { - clearConnectedClients(); - }); - - describe("newClientConnection", () => { - it("should create a new client connection", () => { - const connectionId = "123"; - const customerId = 456; - - const client = newClientConnection(connectionId, customerId); - - expect(client.connectionId).toBe(connectionId); - expect(client.customerId).toBe(customerId); - expect(client.gameEncryptionHandshakeComplete).toBe(false); - expect(client.serverEncryptionHandshakeComplete).toBe(false); - }); - }); - - describe("saveClientConnection", () => { - it("should save a client connection", () => { - const connectionId = "123"; - const customerId = 456; - const client = newClientConnection(connectionId, customerId); - - saveClientConnection(connectionId, client); - - expect(findClientByCustomerId(customerId)).toBe(client); - }); - }); - - describe("findClientByCustomerId", () => { - it("should find a client by customer ID", () => { - const connectionId = "123"; - const customerId = 456; - const client = newClientConnection(connectionId, customerId); - saveClientConnection(connectionId, client); - - expect(findClientByCustomerId(customerId)).toBe(client); - }); - - it("should throw an error if the client is not found", () => { - const customerId = 456; - - expect(() => findClientByCustomerId(customerId)).toThrow( - `Client with customer ID ${customerId} not found`, - ); - }); - }); - - describe("setClientEncryption", () => { - it("should set the client encryption pair", () => { - const connectionId = "123"; - const customerId = 456; - const sessionKey = "ea25e21a2a022d71"; - - const client = newClientConnection(connectionId, customerId); - saveClientConnection(connectionId, client); - - setClientEncryption(client, sessionKey); - - expect(client.sessionKey).toBe(sessionKey); - }); - - it("should throw an error if the session key is not provided", () => { - const connectionId = "123"; - const customerId = 456; - - const client = newClientConnection(connectionId, customerId); - saveClientConnection(connectionId, client); - - expect(() => setClientEncryption(client, "")).toThrow(); - }); - - it("should throw an error if the session key is invalid", () => { - const connectionId = "123"; - const customerId = 456; - - const client = newClientConnection(connectionId, customerId); - saveClientConnection(connectionId, client); - - expect(() => setClientEncryption(client, "invalid")).toThrow(); - }); - }); - - describe("hasClientEncryptionPair", () => { - it("should return true if the client has an encryption pair", () => { - const connectionId = "123"; - const customerId = 456; - const sessionKey = "ea25e21a2a022d71"; - const client = newClientConnection(connectionId, customerId); - saveClientConnection(connectionId, client); - - expect(hasClientEncryptionPair(client, "game")).toBe(false); - expect(hasClientEncryptionPair(client, "server")).toBe(false); - - setClientEncryption(client, sessionKey); - - expect(hasClientEncryptionPair(client, "game")).toBe(true); - expect(hasClientEncryptionPair(client, "server")).toBe(true); - }); - }); - - describe("clearConnectedClients", () => { - it("should clear all connected clients", () => { - const connectionId = "123"; - const customerId = 456; - const client = newClientConnection(connectionId, customerId); - saveClientConnection(connectionId, client); - - clearConnectedClients(); - - expect(() => findClientByCustomerId(customerId)).toThrow( - `Client with customer ID ${customerId} not found`, - ); - }); - }); -}); diff --git a/packages/sessions/tsconfig.json b/packages/sessions/tsconfig.json deleted file mode 100644 index 6a3ee5ec8..000000000 --- a/packages/sessions/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./../../tsconfig.base.json", - "compilerOptions": { - "incremental": true, - "composite": true - }, - "include": ["index.ts", "src", "test"] -} diff --git a/packages/shared-packets/index.ts b/packages/shared-packets/index.ts index 8ff1717f0..dc898b27a 100644 --- a/packages/shared-packets/index.ts +++ b/packages/shared-packets/index.ts @@ -1,4 +1,7 @@ export * from "./src/types.js"; +export { GameMessageHeader } from "./src/GameMessageHeader.js"; +export { GameMessagePayload } from "./src/GameMessagePayload.js"; +export { GamePacket } from "./src/GamePacket.js"; export { ServerMessageHeader } from "./src/ServerMessageHeader.js"; export { ServerMessagePayload } from "./src/ServerMessagePayload.js"; export { ServerPacket } from "./src/ServerPacket.js"; diff --git a/packages/shared-packets/src/GameMessageHeader.ts b/packages/shared-packets/src/GameMessageHeader.ts new file mode 100644 index 000000000..1945186a1 --- /dev/null +++ b/packages/shared-packets/src/GameMessageHeader.ts @@ -0,0 +1,141 @@ +import { BufferSerializer } from "./BufferSerializer.js"; +import type { SerializableInterface } from "./types.js"; + +/** + * Represents the header of a game message. + * The header contains the message ID, the length of the message data, + * and the version of the message. + * + * This is a big-endian structure. + */ +export class GameMessageHeader + extends BufferSerializer + implements SerializableInterface +{ + private id: number = 0; // 2 bytes + private length: number = 0; // 2 bytes + private version: 0 | 257 = 257; // 2 bytes + + private shouldEncryptPayload: boolean = false; + + constructor() { + super(); + } + + static copy(header: GameMessageHeader): GameMessageHeader { + const newHeader = new GameMessageHeader(); + newHeader.id = header.id; + newHeader.length = header.length; + newHeader.version = header.version; + return newHeader; + } + + override getByteSize(): number { + return this.getVersion() === 257 ? 12 : 4; + } + + getVersion(): number { + return this.version; + } + getId(): number { + return this.id; + } + getLength(): number { + return this.length; + } + setVersion(version: 0 | 257): void { + if (version !== 0 && version !== 257) { + throw new Error(`Invalid version ${parseInt(version)}`); + } + this.version = version; + } + setId(id: number): void { + this.id = id; + } + setLength(length: number): void { + this.length = length; + } + + private serializeV0(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + + return buffer; + } + + private serializeV1(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + buffer.writeUInt16BE(this.version, 4); + buffer.writeUInt16BE(0, 6); + buffer.writeUInt32BE(this.length, 8); + + return buffer; + } + + override serialize(): Buffer { + return this.version === 257 ? this.serializeV1() : this.serializeV0(); + } + + private deserializeV0(data: Buffer): void { + this.id = data.readUInt16BE(0); + this.length = data.readUInt16BE(2); + } + + private assertV1Checksum(data: Buffer): void { + const length = data.readUInt16BE(2); + const checksum = data.readUInt32BE(8); + if (checksum !== length) { + throw new Error( + `Checksum mismatch. Expected ${length}, got ${checksum}`, + ); + } + } + + private deserializeV1(data: Buffer): void { + this.assertV1Checksum(data); + this.id = data.readUInt16BE(0); + this.length = data.readUInt16BE(2); + // Skip version + // Skip padding + this.length = data.readUInt32BE(8); + } + + override deserialize(data: Buffer): void { + if (data.length < 4) { + throw new Error( + `Data is too short. Expected at least 4 bytes, got ${data.length} bytes`, + ); + } + + if (this.version === 257) { + this.deserializeV1(data); + } else { + this.deserializeV0(data); + } + } + + /** + * Sets the encryption status for the payload. + * + * @param encrypted - A boolean indicating whether the payload should be encrypted (true) or not (false). + */ + setPayloadEncryption(encrypted: boolean): void { + this.shouldEncryptPayload = encrypted; + } + + /** + * Determines if the payload should be encrypted. + * + * @returns {boolean} True if the payload should be encrypted, otherwise false. + */ + isPayloadEncrypted(): boolean { + return this.shouldEncryptPayload; + } + + override toString(): string { + return `GameMessageHeader {id: ${this.id}, length: ${this.length}, version: ${this.version}}`; + } +} diff --git a/packages/shared-packets/src/GameMessagePayload.ts b/packages/shared-packets/src/GameMessagePayload.ts new file mode 100644 index 000000000..35b343949 --- /dev/null +++ b/packages/shared-packets/src/GameMessagePayload.ts @@ -0,0 +1,38 @@ +import { BufferSerializer } from "./BufferSerializer.js"; +import type { SerializableInterface } from "./types.js"; + +export class GameMessagePayload + extends BufferSerializer + implements SerializableInterface +{ + private isEncrypted: boolean = false; // Not serialized + + static copy(payload: GameMessagePayload): GameMessagePayload { + const newPayload = new GameMessagePayload(); + newPayload.deserialize(payload.serialize()); + return newPayload; + } + + override getByteSize(): number { + return this._data.length; + } + + override serialize(): Buffer { + return this._data; + } + + override deserialize(data: Buffer): GameMessagePayload { + this._data = data; + + return this; + } + + isPayloadEncrypted(): boolean { + return this.isEncrypted; + } + + setPayloadEncryption(encrypted: boolean): GameMessagePayload { + this.isEncrypted = encrypted; + return this; + } +} diff --git a/packages/shared-packets/src/GamePacket.ts b/packages/shared-packets/src/GamePacket.ts new file mode 100644 index 000000000..0cc5dad95 --- /dev/null +++ b/packages/shared-packets/src/GamePacket.ts @@ -0,0 +1,124 @@ +import { BasePacket } from "./BasePacket.js"; +import { GameMessageHeader } from "./GameMessageHeader.js"; +import { GameMessagePayload } from "./GameMessagePayload.js"; +import type { SerializableMessage } from "./types.js"; + +export class GamePacket extends BasePacket implements SerializableMessage { + protected override header: GameMessageHeader = new GameMessageHeader(); + data: GameMessagePayload = new GameMessagePayload(); + + constructor() { + super({}); + } + + /** + * Creates a copy of the given `GamePacket` with the option to replace its data. + * + * @param originalPacket - The original `GamePacket` to be copied. + * @param newData - An optional `Buffer` containing new data to be deserialized into the new packet. + * If not provided, the data from the original packet will be copied. + * @returns A new `GamePacket` instance with the same message ID and header as the original, + * and either the deserialized new data or a copy of the original data. + */ + static copy(originalPacket: GamePacket, newData?: Buffer): GamePacket { + const newPacket = new GamePacket(); + newPacket.deserialize(originalPacket.serialize()); + + if (newData) { + newPacket.data.deserialize(newData); + } else { + newPacket.data.deserialize(originalPacket.data.serialize()); + } + + return newPacket; + } + + override getDataBuffer(): Buffer { + return this.data.serialize(); + } + + getVersion(): number { + return this.header.getVersion(); + } + + override setDataBuffer(data: Buffer): GamePacket { + if (this.data.getByteSize() > 2) { + throw new Error( + `GamePacket data buffer is already set, use copy() to create a new ServerPacket`, + ); + } + + this.data.deserialize(data); + return this; + } + + /** The message length is the length of the message data, not including the id */ + override getByteSize(): number { + return this.header.getByteSize() + this.data.getByteSize(); + } + + setLength(length: number): GamePacket { + this.header.setLength(length); + return this; + } + + setPayloadEncryption(encrypted: boolean): GamePacket { + this.header.setPayloadEncryption(encrypted); + return this; + } + + getMessageId(): number { + return this.header.getId(); + } + + getLength(): number { + return this.header.getLength(); + } + + isPayloadEncrypted(): boolean { + return this.header.isPayloadEncrypted(); + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + this.header.serialize().copy(buffer); + this.data.serialize().copy(buffer, this.header.getByteSize()); + + return buffer; + } catch (error) { + const err = new Error("Error serializing ServerMessage"); + err.cause = error; + throw error; + } + } + + override deserialize(data: Buffer): GamePacket { + this._assertEnoughData(data, 6); + + const version = this.identifyVersion(data); + this.header.setVersion(version); + + this._assertEnoughData(data, this.header.getByteSize()); + + this.header.deserialize(data); + + this._assertEnoughData(data, this.header.getLength()); + + this.data.deserialize(data.subarray(this.header.getByteSize())); + + return this; + } + + override toString(): string { + return `GamePacket {length: ${this.getLength()}, messageId: ${this.getMessageId()}}`; + } + + private identifyVersion(data: Buffer): 0 | 257 { + if (data.length < 6) { + return 0; + } + + return data.readUInt16BE(4) === 0x101 ? 257 : 0; + } +} diff --git a/packages/shared-packets/src/ServerMessageHeader.ts b/packages/shared-packets/src/ServerMessageHeader.ts index d50c1cdb4..7693192e1 100644 --- a/packages/shared-packets/src/ServerMessageHeader.ts +++ b/packages/shared-packets/src/ServerMessageHeader.ts @@ -2,7 +2,11 @@ import { BufferSerializer } from "./BufferSerializer.js"; import type { SerializableInterface } from "./types.js"; /** - * + * Represents the header of a server message. + * The header contains the length of the message data, + * the signature of the message, + * + * This is a little-endian structure. */ export class ServerMessageHeader @@ -15,6 +19,19 @@ export class ServerMessageHeader private sequence: number = 0; // 4 bytes private flags: number = 0; // 1 + constructor() { + super(); + } + + static copy(header: ServerMessageHeader): ServerMessageHeader { + const newHeader = new ServerMessageHeader(); + newHeader.length = header.length; + newHeader.signature = header.signature; + newHeader.sequence = header.sequence; + newHeader.flags = header.flags; + return newHeader; + } + getDataOffset(): number { return 11; } diff --git a/packages/shared-packets/src/ServerMessagePayload.ts b/packages/shared-packets/src/ServerMessagePayload.ts index 1d0637a1a..c44d1cd33 100644 --- a/packages/shared-packets/src/ServerMessagePayload.ts +++ b/packages/shared-packets/src/ServerMessagePayload.ts @@ -5,7 +5,15 @@ export class ServerMessagePayload extends BufferSerializer implements SerializableInterface { - public messageId: number = 0; // 2 bytes + private messageId: number = 0; // 2 bytes + private previousMessageId: number = 0; // Not serialized + private isEncrypted: boolean = false; // Not serialized + + static copy(payload: ServerMessagePayload): ServerMessagePayload { + const newPayload = new ServerMessagePayload(); + newPayload.deserialize(payload.serialize()); + return newPayload; + } override getByteSize(): number { return 2 + this._data.length; @@ -36,4 +44,22 @@ export class ServerMessagePayload this.messageId = messageId; return this; } + + getPreviousMessageId(): number { + return this.previousMessageId; + } + + setPreviousMessageId(previousMessageId: number): ServerMessagePayload { + this.previousMessageId = previousMessageId; + return this; + } + + isPayloadEncrypted(): boolean { + return this.isEncrypted; + } + + setEncrypted(encrypted: boolean): ServerMessagePayload { + this.isEncrypted = encrypted; + return this; + } } diff --git a/packages/shared-packets/src/ServerPacket.ts b/packages/shared-packets/src/ServerPacket.ts index 496a9282d..f49051528 100644 --- a/packages/shared-packets/src/ServerPacket.ts +++ b/packages/shared-packets/src/ServerPacket.ts @@ -4,18 +4,45 @@ import { ServerMessagePayload } from "./ServerMessagePayload.js"; import type { SerializableMessage } from "./types.js"; export class ServerPacket extends BasePacket implements SerializableMessage { - protected override header: ServerMessageHeader; - data: ServerMessagePayload; + protected override header: ServerMessageHeader = new ServerMessageHeader(); + data: ServerMessagePayload = new ServerMessagePayload(); - constructor(messageId: number) { + constructor() { super({}); - this.header = new ServerMessageHeader(); - this.data = new ServerMessagePayload().setMessageId(messageId); } + + /** + * Creates a copy of the given `ServerPacket` with the option to replace its data. + * + * @param originalPacket - The original `ServerPacket` to be copied. + * @param newData - An optional `Buffer` containing new data to be deserialized into the new packet. + * If not provided, the data from the original packet will be copied. + * @returns A new `ServerPacket` instance with the same message ID and header as the original, + * and either the deserialized new data or a copy of the original data. + */ + static copy(originalPacket: ServerPacket, newData?: Buffer): ServerPacket { + const newPacket = new ServerPacket(); + newPacket.header = ServerMessageHeader.copy(originalPacket.header); + + if (newData) { + newPacket.data.deserialize(newData); + } else { + newPacket.data = ServerMessagePayload.copy(originalPacket.data); + } + + return newPacket; + } + override getDataBuffer(): Buffer { return this.data.serialize(); } override setDataBuffer(data: Buffer): ServerPacket { + if (this.data.getByteSize() > 2) { + throw new Error( + `ServerPacket data buffer is already set, use copy() to create a new ServerPacket`, + ); + } + this.data.deserialize(data); return this; } @@ -49,6 +76,11 @@ export class ServerPacket extends BasePacket implements SerializableMessage { return this.data.getMessageId(); } + setMessageId(messageId: number): ServerPacket { + this.data.setMessageId(messageId); + return this; + } + getLength(): number { return this.header.getLength(); } @@ -103,7 +135,7 @@ export class ServerPacket extends BasePacket implements SerializableMessage { this._assertEnoughData(data, this.header.getByteSize()); this.header.deserialize(data); - this.setDataBuffer(data.subarray(this.header.getDataOffset())); + this.data.deserialize(data.subarray(this.header.getDataOffset())); return this; } diff --git a/packages/shared-packets/src/BasePacket.test.ts b/packages/shared-packets/test/BasePacket.test.ts similarity index 94% rename from packages/shared-packets/src/BasePacket.test.ts rename to packages/shared-packets/test/BasePacket.test.ts index 69e1ea519..449b8f0e4 100644 --- a/packages/shared-packets/src/BasePacket.test.ts +++ b/packages/shared-packets/test/BasePacket.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from "vitest"; -import { BasePacket } from "./BasePacket.js"; -import { BufferSerializer } from "./BufferSerializer.js"; +import { BasePacket } from "../src/BasePacket.js"; +import { BufferSerializer } from "../src/BufferSerializer.js"; describe("BasePacket", () => { it("should initialize with default values", () => { diff --git a/packages/shared-packets/src/BufferSerializer.test.ts b/packages/shared-packets/test/BufferSerializer.test.ts similarity index 96% rename from packages/shared-packets/src/BufferSerializer.test.ts rename to packages/shared-packets/test/BufferSerializer.test.ts index 490e1ca95..9d65b7365 100644 --- a/packages/shared-packets/src/BufferSerializer.test.ts +++ b/packages/shared-packets/test/BufferSerializer.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, beforeEach } from "vitest"; -import { BufferSerializer } from "./BufferSerializer.js"; +import { BufferSerializer } from "../src/BufferSerializer.js"; describe("BufferSerializer", () => { let bufferSerializer: BufferSerializer; diff --git a/packages/shared-packets/test/GameMessageHeader.test.ts b/packages/shared-packets/test/GameMessageHeader.test.ts new file mode 100644 index 000000000..9501f1267 --- /dev/null +++ b/packages/shared-packets/test/GameMessageHeader.test.ts @@ -0,0 +1,87 @@ +import { describe, it, expect } from "vitest"; +import { GameMessageHeader } from "../src/GameMessageHeader.js"; + +describe("GameMessageHeader", () => { + it("should serialize and deserialize correctly for version 0", () => { + const header = new GameMessageHeader(); + header.setId(1234); + header.setLength(5678); + header.setVersion(0); + + const buffer = header.serialize(); + expect(buffer.length).toBe(4); + expect(buffer.readUInt16BE(0)).toBe(1234); + expect(buffer.readUInt16BE(2)).toBe(5678); + + const newHeader = new GameMessageHeader(); + newHeader.setVersion(0); + newHeader.deserialize(buffer); + + expect(newHeader.getId()).toBe(1234); + expect(newHeader.getLength()).toBe(5678); + }); + + it("should serialize and deserialize correctly for version 257", () => { + const header = new GameMessageHeader(); + header.setId(1234); + header.setLength(5678); + header.setVersion(257); + + const buffer = header.serialize(); + expect(buffer.length).toBe(12); + expect(buffer.readUInt16BE(0)).toBe(1234); + expect(buffer.readUInt16BE(2)).toBe(5678); + expect(buffer.readUInt16BE(4)).toBe(257); + expect(buffer.readUInt32BE(8)).toBe(5678); + + const newHeader = new GameMessageHeader(); + newHeader.setVersion(257); + newHeader.deserialize(buffer); + + expect(newHeader.getId()).toBe(1234); + expect(newHeader.getLength()).toBe(5678); + expect(newHeader.getVersion()).toBe(257); + }); + + it("should throw error if data is too short during deserialization", () => { + const header = new GameMessageHeader(); + const buffer = Buffer.alloc(2); + + expect(() => header.deserialize(buffer)).toThrow( + "Data is too short. Expected at least 4 bytes, got 2 bytes", + ); + }); + + it("should set and get payload encryption status correctly", () => { + const header = new GameMessageHeader(); + header.setPayloadEncryption(true); + expect(header.isPayloadEncrypted()).toBe(true); + + header.setPayloadEncryption(false); + expect(header.isPayloadEncrypted()).toBe(false); + }); + + it("should convert to string correctly", () => { + const header = new GameMessageHeader(); + header.setId(1234); + header.setLength(5678); + header.setVersion(257); + + const str = header.toString(); + expect(str).toBe( + "GameMessageHeader {id: 1234, length: 5678, version: 257}", + ); + }); + + it("should copy correctly", () => { + const header = new GameMessageHeader(); + header.setId(1234); + header.setLength(5678); + header.setVersion(257); + + const copiedHeader = GameMessageHeader.copy(header); + expect(copiedHeader.getId()).toBe(1234); + expect(copiedHeader.getLength()).toBe(5678); + expect(copiedHeader.getVersion()).toBe(257); + }); +}); diff --git a/packages/shared-packets/test/GameMessagePayload.test.ts b/packages/shared-packets/test/GameMessagePayload.test.ts new file mode 100644 index 000000000..39ccb7246 --- /dev/null +++ b/packages/shared-packets/test/GameMessagePayload.test.ts @@ -0,0 +1,56 @@ +import { describe, it, expect } from "vitest"; +import { GameMessagePayload } from "../src/GameMessagePayload.js"; + +describe("GameMessagePayload", () => { + it("should create a copy of the payload", () => { + const originalPayload = new GameMessagePayload(); + originalPayload.deserialize(Buffer.from("test data")); + + const copiedPayload = GameMessagePayload.copy(originalPayload); + + expect(copiedPayload).not.toBe(originalPayload); + expect(copiedPayload.serialize()).toEqual(originalPayload.serialize()); + }); + + it("should return the correct byte size", () => { + const payload = new GameMessagePayload(); + payload.deserialize(Buffer.from("test data")); + + expect(payload.getByteSize()).toBe(9); + }); + + it("should serialize the payload correctly", () => { + const payload = new GameMessagePayload(); + const buffer = Buffer.from("test data"); + payload.deserialize(buffer); + + expect(payload.serialize()).toEqual(buffer); + }); + + it("should deserialize the payload correctly", () => { + const payload = new GameMessagePayload(); + const buffer = Buffer.from("test data"); + payload.deserialize(buffer); + + expect(payload.serialize()).toEqual(buffer); + }); + + it("should correctly indicate if the payload is encrypted", () => { + const payload = new GameMessagePayload(); + + expect(payload.isPayloadEncrypted()).toBe(false); + + payload.setPayloadEncryption(true); + expect(payload.isPayloadEncrypted()).toBe(true); + }); + + it("should set the payload encryption correctly", () => { + const payload = new GameMessagePayload(); + + payload.setPayloadEncryption(true); + expect(payload.isPayloadEncrypted()).toBe(true); + + payload.setPayloadEncryption(false); + expect(payload.isPayloadEncrypted()).toBe(false); + }); +}); diff --git a/packages/shared-packets/test/GamePacket.test.ts b/packages/shared-packets/test/GamePacket.test.ts new file mode 100644 index 000000000..65a3d776a --- /dev/null +++ b/packages/shared-packets/test/GamePacket.test.ts @@ -0,0 +1,129 @@ +import { describe, it, expect } from "vitest"; +import { Buffer } from "buffer"; +import { GamePacket } from "../src/GamePacket.js"; + +describe("GamePacket", () => { + it("should deserialize v0 correctly", () => { + const buffer = Buffer.alloc(11); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 2); // Length + + buffer.write("test da", 4); // Data + + const packet = new GamePacket(); + packet.deserialize(buffer); + + expect(packet.getMessageId()).toBe(1234); + expect(packet.getDataBuffer().toString("hex")).equals( + Buffer.from("test da").toString("hex"), + ); + }); + + it("should deserialize v1 correctly", () => { + const buffer = Buffer.alloc(26); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 2); // Length + buffer.writeUInt16BE(0x101, 4); // Version + buffer.writeUInt32BE(11, 8); // Checksum + buffer.write("test data", 12); // Data + + const packet = new GamePacket(); + packet.deserialize(buffer); + + expect(packet.getMessageId()).toBe(1234); + expect(packet.getDataBuffer().toString("hex")).equals( + Buffer.from("test data\u0000\u0000\u0000\u0000\u0000").toString("hex"), + ); + }); + + it("should be able to make a copy of the packet", () => { + const buffer = Buffer.alloc(11); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 2); // Length + buffer.write("test da", 4); // Data + + const packet = new GamePacket(); + packet.deserialize(buffer); + + const copy = GamePacket.copy(packet); + expect(copy.serialize().toString("hex")).equals(packet.serialize().toString("hex")); + }); + + it("should be able to make a copy of the packet with new data", () => { + const buffer = Buffer.alloc(11); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 2); // Length + buffer.write("test da", 4); // Data + + const packet = new GamePacket(); + packet.deserialize(buffer); + + const copy = GamePacket.copy(packet, Buffer.from("new data")); + expect(copy.serialize().toString("hex")).not.equals(packet.serialize().toString("hex")); + }); + + it("should throw error if data is insufficient for header", () => { + const buffer = Buffer.alloc(5); // Less than required for header + + const packet = new GamePacket(); + expect(() => packet.deserialize(buffer)).toThrow( + "Data is too short. Expected at least 6 bytes, got 5 bytes", + ); + }); + + it("should throw error if checksum is incorrect for v1 packet", () => { + const buffer = Buffer.alloc(26); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 2); // Length + buffer.writeUInt16BE(0x101, 4); // Version + buffer.writeUInt32BE(26, 8); // Checksum + buffer.write("test data", 12); // Data + + buffer.writeUInt32BE(0, 8); // Incorrect checksum + + const packet = new GamePacket(); + expect(() => packet.deserialize(buffer)).toThrow( + "Checksum mismatch. Expected 11, got 0", + ); + }); + + it("should throw error if data is insufficient for full v1 packet", () => { + const buffer = Buffer.alloc(25); // 1 byte less than required for v1 packet + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(26, 2); // Length + buffer.writeUInt16BE(0x101, 4); // Version + buffer.writeUInt32BE(26, 8); // Checksum + + const packet = new GamePacket(); + expect(() => packet.deserialize(buffer)).toThrow( + "Data is too short. Expected at least 26 bytes, got 25 bytes" + ); + }); + + it("should identify version v1 correctly", () => { + const buffer = Buffer.alloc(15); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 2); // Length + buffer.writeUInt16BE(0x101, 4); // Version + buffer.writeUInt32BE(11, 8); // Checksum + buffer.write("test data", 12, "utf8"); // Data + + const packet = new GamePacket(); + packet.deserialize(buffer); + + expect(packet.getVersion()).toBe(257); + }); + + it("should handle version v0 correctly", () => { + const buffer = Buffer.alloc(15); + buffer.writeUInt16BE(1234, 0); // Message ID + buffer.writeUInt16BE(11, 4); // Length + buffer.writeUInt16BE(0x100, 4); // Version + buffer.write("test data", 8, "utf8"); // Data + + const packet = new GamePacket(); + packet.deserialize(buffer); + + expect(packet.getVersion()).toBe(0); + }); +}); diff --git a/packages/shared-packets/src/GenericReplyPayload.test.ts b/packages/shared-packets/test/GenericReplyPayload.test.ts similarity index 95% rename from packages/shared-packets/src/GenericReplyPayload.test.ts rename to packages/shared-packets/test/GenericReplyPayload.test.ts index 6ce36f69c..a576efffe 100644 --- a/packages/shared-packets/src/GenericReplyPayload.test.ts +++ b/packages/shared-packets/test/GenericReplyPayload.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { GenericReplyPayload } from "./GenericReplyPayload.js"; +import { GenericReplyPayload } from "../src/GenericReplyPayload.js"; import { Buffer } from "buffer"; describe("GenericReplyPayload", () => { diff --git a/packages/shared-packets/src/GenericRequestPayload.test.ts b/packages/shared-packets/test/GenericRequestPayload.test.ts similarity index 95% rename from packages/shared-packets/src/GenericRequestPayload.test.ts rename to packages/shared-packets/test/GenericRequestPayload.test.ts index a9e81aff1..6c0573ea0 100644 --- a/packages/shared-packets/src/GenericRequestPayload.test.ts +++ b/packages/shared-packets/test/GenericRequestPayload.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { GenericRequestPayload } from "./GenericRequestPayload.js"; +import { GenericRequestPayload } from "../src/GenericRequestPayload.js"; import { Buffer } from "buffer"; describe("GenericRequestPayload", () => { diff --git a/packages/shared-packets/src/ServerMessageHeader.test.ts b/packages/shared-packets/test/ServerMessageHeader.test.ts similarity index 97% rename from packages/shared-packets/src/ServerMessageHeader.test.ts rename to packages/shared-packets/test/ServerMessageHeader.test.ts index b032cb788..87f5bdec4 100644 --- a/packages/shared-packets/src/ServerMessageHeader.test.ts +++ b/packages/shared-packets/test/ServerMessageHeader.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { ServerMessageHeader } from "./ServerMessageHeader.js"; +import { ServerMessageHeader } from "../src/ServerMessageHeader.js"; describe("ServerMessageHeader", () => { it("should serialize correctly", () => { diff --git a/packages/shared-packets/test/ServerMessagePayload.test.ts b/packages/shared-packets/test/ServerMessagePayload.test.ts new file mode 100644 index 000000000..d1c01b381 --- /dev/null +++ b/packages/shared-packets/test/ServerMessagePayload.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from "vitest"; +import { Buffer } from "buffer"; +import { ServerMessagePayload } from "../src/ServerMessagePayload.js"; + +describe("ServerMessagePayload", () => { + it("should copy correctly", () => { + const originalPayload = new ServerMessagePayload(); + originalPayload.setMessageId(1234); + originalPayload["_data"] = Buffer.from("test data"); + + const copiedPayload = ServerMessagePayload.copy(originalPayload); + + expect(copiedPayload.getMessageId()).toBe(1234); + expect(copiedPayload["_data"].toString("utf8")).toBe("test data"); + expect(copiedPayload).not.toBe(originalPayload); + expect(copiedPayload["_data"]).not.toBe(originalPayload["_data"]); + }); +}); diff --git a/packages/shared-packets/src/ServerPacket.test.ts b/packages/shared-packets/test/ServerPacket.test.ts similarity index 84% rename from packages/shared-packets/src/ServerPacket.test.ts rename to packages/shared-packets/test/ServerPacket.test.ts index 87737c458..e2ec5f8c4 100644 --- a/packages/shared-packets/src/ServerPacket.test.ts +++ b/packages/shared-packets/test/ServerPacket.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from "vitest"; import { Buffer } from "buffer"; -import { ServerMessagePayload } from "./ServerMessagePayload.js"; -import { ServerPacket } from "./ServerPacket.js"; +import { ServerMessagePayload } from "../src/ServerMessagePayload.js"; +import { ServerPacket } from "../src/ServerPacket.js"; describe("ServerMessagePayload", () => { it("should serialize correctly", () => { @@ -38,7 +38,8 @@ describe("ServerMessagePayload", () => { describe("ServerPacket", () => { it("should serialize correctly", () => { - const packet = new ServerPacket(1234); + const packet = new ServerPacket(); + packet.setMessageId(1234); packet.setLength(11); packet.setSignature("TOMC"); packet.setSequence(5678); @@ -61,7 +62,8 @@ describe("ServerMessagePayload", () => { buffer.writeUInt8(0x08, 10); buffer.writeUInt16LE(1234, 11); - const packet = new ServerPacket(0); + const packet = new ServerPacket(); + packet.setMessageId(1234); packet.deserialize(buffer); expect(packet.getLength()).toBe(11); @@ -72,7 +74,8 @@ describe("ServerMessagePayload", () => { }); it("should throw error if signature is invalid during serialization", () => { - const packet = new ServerPacket(1234); + const packet = new ServerPacket(); + packet.setMessageId(1234); packet.setLength(11); packet.setSignature("INVALID"); packet.setSequence(5678); @@ -84,7 +87,8 @@ describe("ServerMessagePayload", () => { }); it("should throw error if sequence is zero during serialization", () => { - const packet = new ServerPacket(1234); + const packet = new ServerPacket(); + packet.setMessageId(1234); packet.setLength(11); packet.setSignature("TOMC"); packet.setSequence(0); @@ -96,14 +100,17 @@ describe("ServerMessagePayload", () => { }); it("should convert to string correctly", () => { - const packet = new ServerPacket(1234); + const packet = new ServerPacket(); + packet.setMessageId(1234); packet.setLength(11); packet.setSignature("TOMC"); packet.setSequence(5678); packet.setPayloadEncryption(true); const str = packet.toString(); - expect(str).toBe("ServerPacket {length: 11, sequence: 5678, messageId: 1234}"); + expect(str).toBe( + "ServerPacket {length: 11, sequence: 5678, messageId: 1234}", + ); }); }); }); diff --git a/packages/shared-packets/tsconfig.json b/packages/shared-packets/tsconfig.json index ba43189cf..39f6a71bb 100644 --- a/packages/shared-packets/tsconfig.json +++ b/packages/shared-packets/tsconfig.json @@ -4,5 +4,5 @@ "incremental": true, "composite": true }, - "include": ["index.ts", "src"] + "include": ["index.ts", "src/**/*.ts"], } diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 9b660b584..5750f7d46 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -26,14 +26,13 @@ export { addSession, createInitialState, fetchStateFromDatabase, - addOnDataHandler, - getOnDataHandler, addEncryption, getEncryption, McosSession, findSessionByConnectionId, updateEncryption, } from "./src/State.js"; +export { ensureLegacyCipherCompatibility as verifyLegacyCipherSupport } from "./src/verifyLegacyCipherSupport.js"; export type { State } from "./src/State.js"; export type { OnDataHandler, ServiceResponse } from "./src/State.js"; export { LegacyMessage } from "./src/LegacyMessage.js"; @@ -57,7 +56,12 @@ export interface ConnectionRecord { } // Function to convert ARGB to 32-bit integer -function argbToInt(alpha: number, red: number, green: number, blue: number) { +export function argbToInt( + alpha: number, + red: number, + green: number, + blue: number, +) { return ( ((alpha & 0xff) << 24) | ((red & 0xff) << 16) | @@ -67,7 +71,7 @@ function argbToInt(alpha: number, red: number, green: number, blue: number) { } // Function to convert 32-bit integer to ARGB -function intToArgb(int: number) { +export function intToArgb(int: number) { return { alpha: (int >> 24) & 0xff, red: (int >> 16) & 0xff, diff --git a/packages/shared/src/BaseSerialized.ts b/packages/shared/src/BaseSerialized.ts index 99c1a5a40..59d8c3244 100644 --- a/packages/shared/src/BaseSerialized.ts +++ b/packages/shared/src/BaseSerialized.ts @@ -1,7 +1,7 @@ export interface Serializable { data: Buffer; serialize(): Buffer; - deserialize(buffer: Buffer): Serializable; + deserialize(buffer: Buffer): T; length: number; toString(): string; asHex(): string; @@ -30,7 +30,7 @@ export class BaseSerialized implements Serializable { throw Error("Not implemented"); } - deserialize(_buffer: Buffer): Serializable { + deserialize(_buffer: Buffer): T { throw Error("Not implemented"); } diff --git a/packages/shared/src/NetworkMessage.ts b/packages/shared/src/NetworkMessage.ts index bf84671ef..4c65bc088 100644 --- a/packages/shared/src/NetworkMessage.ts +++ b/packages/shared/src/NetworkMessage.ts @@ -1,3 +1,4 @@ +import type { Serializable } from "./BaseSerialized.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; /** @@ -27,7 +28,7 @@ export class NetworkMessage extends SerializedBuffer { this._data.copy(buffer, 12); return buffer; } - override deserialize(buffer: Buffer) { + override deserialize(buffer: Buffer): T { if (buffer.length < 12) { throw Error(`Unable to get header from buffer, got ${buffer.length}`); } @@ -46,7 +47,7 @@ export class NetworkMessage extends SerializedBuffer { throw Error(`Checksum ${checksum} does not match length ${length}`); } - return this; + return this as unknown as T; } override set data(data: Buffer) { diff --git a/packages/shared/src/OldServerMessage.ts b/packages/shared/src/OldServerMessage.ts index 1efefd11b..0ae4c43a3 100644 --- a/packages/shared/src/OldServerMessage.ts +++ b/packages/shared/src/OldServerMessage.ts @@ -5,8 +5,8 @@ import { serverHeader } from "./serverHeader.js"; * A server message is a message that is passed between the server and the client. It has an 11 byte header. @see {@link serverHeader} * * @mixin {SerializableMixin} + * @deprecated */ - export class OldServerMessage extends SerializedBufferOld { _header: serverHeader; _msgNo: number; @@ -21,6 +21,7 @@ export class OldServerMessage extends SerializedBufferOld { } /** + * @deprecated * @param {Buffer} buffer * @returns {OldServerMessage} */ @@ -33,6 +34,9 @@ export class OldServerMessage extends SerializedBufferOld { return this; } + /** + * @deprecated + */ override serialize() { const buffer = Buffer.alloc(this._header.length + 2); this._header._doSerialize().copy(buffer); @@ -41,6 +45,7 @@ export class OldServerMessage extends SerializedBufferOld { } /** + * @deprecated * @param {Buffer} buffer */ override setBuffer(buffer: Buffer) { @@ -48,6 +53,9 @@ export class OldServerMessage extends SerializedBufferOld { this._header.length = buffer.length + this._header._size - 2; } + /** + * @deprecated + */ updateMsgNo() { this._msgNo = this.data.readInt16LE(0); } @@ -59,7 +67,7 @@ export class OldServerMessage extends SerializedBufferOld { })}`; } - toHexString() { + override toHexString() { return this.serialize().toString("hex"); } } diff --git a/packages/shared/src/RawMessage.ts b/packages/shared/src/RawMessage.ts index 14334e02d..508e989ff 100644 --- a/packages/shared/src/RawMessage.ts +++ b/packages/shared/src/RawMessage.ts @@ -1,3 +1,4 @@ +import type { Serializable } from "./BaseSerialized.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; /** @@ -16,7 +17,7 @@ export class RawMessage extends SerializedBuffer { this._data.copy(buffer, 4); return buffer; } - override deserialize(buffer: Buffer) { + override deserialize(buffer: Buffer): T { if (buffer.length < 4) { throw Error(`Unable to get header from buffer, got ${buffer.length}`); } @@ -26,7 +27,7 @@ export class RawMessage extends SerializedBuffer { } this._messageId = buffer.readUInt16BE(0); this._data = buffer.subarray(4, 4 + length); - return this; + return this as unknown as T; } get messageId(): number { diff --git a/packages/shared/src/SerializedBuffer.ts b/packages/shared/src/SerializedBuffer.ts index 2a4c6c388..e5efffd5c 100644 --- a/packages/shared/src/SerializedBuffer.ts +++ b/packages/shared/src/SerializedBuffer.ts @@ -1,4 +1,5 @@ -import { BaseSerialized } from "./BaseSerialized.js"; +import { BaseSerialized, } from "./BaseSerialized.js"; +import type { Serializable } from "./BaseSerialized.js"; /** * A serialized buffer, prefixed with its 2-byte length. @@ -16,7 +17,7 @@ export class SerializedBuffer extends BaseSerialized { throw err; } } - override deserialize(buffer: Buffer): SerializedBuffer { + override deserialize(buffer: Buffer): T { try { const length = buffer.readUInt16BE(0); if (buffer.length < 2 + length) { @@ -25,7 +26,7 @@ export class SerializedBuffer extends BaseSerialized { ); } this._data = buffer.subarray(2, 2 + length); - return this; + return this as unknown as T; } catch (error) { const err = Error(`Error deserializing buffer: ${String(error)}`); err.cause = error; diff --git a/packages/shared/src/SerializedBufferOld.ts b/packages/shared/src/SerializedBufferOld.ts index 12da805c9..f2d0322c3 100644 --- a/packages/shared/src/SerializedBufferOld.ts +++ b/packages/shared/src/SerializedBufferOld.ts @@ -1,3 +1,4 @@ +import type { SerializableInterface } from "rusty-motors-shared-packets"; import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; /** @@ -8,8 +9,8 @@ import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; */ export class SerializedBufferOld extends SerializableMixin( - AbstractSerializable, -) { + AbstractSerializable, +) implements SerializableInterface { constructor() { super(); } @@ -23,6 +24,10 @@ export class SerializedBufferOld extends SerializableMixin( return this; } + deserialize(data: Buffer): void { + this.setBuffer(data); + } + serialize() { return this.data; } @@ -35,6 +40,10 @@ export class SerializedBufferOld extends SerializableMixin( return this.data.length; } + getByteSize() { + return this.size(); + } + toHexString() { return this.data.toString("hex"); } diff --git a/packages/shared/src/ServerMessage.ts b/packages/shared/src/ServerMessage.ts index bddb401dd..e73d98ab0 100644 --- a/packages/shared/src/ServerMessage.ts +++ b/packages/shared/src/ServerMessage.ts @@ -1,3 +1,4 @@ +import type { Serializable } from "./BaseSerialized.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; class HeaderShim { @@ -46,7 +47,7 @@ export class ServerMessage extends SerializedBuffer { this._data.copy(buffer, 11); return buffer; } - override deserialize(buffer: Buffer) { + override deserialize(buffer: Buffer): T { if (buffer.length < 11) { throw Error(`Unable to get header from buffer, got ${buffer.length}`); } @@ -58,7 +59,7 @@ export class ServerMessage extends SerializedBuffer { this._sequence = buffer.readInt32LE(6); this._flags = buffer.readInt8(10); this._data = buffer.subarray(11, 11 + length); - return this; + return this as unknown as T; } override get data(): Buffer { diff --git a/packages/shared/src/State.ts b/packages/shared/src/State.ts index 8def5ad46..221d2ed16 100644 --- a/packages/shared/src/State.ts +++ b/packages/shared/src/State.ts @@ -181,7 +181,6 @@ export interface State { encryptions: Record; sessions: Record; // queuedConnections: Record; - onDataHandlers: Record; save: (state?: State) => void; } @@ -212,7 +211,6 @@ export function createInitialState({ encryptions: {}, sessions: {}, // queuedConnections: {}, - onDataHandlers: {}, save: function (state?: State) { if (typeof state === "undefined") { state = this as State; @@ -226,58 +224,6 @@ export function createInitialState({ }; } -/** - * Add a data handler to the state. - * - * This function adds a data handler to the state. - * The returned state is a new state object, and the original state is not - * modified. You should then call the save function on the new state to update - * the database. - * - * @param {State} state The state to add the data handler to. - * @param {number} port The port to add the data handler for. - * @param {OnDataHandler} handler The data - * handler to - * add. - * @returns {State} The state with the data handler added. - */ -export function addOnDataHandler( - state: State, - port: number, - handler: OnDataHandler, -): State { - const onDataHandlers = state.onDataHandlers; - onDataHandlers[port.toString()] = handler; - const newState = { - ...state, - onDataHandlers, - }; - return newState; -} - -/** - * Get a data handler for a port from the state. - * - * This function gets a data handler for a port from the state. - * - * @param {State} state The state to get the data handler from. - * @param {number} port The port to get the data handler for. - * @returns {OnDataHandler | undefined} The - * data - * handler - * for the - * given port, - * or undefined - * if no data - * handler exists - */ -export function getOnDataHandler( - state: State, - port: number, -): OnDataHandler | undefined { - return state.onDataHandlers[port.toString()]; -} - /** * Add an encryption to the state. * diff --git a/packages/shared/src/verifyLegacyCipherSupport.ts b/packages/shared/src/verifyLegacyCipherSupport.ts new file mode 100644 index 000000000..93f5ef4d7 --- /dev/null +++ b/packages/shared/src/verifyLegacyCipherSupport.ts @@ -0,0 +1,15 @@ +import { getCiphers } from "node:crypto"; + +/** + * This function checks if the server supports the legacy ciphers + * + * @returns void + * @throws Error if the server does not support the legacy ciphers + */ + +export function ensureLegacyCipherCompatibility() { + const cipherList = getCiphers(); + if (!cipherList.includes("des-cbc") || !cipherList.includes("rc4")) { + throw new Error("Legacy ciphers not available"); + } +} diff --git a/packages/transactions/src/_getPlayerPhysical.ts b/packages/transactions/src/_getPlayerPhysical.ts index 546dd57d8..227f8e690 100644 --- a/packages/transactions/src/_getPlayerPhysical.ts +++ b/packages/transactions/src/_getPlayerPhysical.ts @@ -1,4 +1,11 @@ -import { cloth_white, cloth_yellow, getServerLogger, hair_red, OldServerMessage, skin_pale } from "rusty-motors-shared"; +import { + cloth_white, + cloth_yellow, + getServerLogger, + hair_red, + OldServerMessage, + skin_pale, +} from "rusty-motors-shared"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerPhysicalMessage } from "./PlayerPhysicalMessage.js"; import type { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -13,7 +20,9 @@ export async function _getPlayerPhysical({ const getPlayerPhysicalMessage = new GenericRequestMessage(); getPlayerPhysicalMessage.deserialize(packet.data); - log.debug(`[${connectionId}] Received GenericRequestMessage: ${getPlayerPhysicalMessage.toString()}`); + log.debug( + `[${connectionId}] Received GenericRequestMessage: ${getPlayerPhysicalMessage.toString()}`, + ); const playerId = getPlayerPhysicalMessage.data.readUInt32LE(0); @@ -26,7 +35,9 @@ export async function _getPlayerPhysical({ playerPhysicalMessage._shirtColor = cloth_white; playerPhysicalMessage._pantsColor = cloth_yellow; - log.debug(`[${connectionId}] Sending PlayerPhysicalMessage: ${playerPhysicalMessage.toString()}`); + log.debug( + `[${connectionId}] Sending PlayerPhysicalMessage: ${playerPhysicalMessage.toString()}`, + ); const responsePacket = new OldServerMessage(); responsePacket._header.sequence = packet._header.sequence; diff --git a/packages/transactions/src/_getPlayerRaceHistory.ts b/packages/transactions/src/_getPlayerRaceHistory.ts index 5a8e4a4e9..e0f7424c7 100644 --- a/packages/transactions/src/_getPlayerRaceHistory.ts +++ b/packages/transactions/src/_getPlayerRaceHistory.ts @@ -8,14 +8,12 @@ import type { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; import { getRacingHistoryRecords } from "./database/racingHistoryRecords.js"; import { GenericReplyPayload } from "rusty-motors-shared-packets"; -const log = getServerLogger({ - name: "transactions/_getPlayerRaceHistory", -}); - export async function _getPlayerRaceHistory({ connectionId, packet, - log, + log = getServerLogger({ + name: "transactions._getPlayerRaceHistory", + }), }: MessageHandlerArgs): Promise { log.debug(`[${connectionId}] Handling _getPlayerRaceHistory...`); diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index b78e1d929..29d0b8406 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -14,7 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { getServerConfiguration, type ServerLogger } from "rusty-motors-shared"; +import { + getServerConfiguration, + McosEncryption, + SerializedBufferOld, + type ServerLogger, + type State, +} from "rusty-motors-shared"; import { fetchStateFromDatabase, getEncryption, @@ -22,43 +28,34 @@ import { } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { OldServerMessage } from "rusty-motors-shared"; -import { SerializedBufferOld } from "rusty-motors-shared"; -import { ServerMessage } from "rusty-motors-shared"; -import { messageHandlers } from "./handlers.js"; -import type { BufferSerializer } from "rusty-motors-shared-packets"; +import { messageHandlers, type MessageHandlerResult } from "./handlers.js"; +import { + ServerPacket, + type BufferSerializer, +} from "rusty-motors-shared-packets"; import { _MSG_STRING } from "./_MSG_STRING.js"; -/** - * - * - * @param {ServerMessage} message - * @return {boolean} - */ -function isMessageEncrypted( - message: OldServerMessage | ServerMessage, -): boolean { - return message._header.flags - 8 >= 0; -} - /** * Route or process MCOTS commands - * @param {import("./handlers.js").MessageHandlerArgs} args - * @returns {Promise} + * @param {MessageHandlerArgs} args + * @returns {Promise} */ async function processInput({ connectionId, - packet, + inboundMessage, log = getServerLogger({ name: "transactionServer", }), -}: import("./handlers.js").MessageHandlerArgs): Promise< - import("./handlers.js").MessageHandlerResult -> { - const currentMessageNo = packet._msgNo; +}: { + connectionId: string; + inboundMessage: ServerPacket; + log?: ServerLogger; +}): Promise { + const currentMessageNo = inboundMessage.getMessageId(); const currentMessageString = _MSG_STRING(currentMessageNo); log.debug( - `[${connectionId}] Processing message: ${currentMessageNo} (${currentMessageString}), sequence: ${packet._header.sequence}`, + `[${connectionId}] Processing message: ${currentMessageNo} (${currentMessageString}), sequence: ${inboundMessage.getSequence()}`, ); const result = messageHandlers.find( @@ -66,6 +63,10 @@ async function processInput({ ); if (typeof result !== "undefined") { + // Turn this into an OldServerMessage for compatibility + const packet = new OldServerMessage(); + packet._doDeserialize(inboundMessage.serialize()); + try { const responsePackets = await result.handler({ connectionId, @@ -74,9 +75,9 @@ async function processInput({ }); return responsePackets; } catch (error) { - const err = Error(`[${connectionId}] Error processing message`, - { cause: error } - ); + const err = Error(`[${connectionId}] Error processing message`, { + cause: error, + }); throw err; } } @@ -100,7 +101,7 @@ export async function receiveTransactionsData({ connectionId, message, log = getServerLogger({ - name: "transactionServer", + name: "transactionServer.receiveTransactionsData", level: getServerConfiguration({}).logLevel ?? "info", }), }: { @@ -113,16 +114,19 @@ export async function receiveTransactionsData({ }> { log.debug(`[${connectionId}] Entering transaction module`); - // Going to use ServerMessage in this module + // Normalize the message + + const inboundMessage = new ServerPacket(); + inboundMessage.deserialize(message.serialize()); - const inboundMessage = new OldServerMessage(); - inboundMessage._doDeserialize(message.serialize()); log.debug( `[${connectionId}] Received message: ${inboundMessage.toHexString()}`, ); + let decryptedMessage: ServerPacket; + // Is the message encrypted? - if (isMessageEncrypted(inboundMessage)) { + if (inboundMessage.isPayloadEncrypted()) { log.debug(`[${connectionId}] Message is encrypted`); // Get the encryyption settings for this connection const state = fetchStateFromDatabase(); @@ -135,51 +139,39 @@ export async function receiveTransactionsData({ // log the old buffer log.debug( - `[${connectionId}] Inbound buffer: ${inboundMessage.data.toString("hex")}`, + `[${connectionId}] Inbound buffer: ${inboundMessage.data.toHexString()}`, ); - try { - const decryptedMessage = encryptionSettings.dataEncryption.decrypt( - inboundMessage.data, - ); - updateEncryption(state, encryptionSettings).save(); - - // Verify the length of the message - verifyLength(inboundMessage.data, decryptedMessage); - - // Assuming the message was decrypted successfully, update the buffer - log.debug( - `[${connectionId}] Decrypted buffer: ${decryptedMessage.toString("hex")}`, - ); - - inboundMessage.setBuffer(decryptedMessage); - inboundMessage._header.flags -= 8; - inboundMessage.updateMsgNo(); - - log.debug( - `[${connectionId}] Decrypted message: ${inboundMessage.toHexString()}`, - ); - } catch (error) { - const err = Error(`[${connectionId}] Unable to decrypt message`, { - cause: error, - }); - throw err; - } + decryptedMessage = decryptMessage( + encryptionSettings, + inboundMessage, + state, + log, + connectionId, + ); + } else { + log.debug(`[${connectionId}] Message is not encrypted`); + decryptedMessage = inboundMessage; } + // Process the message + const response = await processInput({ connectionId, - packet: inboundMessage, + inboundMessage: decryptedMessage, log, }); // Loop through the outbound messages and encrypt them - const outboundMessages: SerializedBufferOld[] = []; + const outboundMessages: ServerPacket[] = []; - response.messages.forEach((outboundMessage) => { + response.messages.forEach((message) => { log.debug(`[${connectionId}] Processing outbound message`); - if (isMessageEncrypted(outboundMessage)) { + const outboundMessage = new ServerPacket(); + outboundMessage.deserialize(message.serialize()); + + if (outboundMessage.isPayloadEncrypted()) { const state = fetchStateFromDatabase(); const encryptionSettings = getEncryption(state, connectionId); @@ -190,49 +182,22 @@ export async function receiveTransactionsData({ // log the old buffer log.debug( - `[${connectionId}] Outbound buffer: ${outboundMessage.data.toString("hex")}`, + `[${connectionId}] Outbound buffer: ${outboundMessage.data.toHexString()}`, ); - try { - const encryptedMessage = encryptionSettings.dataEncryption.encrypt( - outboundMessage.data, - ); - updateEncryption(state, encryptionSettings).save(); - - // Verify the length of the message - verifyLength(outboundMessage.data, encryptedMessage); - - // Assuming the message was decrypted successfully, update the buffer - - log.debug( - `[${connectionId}] Encrypted buffer: ${encryptedMessage.toString("hex")}`, - ); - - outboundMessage.setBuffer(encryptedMessage); - - log.debug( - `[${connectionId}] Encrypted message: ${outboundMessage.toHexString()}`, - ); - - const outboundRawMessage = new SerializedBufferOld(); - outboundRawMessage.setBuffer(outboundMessage.serialize()); - log.debug( - `[${connectionId}] Outbound message: ${outboundRawMessage.toHexString()}`, - ); - outboundMessages.push(outboundRawMessage); - } catch (error) { - const err = Error(`[${connectionId}] Unable to encrypt message`, { - cause: error, - }); - throw err; - } + const encryptedMessage = encryptOutboundMessage( + encryptionSettings, + outboundMessage, + state, + log, + connectionId, + ); + outboundMessages.push(encryptedMessage); } else { - const outboundRawMessage = new SerializedBufferOld(); - outboundRawMessage.setBuffer(outboundMessage.serialize()); log.debug( - `[${connectionId}] Outbound message: ${outboundRawMessage.toHexString()}`, + `[${connectionId}] Outbound message: ${outboundMessage.toHexString()}`, ); - outboundMessages.push(outboundRawMessage); + outboundMessages.push(outboundMessage); } }); @@ -240,12 +205,109 @@ export async function receiveTransactionsData({ `[${connectionId}] Exiting transaction module with ${outboundMessages.length} messages`, ); + // Convert the outbound messages to SerializedBufferOld + const outboundMessagesSerialized = outboundMessages.map((message) => { + const serialized = new SerializedBufferOld(); + serialized._doDeserialize(message.serialize()); + return serialized; + }); + return { connectionId, - messages: outboundMessages, + messages: outboundMessagesSerialized, }; } +/** + * Decrypts an inbound message using the provided encryption settings and updates the state. + * + * @param encryptionSettings - The encryption settings to use for decryption. + * @param inboundMessage - The message to be decrypted. + * @param state - The current state of the server. + * @param log - The logger instance to use for logging. Defaults to a server logger with the name "transactionServer.decryptMessage". + * @param connectionId - The ID of the connection associated with the message. + * @returns The decrypted message as a `ServerPacket`. + * @throws Will throw an error if the message cannot be decrypted. + */ +function decryptMessage( + encryptionSettings: McosEncryption, + inboundMessage: ServerPacket, + state: State, + log: ServerLogger = getServerLogger({ + name: "transactionServer.decryptMessage", + }), + connectionId: string, +): ServerPacket { + try { + const decryptedMessage = encryptionSettings.dataEncryption.decrypt( + inboundMessage.data.serialize(), + ); + updateEncryption(state, encryptionSettings).save(); + + // Verify the length of the message + verifyLength(inboundMessage.data.serialize(), decryptedMessage); + + // Assuming the message was decrypted successfully, update the buffer + log.debug( + `[${connectionId}] Decrypted buffer: ${decryptedMessage.toString("hex")}`, + ); + + const outboundMessage = ServerPacket.copy(inboundMessage, decryptedMessage); + outboundMessage.setPayloadEncryption(false); + + log.debug( + `[${connectionId}] Decrypted message: ${inboundMessage.toHexString()}`, + ); + + return outboundMessage; + } catch (error) { + const err = Error(`[${connectionId}] Unable to decrypt message`, { + cause: error, + }); + throw err; + } +} + +function encryptOutboundMessage( + encryptionSettings: McosEncryption, + unencryptedMessage: ServerPacket, + state: State, + log: ServerLogger, + connectionId: string, +): ServerPacket { + try { + const encryptedMessage = encryptionSettings.dataEncryption.encrypt( + unencryptedMessage.data.serialize(), + ); + updateEncryption(state, encryptionSettings).save(); + + // Verify the length of the message + verifyLength(unencryptedMessage.data.serialize(), encryptedMessage); + + // Assuming the message was decrypted successfully, update the buffer + log.debug( + `[${connectionId}] Encrypted buffer: ${encryptedMessage.toString("hex")}`, + ); + + const outboundMessage = ServerPacket.copy( + unencryptedMessage, + encryptedMessage, + ); + outboundMessage.setPayloadEncryption(true); + + log.debug( + `[${connectionId}] Encrypted message: ${outboundMessage.toHexString()}`, + ); + + return outboundMessage; + } catch (error) { + const err = Error(`[${connectionId}] Unable to encrypt message`, { + cause: error, + }); + throw err; + } +} + /** * @param {Buffer} buffer * @param {Buffer} buffer2 diff --git a/packages/transactions/src/login.ts b/packages/transactions/src/login.ts index fd756fe34..30e3927c6 100644 --- a/packages/transactions/src/login.ts +++ b/packages/transactions/src/login.ts @@ -17,7 +17,7 @@ export async function login({ log, }: MessageHandlerArgs): Promise { // Normalize the packet - const incomingPacket = new ServerPacket(0); + const incomingPacket = new ServerPacket(); incomingPacket.deserialize(packet.serialize()); log.debug( @@ -50,8 +50,7 @@ export async function login({ // Normalize the packet - const outgoingPacket = new ServerPacket(response.messageId); - outgoingPacket.deserialize(response.serialize()); + const outgoingPacket = ServerPacket.copy(incomingPacket, response.serialize()); outgoingPacket.setSequence(incomingPacket.getSequence()); outgoingPacket.setPayloadEncryption(true); outgoingPacket.setSignature("TOMC"); @@ -59,7 +58,7 @@ export async function login({ log.debug(`[${connectionId}] Sending response: ${outgoingPacket.toString()}`); log.debug( - `[${connectionId}] Sending response: ${outgoingPacket.serialize().toString("hex")}`, + `[${connectionId}] Sending response(hex): ${outgoingPacket.serialize().toString("hex")}`, ); const responsePacket = new OldServerMessage(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41bc5f0c8..ce573a81d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@adminjs/sequelize': specifier: ^4.1.1 - version: 4.1.1(adminjs@7.8.13(@types/react@18.3.4))(sequelize@6.37.4) + version: 4.1.1(adminjs@7.8.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11))(sequelize@6.37.4) '@databases/pg': specifier: ^5.5.0 version: 5.5.0(typescript@5.6.3) @@ -28,13 +28,10 @@ importers: version: 8.34.0 adminjs: specifier: ^7.8.13 - version: 7.8.13(@types/react@18.3.4) + version: 7.8.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11) fastify: specifier: ^5.0.0 version: 5.0.0 - lobby: - specifier: link:packages/lobby - version: link:packages/lobby moment: specifier: ^2.30.1 version: 2.30.1 @@ -50,9 +47,6 @@ importers: rusty-motors-cli: specifier: link:packages/cli version: link:packages/cli - rusty-motors-connection: - specifier: link:packages/connection - version: link:packages/connection rusty-motors-database: specifier: link:packages/database version: link:packages/database @@ -77,9 +71,6 @@ importers: rusty-motors-personas: specifier: link:packages/persona version: link:packages/persona - rusty-motors-sessions: - specifier: link:packages/sessions - version: link:packages/sessions rusty-motors-shard: specifier: link:packages/shard version: link:packages/shard @@ -103,14 +94,14 @@ importers: version: 5.1.1 ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) + version: 10.9.2(@types/node@20.16.11)(typescript@5.6.3) devDependencies: '@biomejs/biome': specifier: 1.9.3 version: 1.9.3 '@commitlint/cli': specifier: ^19.5.0 - version: 19.5.0(@types/node@22.7.5)(typescript@5.6.3) + version: 19.5.0(@types/node@20.16.11)(typescript@5.6.3) '@commitlint/config-conventional': specifier: ^19.5.0 version: 19.5.0 @@ -133,8 +124,8 @@ importers: specifier: 5.0.0 version: 5.0.0 '@types/node': - specifier: ^22.7.5 - version: 22.7.5 + specifier: ^20.16.11 + version: 20.16.11 '@types/sinon': specifier: 17.0.3 version: 17.0.3 @@ -149,7 +140,7 @@ importers: version: 8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) '@vitest/coverage-v8': specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) eslint: specifier: ^9.12.0 version: 9.12.0(jiti@1.21.6) @@ -191,7 +182,7 @@ importers: version: 5.0.5(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/cli: dependencies: @@ -201,10 +192,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/database: dependencies: @@ -229,10 +220,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/gateway: dependencies: @@ -245,10 +236,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/lobby: dependencies: @@ -261,10 +252,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/login: dependencies: @@ -277,10 +268,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/mcots: dependencies: @@ -293,10 +284,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/nps: dependencies: @@ -309,10 +300,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/patch: dependencies: @@ -322,10 +313,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/persona: dependencies: @@ -338,26 +329,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) - - packages/sessions: - dependencies: - '@sentry/profiling-node': - specifier: 8.34.0 - version: 8.34.0 - short-unique-id: - specifier: ^5.2.0 - version: 5.2.0 - devDependencies: - '@vitest/coverage-v8': - specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) - vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/shard: dependencies: @@ -367,10 +342,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/shared: dependencies: @@ -383,10 +358,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/shared-packets: dependencies: @@ -396,10 +371,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages/transactions: dependencies: @@ -409,10 +384,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)) + version: 2.1.2(vitest@2.1.2(@types/node@20.16.11)) vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) src/chat: dependencies: @@ -425,7 +400,7 @@ importers: version: 2.0.6 vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) src/socket: dependencies: @@ -438,7 +413,7 @@ importers: version: 2.0.6 vitest: specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5) + version: 2.1.2(@types/node@20.16.11) packages: @@ -458,42 +433,42 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + '@babel/code-frame@7.25.7': + resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.25.8': + resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + '@babel/core@7.25.8': + resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/generator@7.25.7': + resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + '@babel/helper-annotate-as-pure@7.25.7': + resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': - resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.7': + resolution: {integrity: sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-compilation-targets@7.25.7': + resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.0': - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + '@babel/helper-create-class-features-plugin@7.25.7': + resolution: {integrity: sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.25.2': - resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + '@babel/helper-create-regexp-features-plugin@7.25.7': + resolution: {integrity: sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -503,103 +478,103 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + '@babel/helper-member-expression-to-functions@7.25.7': + resolution: {integrity: sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/helper-module-imports@7.25.7': + resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-module-transforms@7.25.7': + resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + '@babel/helper-optimise-call-expression@7.25.7': + resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/helper-plugin-utils@7.25.7': + resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.0': - resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + '@babel/helper-remap-async-to-generator@7.25.7': + resolution: {integrity: sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + '@babel/helper-replace-supers@7.25.7': + resolution: {integrity: sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-simple-access@7.25.7': + resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.7': + resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-string-parser@7.25.7': + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-validator-option@7.25.7': + resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.0': - resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + '@babel/helper-wrap-function@7.25.7': + resolution: {integrity: sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.25.7': + resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/highlight@7.25.7': + resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.25.8': + resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': - resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.7': + resolution: {integrity: sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': - resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.7': + resolution: {integrity: sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': - resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.7': + resolution: {integrity: sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': - resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.7': + resolution: {integrity: sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': - resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.7': + resolution: {integrity: sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -610,104 +585,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-export-namespace-from@7.8.3': - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.24.7': - resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.24.7': - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + '@babel/plugin-syntax-import-assertions@7.25.7': + resolution: {integrity: sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + '@babel/plugin-syntax-import-attributes@7.25.7': + resolution: {integrity: sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + '@babel/plugin-syntax-jsx@7.25.7': + resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.7': - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + '@babel/plugin-syntax-typescript@7.25.7': + resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -718,338 +615,338 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.7': - resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + '@babel/plugin-transform-arrow-functions@7.25.7': + resolution: {integrity: sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.25.0': - resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} + '@babel/plugin-transform-async-generator-functions@7.25.8': + resolution: {integrity: sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.7': - resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + '@babel/plugin-transform-async-to-generator@7.25.7': + resolution: {integrity: sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.7': - resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + '@babel/plugin-transform-block-scoped-functions@7.25.7': + resolution: {integrity: sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.0': - resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + '@babel/plugin-transform-block-scoping@7.25.7': + resolution: {integrity: sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.7': - resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + '@babel/plugin-transform-class-properties@7.25.7': + resolution: {integrity: sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.7': - resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + '@babel/plugin-transform-class-static-block@7.25.8': + resolution: {integrity: sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.0': - resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + '@babel/plugin-transform-classes@7.25.7': + resolution: {integrity: sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.7': - resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + '@babel/plugin-transform-computed-properties@7.25.7': + resolution: {integrity: sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.8': - resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + '@babel/plugin-transform-destructuring@7.25.7': + resolution: {integrity: sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.7': - resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + '@babel/plugin-transform-dotall-regex@7.25.7': + resolution: {integrity: sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.7': - resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + '@babel/plugin-transform-duplicate-keys@7.25.7': + resolution: {integrity: sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': - resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.7': + resolution: {integrity: sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.24.7': - resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + '@babel/plugin-transform-dynamic-import@7.25.8': + resolution: {integrity: sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.7': - resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + '@babel/plugin-transform-exponentiation-operator@7.25.7': + resolution: {integrity: sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.7': - resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + '@babel/plugin-transform-export-namespace-from@7.25.8': + resolution: {integrity: sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.7': - resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + '@babel/plugin-transform-for-of@7.25.7': + resolution: {integrity: sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.1': - resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + '@babel/plugin-transform-function-name@7.25.7': + resolution: {integrity: sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.7': - resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + '@babel/plugin-transform-json-strings@7.25.8': + resolution: {integrity: sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.2': - resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + '@babel/plugin-transform-literals@7.25.7': + resolution: {integrity: sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.7': - resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + '@babel/plugin-transform-logical-assignment-operators@7.25.8': + resolution: {integrity: sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.7': - resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + '@babel/plugin-transform-member-expression-literals@7.25.7': + resolution: {integrity: sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.7': - resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + '@babel/plugin-transform-modules-amd@7.25.7': + resolution: {integrity: sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.8': - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + '@babel/plugin-transform-modules-commonjs@7.25.7': + resolution: {integrity: sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.0': - resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + '@babel/plugin-transform-modules-systemjs@7.25.7': + resolution: {integrity: sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.7': - resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + '@babel/plugin-transform-modules-umd@7.25.7': + resolution: {integrity: sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': - resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.7': + resolution: {integrity: sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.7': - resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + '@babel/plugin-transform-new-target@7.25.7': + resolution: {integrity: sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': - resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + '@babel/plugin-transform-nullish-coalescing-operator@7.25.8': + resolution: {integrity: sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.7': - resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + '@babel/plugin-transform-numeric-separator@7.25.8': + resolution: {integrity: sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.7': - resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + '@babel/plugin-transform-object-rest-spread@7.25.8': + resolution: {integrity: sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.7': - resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + '@babel/plugin-transform-object-super@7.25.7': + resolution: {integrity: sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.7': - resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + '@babel/plugin-transform-optional-catch-binding@7.25.8': + resolution: {integrity: sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.8': - resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + '@babel/plugin-transform-optional-chaining@7.25.8': + resolution: {integrity: sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.7': - resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + '@babel/plugin-transform-parameters@7.25.7': + resolution: {integrity: sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.7': - resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + '@babel/plugin-transform-private-methods@7.25.7': + resolution: {integrity: sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.7': - resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + '@babel/plugin-transform-private-property-in-object@7.25.8': + resolution: {integrity: sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.7': - resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + '@babel/plugin-transform-property-literals@7.25.7': + resolution: {integrity: sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.24.7': - resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + '@babel/plugin-transform-react-display-name@7.25.7': + resolution: {integrity: sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.24.7': - resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + '@babel/plugin-transform-react-jsx-development@7.25.7': + resolution: {integrity: sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.2': - resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} + '@babel/plugin-transform-react-jsx@7.25.7': + resolution: {integrity: sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.24.7': - resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + '@babel/plugin-transform-react-pure-annotations@7.25.7': + resolution: {integrity: sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.7': - resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + '@babel/plugin-transform-regenerator@7.25.7': + resolution: {integrity: sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.7': - resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + '@babel/plugin-transform-reserved-words@7.25.7': + resolution: {integrity: sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.24.7': - resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} + '@babel/plugin-transform-runtime@7.25.7': + resolution: {integrity: sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.7': - resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + '@babel/plugin-transform-shorthand-properties@7.25.7': + resolution: {integrity: sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.7': - resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + '@babel/plugin-transform-spread@7.25.7': + resolution: {integrity: sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.7': - resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + '@babel/plugin-transform-sticky-regex@7.25.7': + resolution: {integrity: sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.7': - resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + '@babel/plugin-transform-template-literals@7.25.7': + resolution: {integrity: sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.8': - resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + '@babel/plugin-transform-typeof-symbol@7.25.7': + resolution: {integrity: sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.25.2': - resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + '@babel/plugin-transform-typescript@7.25.7': + resolution: {integrity: sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.7': - resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + '@babel/plugin-transform-unicode-escapes@7.25.7': + resolution: {integrity: sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.7': - resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + '@babel/plugin-transform-unicode-property-regex@7.25.7': + resolution: {integrity: sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.7': - resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + '@babel/plugin-transform-unicode-regex@7.25.7': + resolution: {integrity: sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.7': - resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + '@babel/plugin-transform-unicode-sets-regex@7.25.7': + resolution: {integrity: sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.25.3': - resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} + '@babel/preset-env@7.25.8': + resolution: {integrity: sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1059,41 +956,38 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.24.7': - resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + '@babel/preset-react@7.25.7': + resolution: {integrity: sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.24.7': - resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + '@babel/preset-typescript@7.25.7': + resolution: {integrity: sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.24.6': - resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} + '@babel/register@7.25.7': + resolution: {integrity: sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/regjsgen@0.8.0': - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.25.7': + resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/template@7.25.7': + resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.3': - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + '@babel/traverse@7.25.7': + resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.25.8': + resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1321,8 +1215,8 @@ packages: '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@emotion/is-prop-valid@1.3.0': - resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} @@ -1336,8 +1230,8 @@ packages: '@types/react': optional: true - '@emotion/serialize@1.3.1': - resolution: {integrity: sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==} + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} @@ -1356,8 +1250,8 @@ packages: peerDependencies: react: '>=16.8.0' - '@emotion/utils@1.4.0': - resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} @@ -1650,8 +1544,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.18.0': @@ -1670,8 +1564,8 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eslint/js@9.12.0': @@ -1686,14 +1580,14 @@ packages: resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/ajv-compiler@4.0.0': - resolution: {integrity: sha512-dt0jyLAlay14LpIn4Fg1SY7V5NJ9KH0YFDpYVQY5cgIVBvdI8908AMx5zQ0bBYPGT6Wh+bM3f2caMmOXLP3QsQ==} + '@fastify/ajv-compiler@4.0.1': + resolution: {integrity: sha512-DxrBdgsjNLP0YM6W5Hd6/Fmj43S8zMKiFJYgi+Ri3htTGAowPVG/tG1wpnWLMjufEnehRivUCKZ1pLDIoZdTuw==} '@fastify/error@4.0.0': resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} - '@fastify/fast-json-stringify-compiler@5.0.0': - resolution: {integrity: sha512-tywfuZfXsyxLC5kEqrMubbFa9vpAxNtuPE7j9w5si1r+6p5b981pDfZ5Y8HBqmjDQl+PABT7cV5jZgXI2j+I5g==} + '@fastify/fast-json-stringify-compiler@5.0.1': + resolution: {integrity: sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==} '@fastify/merge-json-schemas@0.1.1': resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} @@ -1701,14 +1595,14 @@ packages: '@fastify/sensible@6.0.1': resolution: {integrity: sha512-D0rN0kMeZKP23f4w9MoCI9e4+n7vASFAsGoRNn9bondSbplLeIfR2HcjCbyElAM04jGrPRLi/edyThEPOyC9cQ==} - '@floating-ui/core@1.6.7': - resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - '@floating-ui/dom@1.6.10': - resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + '@floating-ui/dom@1.6.11': + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - '@floating-ui/utils@0.2.7': - resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} '@hello-pangea/dnd@16.6.0': resolution: {integrity: sha512-vfZ4GydqbtUPXSLfAvKvXQ6xwRzIjUSjVU0Sx+70VOhc2xx6CdmJXJ8YhH70RpbTUGjxctslQTHul9sIOxCfFQ==} @@ -1724,8 +1618,8 @@ packages: resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead @@ -1751,8 +1645,8 @@ packages: prop-types: ^15.0.0 react: '>=0.14.0' - '@inquirer/figures@1.0.5': - resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + '@inquirer/figures@1.0.7': + resolution: {integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==} engines: {node: '>=18'} '@isaacs/cliui@8.0.2': @@ -1796,15 +1690,17 @@ packages: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} - '@noble/ciphers@0.5.3': - resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} + '@noble/ciphers@1.0.0': + resolution: {integrity: sha512-wH5EHOmLi0rEazphPbecAzmjd12I6/Yv/SiHdkA9LSycsQk7RuuTp7am5/o62qYr0RScE7Pc9icXGBbsr6cesA==} + engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.5.0': - resolution: {integrity: sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==} + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1830,14 +1726,8 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@1.25.1': - resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@1.25.1': - resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} + '@opentelemetry/context-async-hooks@1.26.0': + resolution: {integrity: sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -1996,20 +1886,14 @@ packages: resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} engines: {node: '>=14'} - '@opentelemetry/resources@1.25.1': - resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.26.0': resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.25.1': - resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} + '@opentelemetry/sdk-metrics@1.26.0': + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -2020,10 +1904,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.25.1': - resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} - engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.27.0': resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} engines: {node: '>=14'} @@ -2056,8 +1936,8 @@ packages: '@remirror/core-constants@2.0.2': resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} - '@remix-run/router@1.19.1': - resolution: {integrity: sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==} + '@remix-run/router@1.19.2': + resolution: {integrity: sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==} engines: {node: '>=14.0.0'} '@rollup/plugin-babel@6.0.4': @@ -2100,8 +1980,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + '@rollup/plugin-node-resolve@15.3.0': + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -2118,8 +1998,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + '@rollup/pluginutils@5.1.2': + resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2127,83 +2007,83 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.21.0': - resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} + '@rollup/rollup-android-arm-eabi@4.24.0': + resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.21.0': - resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} + '@rollup/rollup-android-arm64@4.24.0': + resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.21.0': - resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} + '@rollup/rollup-darwin-arm64@4.24.0': + resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.21.0': - resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} + '@rollup/rollup-darwin-x64@4.24.0': + resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.21.0': - resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.21.0': - resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} + '@rollup/rollup-linux-arm-musleabihf@4.24.0': + resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.21.0': - resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} + '@rollup/rollup-linux-arm64-gnu@4.24.0': + resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.21.0': - resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} + '@rollup/rollup-linux-arm64-musl@4.24.0': + resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': - resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.21.0': - resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} + '@rollup/rollup-linux-riscv64-gnu@4.24.0': + resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.21.0': - resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} + '@rollup/rollup-linux-s390x-gnu@4.24.0': + resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.21.0': - resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} + '@rollup/rollup-linux-x64-gnu@4.24.0': + resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.21.0': - resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} + '@rollup/rollup-linux-x64-musl@4.24.0': + resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.21.0': - resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} + '@rollup/rollup-win32-arm64-msvc@4.24.0': + resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.21.0': - resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} + '@rollup/rollup-win32-ia32-msvc@4.24.0': + resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.21.0': - resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} + '@rollup/rollup-win32-x64-msvc@4.24.0': + resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} cpu: [x64] os: [win32] @@ -2337,15 +2217,15 @@ packages: peerDependencies: '@tiptap/pm': ^2.0.0 - '@tiptap/extension-blockquote@2.6.5': - resolution: {integrity: sha512-lKg/8UfsToG0GycizXGqFlA4/ptB3KumM8ch3MBKRLqy/yViu4oXpbTCqE9sqx/WNUYiriPrvkQnBW10LfFIJQ==} + '@tiptap/extension-blockquote@2.8.0': + resolution: {integrity: sha512-m3CKrOIvV7fY1Ak2gYf5LkKiz6AHxHpg6wxfVaJvdBqXgLyVtHo552N+A4oSHOSRbB4AG9EBQ2NeBM8cdEQ4MA==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.6.5': - resolution: {integrity: sha512-ey78g9YCOQi+qQ58QBFvWJVIXLQ+9isamshO9lzoc4RdtWDm+WuIUmmyoeneRcQixbVlyvOOMUf7PNKdIZHHtg==} + '@tiptap/extension-bold@2.8.0': + resolution: {integrity: sha512-U1YkZBxDkSLNvPNiqxB5g42IeJHr27C7zDb/yGQN2xL4UBeg4O9xVhCFfe32f6tLwivSL0dar4ScElpaCJuqow==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 '@tiptap/extension-bubble-menu@2.1.13': resolution: {integrity: sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==} @@ -2353,10 +2233,12 @@ packages: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-bullet-list@2.6.5': - resolution: {integrity: sha512-6r1sc7voURIVU1bl6D9iBOJCHRQphQXHRzE2tLENCHdT8nlgO6wRwAIUVaps8Xkckr+WkLEeHTun+AD6bS+Q3A==} + '@tiptap/extension-bullet-list@2.8.0': + resolution: {integrity: sha512-H4O2X0ozbc/ce9/XF1H98sqWVUdtt7jzy7hMBunwmY8ZxI4dHtcRkeg81CZbpKTqOqRrMCLWjE3M2tgiDXrDkA==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/extension-list-item': ^2.7.0 + '@tiptap/extension-text-style': ^2.7.0 '@tiptap/extension-character-count@2.1.13': resolution: {integrity: sha512-FxPxS/Uqd4MgndInxXOcgNd225541Nsk1lT5e2uNTSNiQnG7dj7cSFG5KXGcSGLpGGt6e/E28WR6KLV+0/u+WA==} @@ -2364,11 +2246,11 @@ packages: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-code-block@2.6.5': - resolution: {integrity: sha512-kV8VAerd3z23zv6vZSVkq0JJs0emzWb3KyrLsiUuhR1Yj+zgcxer3zw4IJlmDeDhp6qIXK/qTgHzNcxS+fV4Rw==} + '@tiptap/extension-code-block@2.8.0': + resolution: {integrity: sha512-POuA5Igx+Dto0DTazoBFAQTj/M/FCdkqRVD9Uhsxhv49swPyANTJRr05vgbgtHB+NDDsZfCawVh7pI0IAD/O0w==} peerDependencies: - '@tiptap/core': ^2.6.5 - '@tiptap/pm': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 '@tiptap/extension-code@2.1.13': resolution: {integrity: sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==} @@ -2380,11 +2262,11 @@ packages: peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-dropcursor@2.6.5': - resolution: {integrity: sha512-4Kh/TseGVSwt4eoZ6EcFZiCxhK3wSrUUTwltxdeNQVsCYG1jBfflOhIyy41fMC8N73KlnaLjQXsCvesUNx/X2Q==} + '@tiptap/extension-dropcursor@2.8.0': + resolution: {integrity: sha512-rAFvx44YuT6dtS1c+ALw0ROAGI16l5L1HxquL4hR1gtxDcTieST5xhw5bkshXlmrlfotZXPrhokzqA7qjhZtJw==} peerDependencies: - '@tiptap/core': ^2.6.5 - '@tiptap/pm': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 '@tiptap/extension-floating-menu@2.1.13': resolution: {integrity: sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==} @@ -2392,43 +2274,43 @@ packages: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-gapcursor@2.6.5': - resolution: {integrity: sha512-ga6bSmvcd0YuM6xKMg4E8YzzIPWbT9oZOIM2euNLPCZHDlIeUeNewbNa9exPotg1GZJIrYO52dKvOSJ+U0dVqA==} + '@tiptap/extension-gapcursor@2.8.0': + resolution: {integrity: sha512-Be1LWCmvteQInOnNVN+HTqc1XWsj1bCl+Q7et8qqNjtGtTaCbdCp8ppcH1SKJxNTM/RLUtPyJ8FDgOTj51ixCA==} peerDependencies: - '@tiptap/core': ^2.6.5 - '@tiptap/pm': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.6.5': - resolution: {integrity: sha512-5DcI6hDm3pw5I1jWwzNo/tx/2Nx+as4Nl6Stk3tJO1WPKCWPWouyR62EHyzhgMqcPFKRUWtWpeHag2rGDoY4Bw==} + '@tiptap/extension-hard-break@2.8.0': + resolution: {integrity: sha512-vqiIfviNiCmy/pJTHuDSCAGL2O4QDEdDmAvGJu8oRmElUrnlg8DbJUfKvn6DWQHNSQwRb+LDrwWlzAYj1K9u6A==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 '@tiptap/extension-heading@2.1.13': resolution: {integrity: sha512-PEmc19QLmlVUTiHWoF0hpgNTNPNU0nlaFmMKskzO+cx5Df4xvHmv/UqoIwp7/UFbPMkfVJT1ozQU7oD1IWn9Hg==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-history@2.6.5': - resolution: {integrity: sha512-zDCXiVKfqii0D+Q9lu65skW3+4Jqzicge+sw42YBQp4H7jXLJC55QoLuctwhl4iGXliiWnobRpotTPdaUXYhoA==} + '@tiptap/extension-history@2.8.0': + resolution: {integrity: sha512-u5YS0J5Egsxt8TUWMMAC3QhPZaak+IzQeyHch4gtqxftx96tprItY7AD/A3pGDF2uCSnN+SZrk6yVexm6EncDw==} peerDependencies: - '@tiptap/core': ^2.6.5 - '@tiptap/pm': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.6.5': - resolution: {integrity: sha512-NzbbzR9VQ0YY/NbjiRxuk7k1M0GfCx327I/TXc7/0YTQ2Am3QvOtrnpwQsM4P9920yhc6QT65ZP63LXcJFkiBg==} + '@tiptap/extension-horizontal-rule@2.8.0': + resolution: {integrity: sha512-Sn/MI8WVFBoIYSIHA9NJryJIyCEzZdRysau8pC5TFnfifre0QV1ksPz2bgF+DyCD69ozQiRdBBHDEwKe47ZbfQ==} peerDependencies: - '@tiptap/core': ^2.6.5 - '@tiptap/pm': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 '@tiptap/extension-image@2.1.13': resolution: {integrity: sha512-7oVAos+BU4KR/zQsfltrd8hgIxKxyxZ19dhwb1BJI2Nt3Mnx+yFPRlRSehID6RT9dYqgW4UW5d6vh/3HQcYYYw==} peerDependencies: '@tiptap/core': ^2.0.0 - '@tiptap/extension-italic@2.6.5': - resolution: {integrity: sha512-g+OC1KcgKu3xhaydTRDcw/Ydr+EEAVLelmtwNILv5UfypFDvcYZRQNqF5/m2ZJ6kjtXQQ8whC3ddMGUgxs29Bg==} + '@tiptap/extension-italic@2.8.0': + resolution: {integrity: sha512-PwwSE2LTYiHI47NJnsfhBmPiLE8IXZYqaSoNPU6flPrk1KxEzqvRI1joKZBmD9wuqzmHJ93VFIeZcC+kfwi8ZA==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 '@tiptap/extension-link@2.1.13': resolution: {integrity: sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==} @@ -2436,25 +2318,27 @@ packages: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 - '@tiptap/extension-list-item@2.6.5': - resolution: {integrity: sha512-Ks/m2spl3t3pX8W23H1clq0CQ2cGrLKdPxpSn3DAbZxYjT3SF7jpJaG3e+MKKh84PcjY0Xa3FextuLFRSLlgOw==} + '@tiptap/extension-list-item@2.8.0': + resolution: {integrity: sha512-o7OGymGxB0B9x3x2prp3KBDYFuBYGc5sW69O672jk8G52DqhzzndgPnkk0qUn8nXAUKuDGbJmpmHVA2kagqnRg==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 - '@tiptap/extension-ordered-list@2.6.5': - resolution: {integrity: sha512-brTZiwS3Lg3bFXCJABfJ1UOLiX08BNnWw/mOBYuKsnBvIPJQpJ98C1galnX77ihsjFtAUdVdm7xlwcX2q5x8Yg==} + '@tiptap/extension-ordered-list@2.8.0': + resolution: {integrity: sha512-sCvNbcTS1+5QTTXwUPFa10vf5I1pr8sGcOTIh0G+a5ZkS5+6FxT12k7VLzPt39QyNbOi+77U2o4Xr4XyaEkfSg==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 + '@tiptap/extension-list-item': ^2.7.0 + '@tiptap/extension-text-style': ^2.7.0 - '@tiptap/extension-paragraph@2.6.5': - resolution: {integrity: sha512-RGevQMVpqTxuU9Gz2G4STOVcqoP9i9Fc0QurM/B0mDjs5onzCCJLd6qIqxuT7WfFYILe8q3QIu8KB+XGmvmobQ==} + '@tiptap/extension-paragraph@2.8.0': + resolution: {integrity: sha512-XgxxNNbuBF48rAGwv7/s6as92/xjm/lTZIGTq9aG13ClUKFtgdel7C33SpUCcxg3cO2WkEyllXVyKUiauFZw/A==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 - '@tiptap/extension-strike@2.6.5': - resolution: {integrity: sha512-ehA++vHPMmLNhfjKFDHJR6FAh3wziIfehaZShuvkjlF7mryTa19y7KJem+8d0wv2w5AwoFOMBJmC7EBXyG0boQ==} + '@tiptap/extension-strike@2.8.0': + resolution: {integrity: sha512-ezkDiXxQ3ME/dDMMM7tAMkKRi6UWw7tIu+Mx7Os0z8HCGpVBk1gFhLlhEd8I5rJaPZr4tK1wtSehMA9bscFGQw==} peerDependencies: - '@tiptap/core': ^2.6.5 + '@tiptap/core': ^2.7.0 '@tiptap/extension-table-cell@2.1.13': resolution: {integrity: sha512-30pyVt2PxGAk8jmsXKxDheql8K/xIRA9FiDo++kS2Kr6Y7I42/kNPQttJ2W+Q1JdRJvedNfQtziQfKWDRLLCNA==} @@ -2482,6 +2366,11 @@ packages: peerDependencies: '@tiptap/core': ^2.0.0 + '@tiptap/extension-text-style@2.8.0': + resolution: {integrity: sha512-jJp0vcZ2Ty7RvIL0VU6dm1y+fTfXq1lN2GwtYzYM0ueFuESa+Qo8ticYOImyWZ3wGJGVrjn7OV9r0ReW0/NYkQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/extension-text@2.1.13': resolution: {integrity: sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==} peerDependencies: @@ -2539,9 +2428,6 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2569,11 +2455,8 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@22.5.0': - resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} - - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/node@20.16.11': + resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2590,14 +2473,14 @@ packages: '@types/pg@8.6.1': resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} '@types/react-transition-group@4.4.11': resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@18.3.4': - resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + '@types/react@18.3.11': + resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2617,8 +2500,8 @@ packages: '@types/use-sync-external-store@0.0.3': resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} - '@types/validator@13.12.0': - resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + '@types/validator@13.12.2': + resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} '@typescript-eslint/eslint-plugin@8.8.1': resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} @@ -2771,8 +2654,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} acorn@8.12.1: @@ -2829,8 +2712,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@2.2.1: @@ -2898,8 +2781,8 @@ packages: avvio@9.0.0: resolution: {integrity: sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==} - axios@1.7.4: - resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} @@ -2950,8 +2833,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2964,10 +2847,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2999,8 +2878,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + caniuse-lite@1.0.30001668: + resolution: {integrity: sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==} catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} @@ -3033,8 +2912,8 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -3223,8 +3102,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} core-js-compat@3.38.1: @@ -3314,8 +3193,8 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -3422,15 +3301,15 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.7: - resolution: {integrity: sha512-4JQahOkBdDy27jjW4q3FJQigHlcwZXx28sCtBQkBamF2XUdcNXrInpgrr8h205MtVIS0CMHufyIKGVjtjxQ2ZA==} + eciesjs@0.4.8: + resolution: {integrity: sha512-U2wAn6yEOVBP9lOVh3nryufg3hQTKVicG+qjEfqB/70m/mU9DzwWNdK0mC5zuxlJH42EGAezFlHVWI0snwg1nw==} engines: {node: '>=16.0.0'} - electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + electron-to-chromium@1.5.36: + resolution: {integrity: sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==} - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3477,8 +3356,8 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-regexp@0.0.1: @@ -3532,8 +3411,8 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true @@ -3639,11 +3518,11 @@ packages: fast-uri@2.4.0: resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} - fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fast-uri@3.0.2: + resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} - fastify-plugin@5.0.0: - resolution: {integrity: sha512-0725fmH/yYi8ugsjszLci+lLnGBK6cG+WSxM7edY2OXJEU7gr2JiGBoieL2h9mhTych1vFsEfXsAsGGDJ/Rd5w==} + fastify-plugin@5.0.1: + resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} fastify@5.0.0: resolution: {integrity: sha512-Qe4dU+zGOzg7vXjw4EvcuyIbNnMwTmcuOhlOrOJsgwzvjEZmsM/IeHulgJk+r46STjdJS/ZJbxO8N70ODXDMEQ==} @@ -3651,8 +3530,8 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.2.0: - resolution: {integrity: sha512-9XaWcDl0riOX5j2kYfy0kKdg7skw3IY6kA4LFT8Tk2yF9UdrADUy8D6AJuBLtf7ISm/MksumwAHE3WVbMRyCLw==} + fdir@6.4.0: + resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3679,8 +3558,8 @@ packages: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} - find-my-way@9.0.1: - resolution: {integrity: sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==} + find-my-way@9.1.0: + resolution: {integrity: sha512-Y5jIsuYR4BwWDYYQ2A/RWWE6gD8a0FMgtU+HOq1WKku+Cwdz8M1v8wcAmRXXM1/iqtoqg06v+LjAxMYbCjViMw==} engines: {node: '>=14'} find-root@1.1.0: @@ -3721,8 +3600,8 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3737,8 +3616,8 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -3774,9 +3653,6 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -3794,8 +3670,8 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-tsconfig@4.7.6: - resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} @@ -3963,8 +3839,8 @@ packages: i18next-browser-languagedetector@7.2.1: resolution: {integrity: sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==} - i18next-http-backend@2.6.1: - resolution: {integrity: sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==} + i18next-http-backend@2.6.2: + resolution: {integrity: sha512-Hp/kd8/VuoxIHmxsknJXjkTYYHzivAyAF15pzliKzk2TiXC25rZCEerb1pUFoxz4IVrG3fCvQSY51/Lu4ECV4A==} i18next@22.5.1: resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} @@ -3987,8 +3863,8 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-in-the-middle@1.11.0: - resolution: {integrity: sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==} + import-in-the-middle@1.11.2: + resolution: {integrity: sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==} import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -4019,8 +3895,8 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@9.3.6: - resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} + inquirer@9.3.7: + resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} engines: {node: '>=18'} internal-slot@1.0.7: @@ -4052,16 +3928,12 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-date-object@1.0.5: @@ -4221,8 +4093,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.0.1: - resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} engines: {node: 20 || >=22} jiti@1.21.6: @@ -4248,13 +4120,9 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -4307,8 +4175,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - light-my-request@6.0.0: - resolution: {integrity: sha512-kFkFXrmKCL0EEeOmJybMH5amWFd+AFvlvMlvFTRxCUwbhfapZqDmeLMPoWihntnYY6JpoQDE9k+vOzObF1fDqg==} + light-my-request@6.1.0: + resolution: {integrity: sha512-+NFuhlOGoEwxeQfJ/pobkVFxcnKyDtiX847hLjuB/IzBxIl3q4VJeFI8uRCgb3AlTWL1lgOr+u5+8QdUcr33ng==} lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} @@ -4328,8 +4196,8 @@ packages: engines: {node: '>=18.12.0'} hasBin: true - listr2@8.2.4: - resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} engines: {node: '>=18.0.0'} load-json-file@4.0.0: @@ -4416,16 +4284,16 @@ packages: loglevel-colored-level-prefix@1.0.0: resolution: {integrity: sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==} - loglevel@1.9.1: - resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -4441,11 +4309,11 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -4579,14 +4447,14 @@ packages: module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} - moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + moment-timezone@0.5.46: + resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} @@ -4609,8 +4477,8 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-abi@3.67.0: - resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} + node-abi@3.68.0: + resolution: {integrity: sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==} engines: {node: '>=10'} node-fetch@2.7.0: @@ -4749,8 +4617,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parameter-reducers@2.1.0: resolution: {integrity: sha512-aj9V6DUnNbj4YEmVxloPLX9duhklIC+SIOVUrVdaT3WfgEownET+TYg/JsjANQUNGe46dmOCHEKiuycL36cOnw==} @@ -4827,8 +4695,8 @@ packages: pg-connection-string@2.7.0: resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} - pg-cursor@2.11.0: - resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} + pg-cursor@2.12.0: + resolution: {integrity: sha512-rppw54OnuYZfMUjiJI2zJMwAjjt2V9EtLUb+t7V5tqwSE5Jxod+7vA7Y0FI6Nq976jNLciA0hoVkwvjjB8qzEw==} peerDependencies: pg: ^8 @@ -4849,9 +4717,6 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.6.1: - resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} - pg-protocol@1.7.0: resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} @@ -4875,8 +4740,8 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -4940,8 +4805,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -5031,8 +4896,8 @@ packages: prosemirror-collab@1.3.1: resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} - prosemirror-commands@1.6.0: - resolution: {integrity: sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==} + prosemirror-commands@1.6.1: + resolution: {integrity: sha512-tNy4uaGWzvuUYXDke7B28krndIrdQJhSh0OLpubtwtEwFbjItOj/eoAfPvstBJyyV0S2+b5t4G+4XPXdxar6pg==} prosemirror-dropcursor@1.8.1: resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} @@ -5049,14 +4914,14 @@ packages: prosemirror-keymap@1.2.2: resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} - prosemirror-markdown@1.13.0: - resolution: {integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==} + prosemirror-markdown@1.13.1: + resolution: {integrity: sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==} prosemirror-menu@1.2.4: resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} - prosemirror-model@1.22.3: - resolution: {integrity: sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==} + prosemirror-model@1.23.0: + resolution: {integrity: sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==} prosemirror-schema-basic@1.2.3: resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} @@ -5067,8 +4932,8 @@ packages: prosemirror-state@1.4.3: resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} - prosemirror-tables@1.4.0: - resolution: {integrity: sha512-fxryZZkQG12fSCNuZDrYx6Xvo2rLYZTbKLRd8rglOPgNJGMKIS8uvTt6gGC38m7UCu/ENnXIP9pEz5uDaPc+cA==} + prosemirror-tables@1.5.0: + resolution: {integrity: sha512-VMx4zlYWm7aBlZ5xtfJHpqa3Xgu3b7srV54fXYnXgsAcIGRqKSrhiK3f89omzzgaAgAtDOV4ImXnLKhVfheVNQ==} prosemirror-trailing-node@2.0.9: resolution: {integrity: sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==} @@ -5077,11 +4942,11 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.10.0: - resolution: {integrity: sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==} + prosemirror-transform@1.10.2: + resolution: {integrity: sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==} - prosemirror-view@1.33.11: - resolution: {integrity: sha512-K0z9oMf6EI2ZifS9yW8PUPjEw2o1ZoFAaNzvcuyfcjIzsU6pJMo3tk9r26MyzEsuGHXZwmKPEmrjgFd78biTGA==} + prosemirror-view@1.34.3: + resolution: {integrity: sha512-mKZ54PrX19sSaQye+sef+YjBbNu2voNwLS1ivb6aD2IRmxRGW64HU9B644+7OfJStGLyxvOreKqEgfvXa91WIA==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -5090,8 +4955,8 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -5209,21 +5074,21 @@ packages: redux: optional: true - react-router-dom@6.26.1: - resolution: {integrity: sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==} + react-router-dom@6.26.2: + resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.26.1: - resolution: {integrity: sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==} + react-router@6.26.2: + resolution: {integrity: sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' - react-select@5.8.0: - resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} + react-select@5.8.1: + resolution: {integrity: sha512-RT1CJmuc+ejqm5MPgzyZujqDskdvB9a9ZqrdnVLsvAHjJ3Tj0hELnLeVPQlmYdVKCdCpxanepl6z7R5KhXhWzg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5281,8 +5146,8 @@ packages: redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} - regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} regenerate@1.4.2: @@ -5294,16 +5159,19 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + regexpu-core@6.1.1: + resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} engines: {node: '>=4'} - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.11.1: + resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==} hasBin: true require-directory@2.1.1: @@ -5386,8 +5254,8 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.21.0: - resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} + rollup@4.24.0: + resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5413,8 +5281,8 @@ packages: safe-regex2@4.0.0: resolution: {integrity: sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==} - safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} safer-buffer@2.1.2: @@ -5550,11 +5418,11 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} - sonic-boom@4.0.1: - resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + sonic-boom@4.1.0: + resolution: {integrity: sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -5709,8 +5577,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} test-exclude@7.0.1: @@ -5759,8 +5627,8 @@ packages: tinyexec@0.3.0: resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - tinymce@6.8.4: - resolution: {integrity: sha512-okoJyxuPv1gzASxQDNgQbnUXOdAIyoOSXcXcZZu7tiW0PSKEdf3SdASxPBupRj+64/E3elHwVRnzSdo82Emqbg==} + tinymce@6.8.5: + resolution: {integrity: sha512-qAL/FxL7cwZHj4BfaF818zeJJizK9jU5IQzTcSLL4Rj5MaJdiVblEj7aDr80VCV1w9h4Lak9hlnALhq/kVtN1g==} tinypool@1.0.1: resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} @@ -5770,8 +5638,8 @@ packages: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@3.0.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tippy.js@6.3.7: @@ -5830,8 +5698,8 @@ packages: '@swc/wasm': optional: true - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tsx@4.19.1: resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} @@ -5898,16 +5766,16 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: @@ -5918,8 +5786,8 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5980,8 +5848,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.2: - resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6146,8 +6014,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -6185,7 +6053,7 @@ packages: snapshots: - '@adminjs/design-system@4.1.1(@babel/core@7.25.2)(@types/react@18.3.4)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)': + '@adminjs/design-system@4.1.1(@babel/core@7.25.8)(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)': dependencies: '@hypnosphi/create-react-context': 0.3.1(prop-types@15.8.1)(react@18.3.1) '@tinymce/tinymce-react': 4.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -6207,7 +6075,7 @@ snapshots: '@tiptap/extension-typography': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) '@tiptap/pm': 2.1.13 '@tiptap/react': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tiptap/starter-kit': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/starter-kit': 2.1.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@tiptap/pm@2.1.13) date-fns: 2.30.0 flat: 5.0.2 hoist-non-react-statics: 3.3.2 @@ -6220,21 +6088,22 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-feather: 2.0.10(react@18.3.1) react-phone-input-2: 2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-select: 5.8.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-select: 5.8.1(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-text-mask: 5.5.0(react@18.3.1) - styled-components: 5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + styled-components: 5.3.9(@babel/core@7.25.8)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) styled-system: 5.1.5 text-mask-addons: 3.8.0 transitivePeerDependencies: - '@babel/core' + - '@tiptap/extension-text-style' - '@types/react' - prop-types - react-is - supports-color - '@adminjs/sequelize@4.1.1(adminjs@7.8.13(@types/react@18.3.4))(sequelize@6.37.4)': + '@adminjs/sequelize@4.1.1(adminjs@7.8.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11))(sequelize@6.37.4)': dependencies: - adminjs: 7.8.13(@types/react@18.3.4) + adminjs: 7.8.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11) escape-regexp: 0.0.1 sequelize: 6.37.4 @@ -6243,859 +6112,755 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.7': + '@babel/code-frame@7.25.7': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + '@babel/highlight': 7.25.7 + picocolors: 1.1.0 - '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.25.8': {} - '@babel/core@7.25.2': + '@babel/core@7.25.8': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) + '@babel/helpers': 7.25.7 + '@babel/parser': 7.25.8 + '@babel/template': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 convert-source-map: 2.0.0 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.0': + '@babel/generator@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.8 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.24.7': + '@babel/helper-annotate-as-pure@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.8 - '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.7': dependencies: - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/helper-compilation-targets@7.25.2': + '@babel/helper-compilation-targets@7.25.7': dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 + '@babel/compat-data': 7.25.8 + '@babel/helper-validator-option': 7.25.7 + browserslist: 4.24.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2)': + '@babel/helper-create-class-features-plugin@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-member-expression-to-functions': 7.25.7 + '@babel/helper-optimise-call-expression': 7.25.7 + '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.8) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + '@babel/helper-create-regexp-features-plugin@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - regexpu-core: 5.3.2 + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + regexpu-core: 6.1.1 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.6(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 + debug: 4.3.7(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.24.8': + '@babel/helper-member-expression-to-functions@7.25.7': dependencies: - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': + '@babel/helper-module-imports@7.25.7(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/helper-simple-access': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': + '@babel/helper-optimise-call-expression@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.8 - '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-plugin-utils@7.25.7': {} - '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + '@babel/helper-remap-async-to-generator@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-wrap-function': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + '@babel/helper-replace-supers@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-member-expression-to-functions': 7.25.7 + '@babel/helper-optimise-call-expression': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.24.7': + '@babel/helper-simple-access@7.25.7': dependencies: - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + '@babel/helper-skip-transparent-expression-wrappers@7.25.7': dependencies: - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.7': {} - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.7': {} - '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-option@7.25.7': {} - '@babel/helper-wrap-function@7.25.0': + '@babel/helper-wrap-function@7.25.7': dependencies: - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@babel/types': 7.25.2 + '@babel/template': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/helpers@7.25.0': + '@babel/helpers@7.25.7': dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/template': 7.25.7 + '@babel/types': 7.25.8 - '@babel/highlight@7.24.7': + '@babel/highlight@7.25.7': dependencies: - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-validator-identifier': 7.25.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 - '@babel/parser@7.25.3': + '@babel/parser@7.25.8': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 + '@babel/plugin-transform-optional-chaining': 7.25.8(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-assertions@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-transform-arrow-functions@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-async-generator-functions@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.25.8) + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-async-to-generator@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-block-scoped-functions@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-block-scoping@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-class-properties@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-class-static-block@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-classes@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.8) + '@babel/traverse': 7.25.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-computed-properties@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/template': 7.25.0 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/template': 7.25.7 - '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-destructuring@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-dotall-regex@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-duplicate-keys@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-dynamic-import@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-exponentiation-operator@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-export-namespace-from@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-for-of@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + '@babel/plugin-transform-function-name@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-json-strings@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-literals@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-logical-assignment-operators@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-member-expression-literals@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-amd@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-commonjs@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-simple-access': 7.24.7 + '@babel/core': 7.25.8 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-simple-access': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-systemjs@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/core': 7.25.8 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + '@babel/traverse': 7.25.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-umd@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-new-target@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-nullish-coalescing-operator@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-numeric-separator@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-object-rest-spread@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-transform-parameters': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-object-super@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-catch-binding@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-chaining@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-parameters@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-private-methods@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-private-property-in-object@7.25.8(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-property-literals@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-display-name@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-development@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.2 + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-pure-annotations@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-regenerator@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-reserved-words@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-runtime@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.25.7 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.8) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.8) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.8) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-shorthand-properties@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-spread@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-sticky-regex@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-template-literals@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-typeof-symbol@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-typescript@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 + '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/preset-env@7.25.3(@babel/core@7.25.2)': - dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.25.2) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes@7.25.7(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + + '@babel/plugin-transform-unicode-property-regex@7.25.7(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 + + '@babel/plugin-transform-unicode-regex@7.25.7(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 + + '@babel/plugin-transform-unicode-sets-regex@7.25.7(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.25.7 + + '@babel/preset-env@7.25.8(@babel/core@7.25.8)': + dependencies: + '@babel/compat-data': 7.25.8 + '@babel/core': 7.25.8 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.8) + '@babel/plugin-syntax-import-assertions': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.8) + '@babel/plugin-transform-arrow-functions': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-async-generator-functions': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-async-to-generator': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-block-scoped-functions': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-block-scoping': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-class-properties': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-class-static-block': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-classes': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-computed-properties': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-destructuring': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-dotall-regex': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-duplicate-keys': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-dynamic-import': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-exponentiation-operator': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-export-namespace-from': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-for-of': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-function-name': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-json-strings': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-literals': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-logical-assignment-operators': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-member-expression-literals': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-modules-amd': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-modules-commonjs': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-modules-systemjs': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-modules-umd': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-new-target': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-numeric-separator': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-object-rest-spread': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-object-super': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-optional-catch-binding': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-optional-chaining': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-parameters': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-private-methods': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-private-property-in-object': 7.25.8(@babel/core@7.25.8) + '@babel/plugin-transform-property-literals': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-regenerator': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-reserved-words': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-shorthand-properties': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-spread': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-sticky-regex': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-template-literals': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-typeof-symbol': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-unicode-escapes': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-unicode-property-regex': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-unicode-regex': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-unicode-sets-regex': 7.25.7(@babel/core@7.25.8) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.8) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.8) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.8) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.8) core-js-compat: 3.38.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.2 + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/types': 7.25.8 esutils: 2.0.3 - '@babel/preset-react@7.24.7(@babel/core@7.25.2)': + '@babel/preset-react@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + '@babel/plugin-transform-react-display-name': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-react-jsx-development': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-react-pure-annotations': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.24.7(@babel/core@7.25.2)': + '@babel/preset-typescript@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-modules-commonjs': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - '@babel/register@7.24.6(@babel/core@7.25.2)': + '@babel/register@7.25.7(@babel/core@7.25.8)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.25.8 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 pirates: 4.0.6 source-map-support: 0.5.21 - '@babel/regjsgen@0.8.0': {} - - '@babel/runtime@7.25.0': + '@babel/runtime@7.25.7': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': + '@babel/template@7.25.7': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/code-frame': 7.25.7 + '@babel/parser': 7.25.8 + '@babel/types': 7.25.8 - '@babel/traverse@7.25.3(supports-color@5.5.0)': + '@babel/traverse@7.25.7(supports-color@5.5.0)': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.6(supports-color@5.5.0) + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/parser': 7.25.8 + '@babel/template': 7.25.7 + '@babel/types': 7.25.8 + debug: 4.3.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.2': + '@babel/types@7.25.8': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 '@bcoe/v8-coverage@0.2.3': {} @@ -7135,11 +6900,11 @@ snapshots: '@biomejs/cli-win32-x64@1.9.3': optional: true - '@commitlint/cli@19.5.0(@types/node@22.7.5)(typescript@5.6.3)': + '@commitlint/cli@19.5.0(@types/node@20.16.11)(typescript@5.6.3)': dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.5.0 - '@commitlint/load': 19.5.0(@types/node@22.7.5)(typescript@5.6.3) + '@commitlint/load': 19.5.0(@types/node@20.16.11)(typescript@5.6.3) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 tinyexec: 0.3.0 @@ -7186,7 +6951,7 @@ snapshots: '@commitlint/rules': 19.5.0 '@commitlint/types': 19.5.0 - '@commitlint/load@19.5.0(@types/node@22.7.5)(typescript@5.6.3)': + '@commitlint/load@19.5.0(@types/node@20.16.11)(typescript@5.6.3)': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/execute-rule': 19.5.0 @@ -7194,7 +6959,7 @@ snapshots: '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.6.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.16.11)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7342,7 +7107,7 @@ snapshots: '@types/cross-spawn': 6.0.6 cross-spawn: 6.0.5 modern-spawn: 1.0.0 - ms: 2.1.2 + ms: 2.1.3 parameter-reducers: 2.1.0 type-assertions: 1.1.0 transitivePeerDependencies: @@ -7356,7 +7121,7 @@ snapshots: '@databases/pg@5.5.0(typescript@5.6.3)': dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.25.7 '@databases/escape-identifier': 1.0.3 '@databases/pg-config': 3.2.0(typescript@5.6.3) '@databases/pg-connection-string': 1.0.0 @@ -7368,7 +7133,7 @@ snapshots: '@databases/sql': 3.3.0 assert-never: 1.3.0 pg: 8.13.0 - pg-cursor: 2.11.0(pg@8.13.0) + pg-cursor: 2.12.0(pg@8.13.0) transitivePeerDependencies: - pg-native - typescript @@ -7415,9 +7180,9 @@ snapshots: dependencies: commander: 11.1.0 dotenv: 16.4.5 - eciesjs: 0.4.7 + eciesjs: 0.4.8 execa: 5.1.1 - fdir: 6.2.0(picomatch@4.0.2) + fdir: 6.4.0(picomatch@4.0.2) ignore: 5.3.2 object-treeify: 1.1.33 picomatch: 4.0.2 @@ -7425,11 +7190,11 @@ snapshots: '@emotion/babel-plugin@11.12.0': dependencies: - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/runtime': 7.25.0 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/runtime': 7.25.7 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.1 + '@emotion/serialize': 1.3.2 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -7443,40 +7208,40 @@ snapshots: dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.1 '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 '@emotion/hash@0.9.2': {} - '@emotion/is-prop-valid@1.3.0': + '@emotion/is-prop-valid@1.3.1': dependencies: '@emotion/memoize': 0.9.0 '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(@types/react@18.3.4)(react@18.3.1)': + '@emotion/react@11.13.3(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 '@emotion/babel-plugin': 11.12.0 '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.1 + '@emotion/serialize': 1.3.2 '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.1 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.11 transitivePeerDependencies: - supports-color - '@emotion/serialize@1.3.1': + '@emotion/serialize@1.3.2': dependencies: '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.1 csstype: 3.1.3 '@emotion/sheet@1.4.0': {} @@ -7491,7 +7256,7 @@ snapshots: dependencies: react: 18.3.1 - '@emotion/utils@1.4.0': {} + '@emotion/utils@1.4.1': {} '@emotion/weak-memoize@0.4.0': {} @@ -7636,9 +7401,9 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': dependencies: - eslint: 8.57.0 + eslint: 8.57.1 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0(jiti@1.21.6))': @@ -7646,12 +7411,12 @@ snapshots: eslint: 9.12.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.11.1': {} '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -7661,7 +7426,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -7675,7 +7440,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) espree: 10.2.0 globals: 14.0.0 ignore: 5.3.2 @@ -7686,7 +7451,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@8.57.1': {} '@eslint/js@9.12.0': {} @@ -7696,15 +7461,15 @@ snapshots: dependencies: levn: 0.4.1 - '@fastify/ajv-compiler@4.0.0': + '@fastify/ajv-compiler@4.0.1': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) - fast-uri: 3.0.1 + fast-uri: 3.0.2 '@fastify/error@4.0.0': {} - '@fastify/fast-json-stringify-compiler@5.0.0': + '@fastify/fast-json-stringify-compiler@5.0.1': dependencies: fast-json-stringify: 6.0.0 @@ -7716,32 +7481,32 @@ snapshots: dependencies: '@lukeed/ms': 2.0.2 dequal: 2.0.3 - fastify-plugin: 5.0.0 + fastify-plugin: 5.0.1 forwarded: 0.2.0 http-errors: 2.0.0 type-is: 1.6.18 vary: 1.1.2 - '@floating-ui/core@1.6.7': + '@floating-ui/core@1.6.8': dependencies: - '@floating-ui/utils': 0.2.7 + '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.10': + '@floating-ui/dom@1.6.11': dependencies: - '@floating-ui/core': 1.6.7 - '@floating-ui/utils': 0.2.7 + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 - '@floating-ui/utils@0.2.7': {} + '@floating-ui/utils@0.2.8': {} - '@hello-pangea/dnd@16.6.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@hello-pangea/dnd@16.6.0(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 css-box-model: 1.2.1 memoize-one: 6.0.0 raf-schd: 4.0.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-redux: 8.1.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) + react-redux: 8.1.3(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) redux: 4.2.1 use-memo-one: 1.1.3(react@18.3.1) transitivePeerDependencies: @@ -7756,10 +7521,10 @@ snapshots: '@humanfs/core': 0.19.0 '@humanwhocodes/retry': 0.3.1 - '@humanwhocodes/config-array@0.11.14': + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -7779,7 +7544,7 @@ snapshots: react: 18.3.1 warning: 4.0.3 - '@inquirer/figures@1.0.5': {} + '@inquirer/figures@1.0.7': {} '@isaacs/cliui@8.0.2': dependencies: @@ -7824,13 +7589,13 @@ snapshots: '@lukeed/ms@2.0.2': {} - '@noble/ciphers@0.5.3': {} + '@noble/ciphers@1.0.0': {} - '@noble/curves@1.5.0': + '@noble/curves@1.6.0': dependencies: - '@noble/hashes': 1.4.0 + '@noble/hashes': 1.5.0 - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -7854,14 +7619,9 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@1.26.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.25.1 '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': dependencies: @@ -7990,7 +7750,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color @@ -8063,7 +7823,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.52.1 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.11.0 + import-in-the-middle: 1.11.2 require-in-the-middle: 7.4.0 semver: 7.6.3 shimmer: 1.2.1 @@ -8075,7 +7835,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.53.0 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.11.0 + import-in-the-middle: 1.11.2 require-in-the-middle: 7.4.0 semver: 7.6.3 shimmer: 1.2.1 @@ -8084,24 +7844,17 @@ snapshots: '@opentelemetry/redis-common@0.36.2': {} - '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - lodash.merge: 4.6.2 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': dependencies: @@ -8110,8 +7863,6 @@ snapshots: '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/semantic-conventions@1.25.1': {} - '@opentelemetry/semantic-conventions@1.27.0': {} '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': @@ -8136,121 +7887,120 @@ snapshots: '@redux-devtools/extension@3.3.0(redux@4.2.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 immutable: 4.3.7 redux: 4.2.1 '@remirror/core-constants@2.0.2': {} - '@remix-run/router@1.19.1': {} + '@remix-run/router@1.19.2': {} - '@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(rollup@4.21.0)': + '@rollup/plugin-babel@6.0.4(@babel/core@7.25.8)(rollup@4.24.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@babel/core': 7.25.8 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@25.0.8(rollup@4.21.0)': + '@rollup/plugin-commonjs@25.0.8(rollup@4.24.0)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.11 + magic-string: 0.30.12 optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 - '@rollup/plugin-inject@5.0.5(rollup@4.21.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.24.0)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) estree-walker: 2.0.2 - magic-string: 0.30.11 + magic-string: 0.30.12 optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 - '@rollup/plugin-json@6.1.0(rollup@4.21.0)': + '@rollup/plugin-json@6.1.0(rollup@4.24.0)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.0)': + '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.0)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 - is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 - '@rollup/plugin-replace@5.0.7(rollup@4.21.0)': + '@rollup/plugin-replace@5.0.7(rollup@4.24.0)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.0) - magic-string: 0.30.11 + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + magic-string: 0.30.12 optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 - '@rollup/pluginutils@5.1.0(rollup@4.21.0)': + '@rollup/pluginutils@5.1.2(rollup@4.24.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.21.0 + rollup: 4.24.0 - '@rollup/rollup-android-arm-eabi@4.21.0': + '@rollup/rollup-android-arm-eabi@4.24.0': optional: true - '@rollup/rollup-android-arm64@4.21.0': + '@rollup/rollup-android-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-arm64@4.21.0': + '@rollup/rollup-darwin-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-x64@4.21.0': + '@rollup/rollup-darwin-x64@4.24.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.21.0': + '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.21.0': + '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.21.0': + '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.21.0': + '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.21.0': + '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.21.0': + '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-musl@4.21.0': + '@rollup/rollup-linux-x64-musl@4.24.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.21.0': + '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.21.0': + '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.21.0': + '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true '@sentry/cli-darwin@2.37.0': @@ -8301,7 +8051,7 @@ snapshots: '@sentry/node@8.34.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-amqplib': 0.42.0(@opentelemetry/api@1.9.0) @@ -8334,7 +8084,7 @@ snapshots: '@sentry/opentelemetry': 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 - import-in-the-middle: 1.11.0 + import-in-the-middle: 1.11.2 transitivePeerDependencies: - supports-color @@ -8356,7 +8106,7 @@ snapshots: '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 detect-libc: 2.0.3 - node-abi: 3.67.0 + node-abi: 3.68.0 transitivePeerDependencies: - supports-color @@ -8424,17 +8174,17 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tinymce: 6.8.4 + tinymce: 6.8.5 '@tiptap/core@2.1.13(@tiptap/pm@2.1.13)': dependencies: '@tiptap/pm': 2.1.13 - '@tiptap/extension-blockquote@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-blockquote@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-bold@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-bold@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) @@ -8444,16 +8194,18 @@ snapshots: '@tiptap/pm': 2.1.13 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-bullet-list@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/extension-list-item@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-list-item': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-text-style': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) '@tiptap/extension-character-count@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) '@tiptap/pm': 2.1.13 - '@tiptap/extension-code-block@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + '@tiptap/extension-code-block@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) '@tiptap/pm': 2.1.13 @@ -8466,7 +8218,7 @@ snapshots: dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-dropcursor@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + '@tiptap/extension-dropcursor@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) '@tiptap/pm': 2.1.13 @@ -8477,12 +8229,12 @@ snapshots: '@tiptap/pm': 2.1.13 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + '@tiptap/extension-gapcursor@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) '@tiptap/pm': 2.1.13 - '@tiptap/extension-hard-break@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-hard-break@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) @@ -8490,12 +8242,12 @@ snapshots: dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-history@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + '@tiptap/extension-history@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) '@tiptap/pm': 2.1.13 - '@tiptap/extension-horizontal-rule@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + '@tiptap/extension-horizontal-rule@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) '@tiptap/pm': 2.1.13 @@ -8504,7 +8256,7 @@ snapshots: dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-italic@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-italic@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) @@ -8514,19 +8266,21 @@ snapshots: '@tiptap/pm': 2.1.13 linkifyjs: 4.1.3 - '@tiptap/extension-list-item@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-list-item@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-ordered-list@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-ordered-list@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/extension-list-item@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-list-item': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-text-style': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-paragraph@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-paragraph@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-strike@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + '@tiptap/extension-strike@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) @@ -8551,6 +8305,10 @@ snapshots: dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-text@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) @@ -8563,22 +8321,22 @@ snapshots: dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 - prosemirror-commands: 1.6.0 + prosemirror-commands: 1.6.1 prosemirror-dropcursor: 1.8.1 prosemirror-gapcursor: 1.3.2 prosemirror-history: 1.4.1 prosemirror-inputrules: 1.4.0 prosemirror-keymap: 1.2.2 - prosemirror-markdown: 1.13.0 + prosemirror-markdown: 1.13.1 prosemirror-menu: 1.2.4 - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-schema-basic: 1.2.3 prosemirror-schema-list: 1.4.1 prosemirror-state: 1.4.3 - prosemirror-tables: 1.4.0 - prosemirror-trailing-node: 2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.11) - prosemirror-transform: 1.10.0 - prosemirror-view: 1.33.11 + prosemirror-tables: 1.5.0 + prosemirror-trailing-node: 2.0.9(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3) + prosemirror-transform: 1.10.2 + prosemirror-view: 1.34.3 '@tiptap/react@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -8589,28 +8347,29 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tiptap/starter-kit@2.1.13(@tiptap/pm@2.1.13)': + '@tiptap/starter-kit@2.1.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@tiptap/pm@2.1.13)': dependencies: '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) - '@tiptap/extension-blockquote': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-bold': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-bullet-list': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-blockquote': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-bold': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-bullet-list': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/extension-list-item@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))) '@tiptap/extension-code': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-code-block': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-code-block': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) '@tiptap/extension-document': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-dropcursor': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) - '@tiptap/extension-gapcursor': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) - '@tiptap/extension-hard-break': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-dropcursor': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-gapcursor': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-hard-break': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) '@tiptap/extension-heading': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-history': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) - '@tiptap/extension-horizontal-rule': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) - '@tiptap/extension-italic': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-list-item': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-ordered-list': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-paragraph': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) - '@tiptap/extension-strike': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-history': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-horizontal-rule': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-italic': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-list-item': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-ordered-list': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/extension-list-item@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))) + '@tiptap/extension-paragraph': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-strike': 2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) '@tiptap/extension-text': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) transitivePeerDependencies: + - '@tiptap/extension-text-style' - '@tiptap/pm' '@tsconfig/node-lts@20.1.3': {} @@ -8629,27 +8388,25 @@ snapshots: '@types/connect@3.4.36': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} '@types/hoist-non-react-statics@3.3.5': dependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.11 hoist-non-react-statics: 3.3.2 '@types/json-schema@7.0.15': {} @@ -8669,13 +8426,9 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 22.7.5 - - '@types/node@22.5.0': - dependencies: - undici-types: 6.19.8 + '@types/node': 20.16.11 - '@types/node@22.7.5': + '@types/node@20.16.11': dependencies: undici-types: 6.19.8 @@ -8689,25 +8442,25 @@ snapshots: '@types/pg@8.11.10': dependencies: - '@types/node': 22.5.0 - pg-protocol: 1.6.1 + '@types/node': 20.16.11 + pg-protocol: 1.7.0 pg-types: 4.0.2 '@types/pg@8.6.1': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 pg-protocol: 1.7.0 pg-types: 2.2.0 - '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.13': {} '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.11 - '@types/react@18.3.4': + '@types/react@18.3.11': dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 '@types/resolve@1.20.2': {} @@ -8727,11 +8480,11 @@ snapshots: '@types/use-sync-external-store@0.0.3': {} - '@types/validator@13.12.0': {} + '@types/validator@13.12.2': {} '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.11.1 '@typescript-eslint/parser': 8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) @@ -8747,14 +8500,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6(supports-color@5.5.0) - eslint: 8.57.0 + debug: 4.3.7(supports-color@5.5.0) + eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -8766,7 +8519,7 @@ snapshots: '@typescript-eslint/types': 8.8.1 '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.8.1 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) eslint: 9.12.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 @@ -8787,7 +8540,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.6.3) - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -8803,7 +8556,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -8818,7 +8571,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.8.1 '@typescript-eslint/visitor-keys': 8.8.1 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -8852,21 +8605,21 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@22.7.5))': + '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@20.16.11))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.11 - magicast: 0.3.4 + magic-string: 0.30.12 + magicast: 0.3.5 std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.2(@types/node@22.7.5) + vitest: 2.1.2(@types/node@20.16.11) transitivePeerDependencies: - supports-color @@ -8877,13 +8630,13 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.2(@types/node@22.7.5))': + '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@20.16.11))': dependencies: '@vitest/spy': 2.1.2 estree-walker: 3.0.3 - magic-string: 0.30.11 + magic-string: 0.30.12 optionalDependencies: - vite: 5.4.2(@types/node@22.7.5) + vite: 5.4.8(@types/node@20.16.11) '@vitest/pretty-format@2.1.2': dependencies: @@ -8897,17 +8650,17 @@ snapshots: '@vitest/snapshot@2.1.2': dependencies: '@vitest/pretty-format': 2.1.2 - magic-string: 0.30.11 + magic-string: 0.30.12 pathe: 1.1.2 '@vitest/spy@2.1.2': dependencies: - tinyspy: 3.0.0 + tinyspy: 3.0.2 '@vitest/utils@2.1.2': dependencies: '@vitest/pretty-format': 2.1.2 - loupe: 3.1.1 + loupe: 3.1.2 tinyrainbow: 1.2.0 JSONStream@1.3.5: @@ -8929,7 +8682,7 @@ snapshots: dependencies: acorn: 8.12.1 - acorn-walk@8.3.3: + acorn-walk@8.3.4: dependencies: acorn: 8.12.1 @@ -8941,30 +8694,30 @@ snapshots: address@1.2.2: {} - adminjs@7.8.13(@types/react@18.3.4): - dependencies: - '@adminjs/design-system': 4.1.1(@babel/core@7.25.2)(@types/react@18.3.4)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) - '@babel/core': 7.25.2 - '@babel/parser': 7.25.3 - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.25.2) - '@babel/preset-env': 7.25.3(@babel/core@7.25.2) - '@babel/preset-react': 7.24.7(@babel/core@7.25.2) - '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/register': 7.24.6(@babel/core@7.25.2) - '@hello-pangea/dnd': 16.6.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + adminjs@7.8.13(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11): + dependencies: + '@adminjs/design-system': 4.1.1(@babel/core@7.25.8)(@tiptap/extension-text-style@2.8.0(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)))(@types/react@18.3.11)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + '@babel/core': 7.25.8 + '@babel/parser': 7.25.8 + '@babel/plugin-syntax-import-assertions': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-transform-runtime': 7.25.7(@babel/core@7.25.8) + '@babel/preset-env': 7.25.8(@babel/core@7.25.8) + '@babel/preset-react': 7.25.7(@babel/core@7.25.8) + '@babel/preset-typescript': 7.25.7(@babel/core@7.25.8) + '@babel/register': 7.25.7(@babel/core@7.25.8) + '@hello-pangea/dnd': 16.6.0(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@redux-devtools/extension': 3.3.0(redux@4.2.1) - '@rollup/plugin-babel': 6.0.4(@babel/core@7.25.2)(rollup@4.21.0) - '@rollup/plugin-commonjs': 25.0.8(rollup@4.21.0) - '@rollup/plugin-json': 6.1.0(rollup@4.21.0) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.0) - '@rollup/plugin-replace': 5.0.7(rollup@4.21.0) - axios: 1.7.4 + '@rollup/plugin-babel': 6.0.4(@babel/core@7.25.8)(rollup@4.24.0) + '@rollup/plugin-commonjs': 25.0.8(rollup@4.24.0) + '@rollup/plugin-json': 6.1.0(rollup@4.24.0) + '@rollup/plugin-node-resolve': 15.3.0(rollup@4.24.0) + '@rollup/plugin-replace': 5.0.7(rollup@4.24.0) + axios: 1.7.7 commander: 10.0.1 flat: 5.0.2 i18next: 22.5.1 i18next-browser-languagedetector: 7.2.1 - i18next-http-backend: 2.6.1 + i18next-http-backend: 2.6.2 lodash: 4.17.21 ora: 6.3.1 prop-types: 15.8.1 @@ -8975,18 +8728,19 @@ snapshots: react-feather: 2.0.10(react@18.3.1) react-i18next: 12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-is: 18.3.1 - react-redux: 8.1.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) - react-router: 6.26.1(react@18.3.1) - react-router-dom: 6.26.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-redux: 8.1.3(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) + react-router: 6.26.2(react@18.3.1) + react-router-dom: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) redux: 4.2.1 regenerator-runtime: 0.14.1 - rollup: 4.21.0 - rollup-plugin-esbuild-minify: 1.1.2(rollup@4.21.0) - rollup-plugin-polyfill-node: 0.13.0(rollup@4.21.0) + rollup: 4.24.0 + rollup-plugin-esbuild-minify: 1.1.2(rollup@4.24.0) + rollup-plugin-polyfill-node: 0.13.0(rollup@4.24.0) slash: 5.1.0 uuid: 9.0.1 xss: 1.0.15 transitivePeerDependencies: + - '@tiptap/extension-text-style' - '@types/babel__core' - '@types/react' - '@types/react-dom' @@ -8997,7 +8751,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9015,7 +8769,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 + fast-uri: 3.0.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -9031,7 +8785,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@2.2.1: {} @@ -9081,52 +8835,52 @@ snapshots: '@fastify/error': 4.0.0 fastq: 1.17.1 - axios@1.7.4: + axios@1.7.7: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 cosmiconfig: 7.1.0 resolve: 1.22.8 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.8): dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + '@babel/compat-data': 7.25.8 + '@babel/core': 7.25.8 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.8) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.8): dependencies: - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.8) core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.8): dependencies: - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + '@babel/core': 7.25.8 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.8) transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.25.8)(styled-components@5.3.9(@babel/core@7.25.8)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): dependencies: - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + styled-components: 5.3.9(@babel/core@7.25.8)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' - supports-color @@ -9162,12 +8916,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.3: + browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.13 + caniuse-lite: 1.0.30001668 + electron-to-chromium: 1.5.36 node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) + update-browserslist-db: 1.1.1(browserslist@4.24.0) buffer-from@1.1.2: {} @@ -9181,8 +8935,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@3.3.0: {} - cac@6.7.14: {} call-bind@1.0.7: @@ -9209,7 +8961,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001651: {} + caniuse-lite@1.0.30001668: {} catharsis@0.9.0: dependencies: @@ -9220,7 +8972,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.1 + loupe: 3.1.2 pathval: 2.0.0 chalk@1.1.3: @@ -9248,7 +9000,7 @@ snapshots: check-error@2.1.1: {} - cjs-module-lexer@1.3.1: {} + cjs-module-lexer@1.4.1: {} classnames@2.5.1: {} @@ -9470,17 +9222,17 @@ snapshots: convert-source-map@2.0.0: {} - cookie@0.6.0: {} + cookie@0.7.2: {} core-js-compat@3.38.1: dependencies: - browserslist: 4.23.3 + browserslist: 4.24.0 core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.16.11)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3): dependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 1.21.6 typescript: 5.6.3 @@ -9557,15 +9309,15 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 dateformat@3.0.3: {} dateformat@4.6.3: {} - debug@4.3.6(supports-color@5.5.0): + debug@4.3.7(supports-color@5.5.0): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 @@ -9593,7 +9345,7 @@ snapshots: object-is: 1.1.6 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 + regexp.prototype.flags: 1.5.3 side-channel: 1.0.6 which-boxed-primitive: 1.0.2 which-collection: 1.0.2 @@ -9634,7 +9386,7 @@ snapshots: detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9652,7 +9404,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 csstype: 3.1.3 dot-prop@5.3.0: @@ -9670,15 +9422,15 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.7: + eciesjs@0.4.8: dependencies: - '@noble/ciphers': 0.5.3 - '@noble/curves': 1.5.0 - '@noble/hashes': 1.4.0 + '@noble/ciphers': 1.0.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 - electron-to-chromium@1.5.13: {} + electron-to-chromium@1.5.36: {} - emoji-regex@10.3.0: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} @@ -9769,7 +9521,7 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - escalade@3.1.2: {} + escalade@3.2.0: {} escape-regexp@0.0.1: {} @@ -9788,7 +9540,7 @@ snapshots: eslint: 9.12.0(jiti@1.21.6) prettier: 3.3.3 prettier-linter-helpers: 1.0.0 - synckit: 0.9.1 + synckit: 0.9.2 optionalDependencies: eslint-config-prettier: 9.1.0(eslint@9.12.0(jiti@1.21.6)) @@ -9806,20 +9558,20 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint@8.57.0: + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.11.1 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -9852,7 +9604,7 @@ snapshots: eslint@9.12.0(jiti@1.21.6): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 @@ -9866,7 +9618,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.1.0 eslint-visitor-keys: 4.1.0 @@ -9997,20 +9749,20 @@ snapshots: fast-uri@2.4.0: {} - fast-uri@3.0.1: {} + fast-uri@3.0.2: {} - fastify-plugin@5.0.0: {} + fastify-plugin@5.0.1: {} fastify@5.0.0: dependencies: - '@fastify/ajv-compiler': 4.0.0 + '@fastify/ajv-compiler': 4.0.1 '@fastify/error': 4.0.0 - '@fastify/fast-json-stringify-compiler': 5.0.0 + '@fastify/fast-json-stringify-compiler': 5.0.1 abstract-logging: 2.0.1 avvio: 9.0.0 fast-json-stringify: 6.0.0 - find-my-way: 9.0.1 - light-my-request: 6.0.0 + find-my-way: 9.1.0 + light-my-request: 6.1.0 pino: 9.4.0 process-warning: 4.0.0 proxy-addr: 2.0.7 @@ -10023,7 +9775,7 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.2.0(picomatch@4.0.2): + fdir@6.4.0(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -10049,7 +9801,7 @@ snapshots: make-dir: 2.1.0 pkg-dir: 3.0.0 - find-my-way@9.0.1: + find-my-way@9.1.0: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 @@ -10096,7 +9848,7 @@ snapshots: flatted@3.3.1: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} for-each@0.3.3: dependencies: @@ -10107,7 +9859,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -10132,8 +9884,6 @@ snapshots: get-east-asian-width@1.2.0: {} - get-func-name@2.0.2: {} - get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -10153,7 +9903,7 @@ snapshots: get-stream@8.0.1: {} - get-tsconfig@4.7.6: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -10199,16 +9949,16 @@ snapshots: jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 glob@11.0.0: dependencies: foreground-child: 3.3.0 - jackspeak: 4.0.1 + jackspeak: 4.0.2 minimatch: 10.0.1 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 2.0.0 glob@7.2.3: @@ -10325,7 +10075,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -10337,9 +10087,9 @@ snapshots: i18next-browser-languagedetector@7.2.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 - i18next-http-backend@2.6.1: + i18next-http-backend@2.6.2: dependencies: cross-fetch: 4.0.0 transitivePeerDependencies: @@ -10347,7 +10097,7 @@ snapshots: i18next@22.5.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 iconv-lite@0.4.24: dependencies: @@ -10364,11 +10114,11 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.11.0: + import-in-the-middle@1.11.2: dependencies: acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) - cjs-module-lexer: 1.3.1 + cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 import-meta-resolve@4.1.0: {} @@ -10390,9 +10140,9 @@ snapshots: ini@4.1.1: {} - inquirer@9.3.6: + inquirer@9.3.7: dependencies: - '@inquirer/figures': 1.0.5 + '@inquirer/figures': 1.0.7 ansi-escapes: 4.3.2 cli-width: 4.1.0 external-editor: 3.1.0 @@ -10413,7 +10163,7 @@ snapshots: interrogator@2.0.1: dependencies: - inquirer: 9.3.6 + inquirer: 9.3.7 ipaddr.js@1.9.1: {} @@ -10438,13 +10188,9 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-callable@1.2.7: {} - is-core-module@2.15.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -10559,7 +10305,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -10575,11 +10321,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.1: + jackspeak@4.0.2: dependencies: '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 jiti@1.21.6: {} @@ -10597,7 +10341,7 @@ snapshots: jsdoc@4.0.3: dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.8 '@jsdoc/salty': 0.2.8 '@types/markdown-it': 14.1.2 bluebird: 3.7.2 @@ -10613,9 +10357,7 @@ snapshots: strip-json-comments: 3.1.1 underscore: 1.13.7 - jsesc@0.5.0: {} - - jsesc@2.5.2: {} + jsesc@3.0.2: {} json-buffer@3.0.1: {} @@ -10656,9 +10398,9 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - light-my-request@6.0.0: + light-my-request@6.1.0: dependencies: - cookie: 0.6.0 + cookie: 0.7.2 process-warning: 4.0.0 set-cookie-parser: 2.7.0 @@ -10676,18 +10418,18 @@ snapshots: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) execa: 8.0.1 lilconfig: 3.1.2 - listr2: 8.2.4 + listr2: 8.2.5 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.5.0 + yaml: 2.5.1 transitivePeerDependencies: - supports-color - listr2@8.2.4: + listr2@8.2.5: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -10776,17 +10518,15 @@ snapshots: loglevel-colored-level-prefix@1.0.0: dependencies: chalk: 1.1.3 - loglevel: 1.9.1 + loglevel: 1.9.2 - loglevel@1.9.1: {} + loglevel@1.9.2: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.2: {} lru-cache@10.4.3: {} @@ -10800,15 +10540,15 @@ snapshots: dependencies: yallist: 4.0.0 - magic-string@0.30.11: + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magicast@0.3.4: + magicast@0.3.5: dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 - source-map-js: 1.2.0 + '@babel/parser': 7.25.8 + '@babel/types': 7.25.8 + source-map-js: 1.2.1 make-dir@2.1.0: dependencies: @@ -10926,13 +10666,13 @@ snapshots: module-details-from-path@1.0.3: {} - moment-timezone@0.5.45: + moment-timezone@0.5.46: dependencies: moment: 2.30.1 moment@2.30.1: {} - ms@2.1.2: {} + ms@2.1.3: {} mute-stream@1.0.0: {} @@ -10950,7 +10690,7 @@ snapshots: nice-try@1.0.5: {} - node-abi@3.67.0: + node-abi@3.68.0: dependencies: semver: 7.6.3 @@ -10970,7 +10710,7 @@ snapshots: normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.15.0 + is-core-module: 2.15.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 @@ -11099,7 +10839,7 @@ snapshots: p-try@2.2.0: {} - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} parameter-reducers@2.1.0: {} @@ -11114,7 +10854,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.25.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -11160,7 +10900,7 @@ snapshots: pg-connection-string@2.7.0: {} - pg-cursor@2.11.0(pg@8.13.0): + pg-cursor@2.12.0(pg@8.13.0): dependencies: pg: 8.13.0 @@ -11176,8 +10916,6 @@ snapshots: dependencies: pg: 8.13.0 - pg-protocol@1.6.1: {} - pg-protocol@1.7.0: {} pg-types@2.2.0: @@ -11212,7 +10950,7 @@ snapshots: dependencies: split2: 4.2.0 - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -11242,10 +10980,10 @@ snapshots: minimist: 1.2.8 on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.2.0 - pump: 3.0.0 + pump: 3.0.2 readable-stream: 4.5.2 secure-json-parse: 2.7.0 - sonic-boom: 4.0.1 + sonic-boom: 4.1.0 strip-json-comments: 3.1.1 pino-std-serializers@7.0.0: {} @@ -11260,8 +10998,8 @@ snapshots: process-warning: 4.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 4.0.1 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.1.0 thread-stream: 3.1.0 pirates@4.0.6: {} @@ -11274,17 +11012,17 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 possible-typed-array-names@1.0.0: {} postcss-value-parser@4.2.0: {} - postcss@8.4.41: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 postgres-array@2.0.0: {} @@ -11312,10 +11050,10 @@ snapshots: prettier-eslint@16.3.0: dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.3) common-tags: 1.8.2 dlv: 1.1.3 - eslint: 8.57.0 + eslint: 8.57.1 indent-string: 4.0.0 lodash.merge: 4.6.2 loglevel-colored-level-prefix: 1.0.0 @@ -11323,7 +11061,7 @@ snapshots: pretty-format: 29.7.0 require-relative: 0.8.7 typescript: 5.6.3 - vue-eslint-parser: 9.4.3(eslint@8.57.0) + vue-eslint-parser: 9.4.3(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -11355,105 +11093,106 @@ snapshots: prosemirror-changeset@2.2.1: dependencies: - prosemirror-transform: 1.10.0 + prosemirror-transform: 1.10.2 prosemirror-collab@1.3.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-commands@1.6.0: + prosemirror-commands@1.6.1: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 + prosemirror-transform: 1.10.2 prosemirror-dropcursor@1.8.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 - prosemirror-view: 1.33.11 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.34.3 prosemirror-gapcursor@1.3.2: dependencies: prosemirror-keymap: 1.2.2 - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.11 + prosemirror-view: 1.34.3 prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 - prosemirror-view: 1.33.11 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.34.3 rope-sequence: 1.3.4 prosemirror-inputrules@1.4.0: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 + prosemirror-transform: 1.10.2 prosemirror-keymap@1.2.2: dependencies: prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.0: + prosemirror-markdown@1.13.1: dependencies: + '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-menu@1.2.4: dependencies: crelt: 1.0.6 - prosemirror-commands: 1.6.0 + prosemirror-commands: 1.6.1 prosemirror-history: 1.4.1 prosemirror-state: 1.4.3 - prosemirror-model@1.22.3: + prosemirror-model@1.23.0: dependencies: orderedmap: 2.1.1 prosemirror-schema-basic@1.2.3: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-schema-list@1.4.1: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 + prosemirror-transform: 1.10.2 prosemirror-state@1.4.3: dependencies: - prosemirror-model: 1.22.3 - prosemirror-transform: 1.10.0 - prosemirror-view: 1.33.11 + prosemirror-model: 1.23.0 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.34.3 - prosemirror-tables@1.4.0: + prosemirror-tables@1.5.0: dependencies: prosemirror-keymap: 1.2.2 - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 - prosemirror-view: 1.33.11 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.34.3 - prosemirror-trailing-node@2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.11): + prosemirror-trailing-node@2.0.9(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3): dependencies: '@remirror/core-constants': 2.0.2 escape-string-regexp: 4.0.0 - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.11 + prosemirror-view: 1.34.3 - prosemirror-transform@1.10.0: + prosemirror-transform@1.10.2: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 - prosemirror-view@1.33.11: + prosemirror-view@1.34.3: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.23.0 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.0 + prosemirror-transform: 1.10.2 proxy-addr@2.0.7: dependencies: @@ -11462,7 +11201,7 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -11515,7 +11254,7 @@ snapshots: react-i18next@12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 html-parse-stringify: 3.0.1 i18next: 22.5.1 react: 18.3.1 @@ -11550,9 +11289,9 @@ snapshots: react-fast-compare: 3.2.2 warning: 4.0.3 - react-redux@8.1.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1): + react-redux@8.1.3(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 '@types/hoist-non-react-statics': 3.3.5 '@types/use-sync-external-store': 0.0.3 hoist-non-react-statics: 3.3.2 @@ -11560,35 +11299,35 @@ snapshots: react-is: 18.3.1 use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.11 react-dom: 18.3.1(react@18.3.1) redux: 4.2.1 - react-router-dom@6.26.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/router': 1.19.1 + '@remix-run/router': 1.19.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.26.1(react@18.3.1) + react-router: 6.26.2(react@18.3.1) - react-router@6.26.1(react@18.3.1): + react-router@6.26.2(react@18.3.1): dependencies: - '@remix-run/router': 1.19.1 + '@remix-run/router': 1.19.2 react: 18.3.1 - react-select@5.8.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-select@5.8.1(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 '@emotion/cache': 11.13.1 - '@emotion/react': 11.13.3(@types/react@18.3.4)(react@18.3.1) - '@floating-ui/dom': 1.6.10 + '@emotion/react': 11.13.3(@types/react@18.3.11)(react@18.3.1) + '@floating-ui/dom': 1.6.11 '@types/react-transition-group': 4.4.11 memoize-one: 6.0.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.4)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.11)(react@18.3.1) transitivePeerDependencies: - '@types/react' - supports-color @@ -11600,7 +11339,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -11668,9 +11407,9 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 - regenerate-unicode-properties@10.1.1: + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -11680,27 +11419,29 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.7 - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - regexpu-core@5.3.2: + regexpu-core@6.1.1: dependencies: - '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.11.1 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript: 2.2.0 - regjsparser@0.9.1: + regjsgen@0.8.0: {} + + regjsparser@0.11.1: dependencies: - jsesc: 0.5.0 + jsesc: 3.0.2 require-directory@2.1.1: {} @@ -11708,7 +11449,7 @@ snapshots: require-in-the-middle@7.4.0: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -11728,7 +11469,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -11762,38 +11503,38 @@ snapshots: rimraf@6.0.1: dependencies: glob: 11.0.0 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 - rollup-plugin-esbuild-minify@1.1.2(rollup@4.21.0): + rollup-plugin-esbuild-minify@1.1.2(rollup@4.24.0): dependencies: esbuild: 0.23.1 - rollup: 4.21.0 + rollup: 4.24.0 - rollup-plugin-polyfill-node@0.13.0(rollup@4.21.0): + rollup-plugin-polyfill-node@0.13.0(rollup@4.24.0): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.21.0) - rollup: 4.21.0 + '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) + rollup: 4.24.0 - rollup@4.21.0: + rollup@4.24.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.0 - '@rollup/rollup-android-arm64': 4.21.0 - '@rollup/rollup-darwin-arm64': 4.21.0 - '@rollup/rollup-darwin-x64': 4.21.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 - '@rollup/rollup-linux-arm-musleabihf': 4.21.0 - '@rollup/rollup-linux-arm64-gnu': 4.21.0 - '@rollup/rollup-linux-arm64-musl': 4.21.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 - '@rollup/rollup-linux-riscv64-gnu': 4.21.0 - '@rollup/rollup-linux-s390x-gnu': 4.21.0 - '@rollup/rollup-linux-x64-gnu': 4.21.0 - '@rollup/rollup-linux-x64-musl': 4.21.0 - '@rollup/rollup-win32-arm64-msvc': 4.21.0 - '@rollup/rollup-win32-ia32-msvc': 4.21.0 - '@rollup/rollup-win32-x64-msvc': 4.21.0 + '@rollup/rollup-android-arm-eabi': 4.24.0 + '@rollup/rollup-android-arm64': 4.24.0 + '@rollup/rollup-darwin-arm64': 4.24.0 + '@rollup/rollup-darwin-x64': 4.24.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 + '@rollup/rollup-linux-arm-musleabihf': 4.24.0 + '@rollup/rollup-linux-arm64-gnu': 4.24.0 + '@rollup/rollup-linux-arm64-musl': 4.24.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 + '@rollup/rollup-linux-riscv64-gnu': 4.24.0 + '@rollup/rollup-linux-s390x-gnu': 4.24.0 + '@rollup/rollup-linux-x64-gnu': 4.24.0 + '@rollup/rollup-linux-x64-musl': 4.24.0 + '@rollup/rollup-win32-arm64-msvc': 4.24.0 + '@rollup/rollup-win32-ia32-msvc': 4.24.0 + '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -11806,7 +11547,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.3 + tslib: 2.7.0 safe-buffer@5.1.2: {} @@ -11816,7 +11557,7 @@ snapshots: dependencies: ret: 0.5.0 - safe-stable-stringify@2.4.3: {} + safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} @@ -11837,13 +11578,13 @@ snapshots: sequelize@6.37.4: dependencies: '@types/debug': 4.1.12 - '@types/validator': 13.12.0 - debug: 4.3.6(supports-color@5.5.0) + '@types/validator': 13.12.2 + debug: 4.3.7(supports-color@5.5.0) dottie: 2.0.6 inflection: 1.13.4 lodash: 4.17.21 moment: 2.30.1 - moment-timezone: 0.5.45 + moment-timezone: 0.5.46 pg-connection-string: 2.7.0 retry-as-promised: 7.0.4 semver: 7.6.3 @@ -11924,11 +11665,11 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - sonic-boom@4.0.1: + sonic-boom@4.1.0: dependencies: atomic-sleep: 1.0.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -12012,7 +11753,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.3.0 + emoji-regex: 10.4.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 @@ -12036,7 +11777,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -12050,14 +11791,14 @@ snapshots: strip-json-comments@3.1.1: {} - styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): + styled-components@5.3.9(@babel/core@7.25.8)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): dependencies: - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/traverse': 7.25.3(supports-color@5.5.0) - '@emotion/is-prop-valid': 1.3.0 + '@babel/helper-module-imports': 7.25.7(supports-color@5.5.0) + '@babel/traverse': 7.25.7(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.25.8)(styled-components@5.3.9(@babel/core@7.25.8)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 @@ -12108,10 +11849,10 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.1: + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.3 + tslib: 2.7.0 test-exclude@7.0.1: dependencies: @@ -12156,13 +11897,13 @@ snapshots: tinyexec@0.3.0: {} - tinymce@6.8.4: {} + tinymce@6.8.5: {} tinypool@1.0.1: {} tinyrainbow@1.2.0: {} - tinyspy@3.0.0: {} + tinyspy@3.0.2: {} tippy.js@6.3.7: dependencies: @@ -12194,16 +11935,16 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3): + ts-node@10.9.2(@types/node@20.16.11)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 + '@types/node': 20.16.11 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -12212,12 +11953,12 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tslib@2.6.3: {} + tslib@2.7.0: {} tsx@4.19.1: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.7.6 + get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 @@ -12261,24 +12002,24 @@ snapshots: undici-types@6.19.8: {} - unicode-canonical-property-names-ecmascript@2.0.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.1.0: {} + unicode-match-property-value-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.1.0: {} unicorn-magic@0.1.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): + update-browserslist-db@1.1.1(browserslist@4.24.0): dependencies: - browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 uppercamelcase@3.0.0: dependencies: @@ -12288,11 +12029,11 @@ snapshots: dependencies: punycode: 2.3.1 - use-isomorphic-layout-effect@1.1.2(@types/react@18.3.4)(react@18.3.1): + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.11 use-memo-one@1.1.3(react@18.3.1): dependencies: @@ -12319,12 +12060,12 @@ snapshots: vary@1.1.2: {} - vite-node@2.1.2(@types/node@22.7.5): + vite-node@2.1.2(@types/node@20.16.11): dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) pathe: 1.1.2 - vite: 5.4.2(@types/node@22.7.5) + vite: 5.4.8(@types/node@20.16.11) transitivePeerDependencies: - '@types/node' - less @@ -12336,38 +12077,38 @@ snapshots: - supports-color - terser - vite@5.4.2(@types/node@22.7.5): + vite@5.4.8(@types/node@20.16.11): dependencies: esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.21.0 + postcss: 8.4.47 + rollup: 4.24.0 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 fsevents: 2.3.3 - vitest@2.1.2(@types/node@22.7.5): + vitest@2.1.2(@types/node@20.16.11): dependencies: '@vitest/expect': 2.1.2 - '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.2(@types/node@22.7.5)) + '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@20.16.11)) '@vitest/pretty-format': 2.1.2 '@vitest/runner': 2.1.2 '@vitest/snapshot': 2.1.2 '@vitest/spy': 2.1.2 '@vitest/utils': 2.1.2 chai: 5.1.1 - debug: 4.3.6(supports-color@5.5.0) - magic-string: 0.30.11 + debug: 4.3.7(supports-color@5.5.0) + magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.2(@types/node@22.7.5) - vite-node: 2.1.2(@types/node@22.7.5) + vite: 5.4.8(@types/node@20.16.11) + vite-node: 2.1.2(@types/node@20.16.11) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 transitivePeerDependencies: - less - lightningcss @@ -12381,10 +12122,10 @@ snapshots: void-elements@3.1.0: {} - vue-eslint-parser@9.4.3(eslint@8.57.0): + vue-eslint-parser@9.4.3(eslint@8.57.1): dependencies: - debug: 4.3.6(supports-color@5.5.0) - eslint: 8.57.0 + debug: 4.3.7(supports-color@5.5.0) + eslint: 8.57.1 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -12453,7 +12194,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 22.7.5 + '@types/node': 20.16.11 word-wrap@1.2.5: {} @@ -12502,7 +12243,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.5.0: {} + yaml@2.5.1: {} yargs-parser@20.2.9: {} @@ -12511,7 +12252,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -12521,7 +12262,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/server.ts b/server.ts index 21f5642e6..af36a6825 100755 --- a/server.ts +++ b/server.ts @@ -17,66 +17,65 @@ import { exit } from "node:process"; import * as Sentry from "@sentry/node"; import { getGatewayServer } from "rusty-motors-gateway"; -import { verifyLegacyCipherSupport } from "rusty-motors-gateway"; +import { verifyLegacyCipherSupport } from "rusty-motors-shared"; import { getServerConfiguration } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; const coreLogger = getServerLogger({ - name: "core", + name: "core", }); try { - verifyLegacyCipherSupport(); + verifyLegacyCipherSupport(); } catch (err) { - coreLogger.fatal(`Error in core server: ${String(err)}`); - exit(1); + coreLogger.fatal(`Error in core server: ${String(err)}`); + exit(1); } try { - if (typeof process.env["EXTERNAL_HOST"] === "undefined") { - console.error("Please set EXTERNAL_HOST"); - process.exit(1); - } - if (typeof process.env["CERTIFICATE_FILE"] === "undefined") { - console.error("Please set CERTIFICATE_FILE"); - process.exit(1); - } - if (typeof process.env["PRIVATE_KEY_FILE"] === "undefined") { - console.error("Please set PRIVATE_KEY_FILE"); - process.exit(1); - } - if (typeof process.env["PUBLIC_KEY_FILE"] === "undefined") { - console.error("Please set PUBLIC_KEY_FILE"); - process.exit(1); - } - const config = getServerConfiguration({ - host: process.env["EXTERNAL_HOST"], - certificateFile: process.env["CERTIFICATE_FILE"], - privateKeyFile: process.env["PRIVATE_KEY_FILE"], - publicKeyFile: process.env["PUBLIC_KEY_FILE"], - logLevel: process.env["MCO_LOG_LEVEL"] || "info", - }); + if (typeof process.env["EXTERNAL_HOST"] === "undefined") { + console.error("Please set EXTERNAL_HOST"); + process.exit(1); + } + if (typeof process.env["CERTIFICATE_FILE"] === "undefined") { + console.error("Please set CERTIFICATE_FILE"); + process.exit(1); + } + if (typeof process.env["PRIVATE_KEY_FILE"] === "undefined") { + console.error("Please set PRIVATE_KEY_FILE"); + process.exit(1); + } + if (typeof process.env["PUBLIC_KEY_FILE"] === "undefined") { + console.error("Please set PUBLIC_KEY_FILE"); + process.exit(1); + } + const config = getServerConfiguration({ + host: process.env["EXTERNAL_HOST"], + certificateFile: process.env["CERTIFICATE_FILE"], + privateKeyFile: process.env["PRIVATE_KEY_FILE"], + publicKeyFile: process.env["PUBLIC_KEY_FILE"], + logLevel: process.env["MCO_LOG_LEVEL"] || "info", + }); - const appLog = getServerLogger({ - level: config.logLevel, - name: "app", - }); + const appLog = getServerLogger({ + level: config.logLevel, + name: "app", + }); - const listeningPortList = [ - 6660, 7003, 8228, 8226, 8227, 9000, 9001, 9002, 9003, 9004, 9005, 9006, - 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 43200, 43300, 43400, - 53303, - ]; + const listeningPortList = [ + 6660, 7003, 8228, 8226, 8227, 9000, 9001, 9002, 9003, 9004, 9005, 9006, + 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 43200, 43300, 43400, 53303, + ]; - const gatewayServer = getGatewayServer({ - config, - log: appLog, - listeningPortList, - }); + const gatewayServer = getGatewayServer({ + config, + log: appLog, + listeningPortList, + }); - gatewayServer.start(); + gatewayServer.start(); } catch (err) { - Sentry.captureException(err); - coreLogger.fatal(`Error in core server: ${String(err)}`); - process.exit(1); + Sentry.captureException(err); + coreLogger.fatal(`Error in core server: ${String(err)}`); + process.exit(1); } diff --git a/src/chat/index.ts b/src/chat/index.ts index fa3f1ae6c..327eecaf2 100644 --- a/src/chat/index.ts +++ b/src/chat/index.ts @@ -10,6 +10,7 @@ import { handleReceiveEmailMessage, } from "./inGameEmails.js"; import { bufferToHexString } from "./toHexString.js"; +import * as Sentry from "@sentry/node"; const handlers = new Map Buffer[]>(); handlers.set(0x0524, handleReceiveEmailMessage); @@ -34,8 +35,21 @@ async function receiveChatData({ log.info(`Received chat data from connection ${connectionId}`); log.debug(`Message: ${message.toHexString()}`); - const inboundMessage = ChatMessage.fromBuffer(message.serialize()); - + let inboundMessage: ChatMessage; + + try { + inboundMessage = ChatMessage.fromBuffer(message.serialize()); + } catch (error) { + const err = new Error(`[${connectionId}] Error deserializing message`, { + cause: error, + }); + log.error(err.message); + Sentry.captureException(err); + return { + connectionId, + messages: [], + }; + } log.debug(`Deserialized message: ${inboundMessage.toString()}`); const id = inboundMessage.messageId; diff --git a/test/factoryMocks.ts b/test/factoryMocks.ts index e5c7c7b58..b8bb1eafb 100644 --- a/test/factoryMocks.ts +++ b/test/factoryMocks.ts @@ -1,6 +1,5 @@ import { expect, it, vi } from "vitest"; -import { verifyLegacyCipherSupport } from "../packages/gateway/src/encryption.js"; - +import { ensureLegacyCipherCompatibility } from "../packages/shared/src/verifyLegacyCipherSupport.js"; export function mockPino() { vi.mock("pino", () => { @@ -30,5 +29,5 @@ export function unmockPino() { } it("should have crypto", () => { - expect(() => verifyLegacyCipherSupport()).not.toThrow(); + expect(() => ensureLegacyCipherCompatibility()).not.toThrow(); }); diff --git a/tsconfig.base.json b/tsconfig.base.json index 3159f30da..4d6a20b0c 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,12 +1,16 @@ { "compilerOptions": { - "incremental": true, - "target": "ES2022", - "module": "NodeNext", "lib": [ - "ES2022" + "es2023" ], - "moduleResolution": "NodeNext", + "module": "node16", + "target": "es2022", + "moduleResolution": "node16", + "allowUnusedLabels": false, + "allowUnreachableCode": false, + "exactOptionalPropertyTypes": true, + "checkJs": true, + "incremental": true, "noImplicitOverride": true, "noImplicitAny": true, "strictNullChecks": true,