diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index f87f6d8a0..633c71fad 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -31,6 +31,7 @@ jobs: run: | corepack enable pnpm pnpm install + pnpm run build pnpm test - name: Codecov if: ${{ always() }} diff --git a/.gitignore b/.gitignore index f4862d4d2..bdabb87f9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,10 @@ build *.tar packages/**/*.js package-lock.json + +# Sentry Config File +.env.sentry-build-plugin + +# Sentry Config File +.env.sentry-build-plugin +meta.json diff --git a/apps/main/server.d.ts b/apps/main/server.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/apps/main/server.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/apps/main/server.ts b/apps/main/server.ts index d22e50ff1..467bba8ba 100755 --- a/apps/main/server.ts +++ b/apps/main/server.ts @@ -16,10 +16,7 @@ import Sentry from "@sentry/node"; import { nodeProfilingIntegration } from "@sentry/profiling-node"; -import { - ServerLoggerLevels, - getServerLogger, -} from "../../packages/shared/log.js"; +import { getServerLogger } from "../../packages/shared/log.js"; import { verifyLegacyCipherSupport } from "../../packages/gateway/src/encryption.js"; import { getServerConfiguration } from "../../packages/shared/Configuration.js"; import { getGatewayServer } from "../../packages/gateway/src/GatewayServer.js"; diff --git a/build.mjs b/build.mjs new file mode 100644 index 000000000..6c568b866 --- /dev/null +++ b/build.mjs @@ -0,0 +1,76 @@ +import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin"; +import fs from "node:fs"; +import esbuild from "esbuild"; +import { createRequire } from "node:module"; + +const require = createRequire(import.meta.url); + +const nativeNodeModulesPlugin = { + name: "native-node-modules", + setup(build) { + // If a ".node" file is imported within a module in the "file" namespace, resolve + // it to an absolute path and put it into the "node-file" virtual namespace. + build.onResolve({ filter: /\.node$/, namespace: "file" }, (args) => ({ + path: require.resolve(args.path, { paths: [args.resolveDir] }), + namespace: "node-file", + })); + + // Files in the "node-file" virtual namespace call "require()" on the + // path from esbuild of the ".node" file in the output directory. + build.onLoad({ filter: /.*/, namespace: "node-file" }, (args) => ({ + contents: ` + import path from ${JSON.stringify(args.path)} + try { module.exports = require(path) } + catch {} + `, + })); + + // If a ".node" file is imported within a module in the "node-file" namespace, put + // it in the "file" namespace where esbuild's default loading behavior will handle + // it. It is already an absolute path since we resolved it to one above. + build.onResolve( + { filter: /\.node$/, namespace: "node-file" }, + (args) => ({ + path: args.path, + namespace: "file", + }), + ); + + // Tell esbuild's default loading behavior to use the "file" loader for + // these ".node" files. + let opts = build.initialOptions; + opts.loader = opts.loader || {}; + opts.loader[".node"] = "file"; + }, +}; + +esbuild + .build({ + sourcemap: "external", // Source map generation must be turned on + platform: "node", + outdir: "dist", + entryPoints: ["apps/main/server.ts"], + format: "esm", + metafile: true, + bundle: true, + packages: "external", + banner: { + js: "import * as path from 'node:path';import { createRequire } from 'module';import { fileURLToPath } from 'node:url';const require = createRequire(import.meta.url);const __dirname = path.dirname(fileURLToPath(import.meta.url));", + }, + plugins: [ + nativeNodeModulesPlugin, + // Put the Sentry esbuild plugin after all other plugins + sentryEsbuildPlugin({ + authToken: process.env.SENTRY_AUTH_TOKEN, + org: "drazisilcom", + project: "rusty-motors-server", + }), + ], + }) + .then((result) => { + fs.writeFileSync("meta.json", JSON.stringify(result.metafile)); + }) + .catch((e) => { + console.error(e); + process.exit(1); + }); diff --git a/docs/technical/domains.md b/docs/technical/domains.md index 28b967b4e..eb11e622e 100644 --- a/docs/technical/domains.md +++ b/docs/technical/domains.md @@ -1,46 +1,48 @@ # Domains -* Web -* Network -* Account -* Login -* Persona -* Lobby -* Database +- Web +- Network +- Account +- Login +- Persona +- Lobby +- Database ## Web The web service is an HTTP/HTTPS server that provides the following external endpoints: -* A binary response to the GET patch URL -* A binary response to the GET update URL -* A POST receive of a username and password using HTTPS which returns a Ticket code if valid, and an error if not -* A response to the GET shardlist URL +- A binary response to the GET patch URL +- A binary response to the GET update URL +- A POST receive of a username and password using HTTPS which returns a Ticket code if valid, and an error if not +- A response to the GET shardlist URL ### AuthLogin + Accept a username and password via HTTPS and requestions from the Account service if the login is valid. Has the following service relationships: -* Account OUTBOUND (username, password) -* Account INBOUND (isUserValid) +- Account OUTBOUND (username, password) +- Account INBOUND (isUserValid) ### Shard + The shard service responds to a GET call and requests a list of online lobby servers (shards) from the Lobby service. Has the following service relationships: -* Lobby OUTBOUND -* Lobby INBOUND (shardList) +- Lobby OUTBOUND +- Lobby INBOUND (shardList) ## Network The Network service handles all inbound and outbound non-HTTP TCP traffic between the server and clients. It has the following subdomains: -* Socket Receive -* Socket Send -* Session Control -* Interservice Transfer +- Socket Receive +- Socket Send +- Session Control +- Interservice Transfer ### Socket receive @@ -52,41 +54,41 @@ After the downstream domain finishes with the data, it returns any responses to Has the following service relationships: -* Session Control OUTBOUND (socketId, remoteAddress, localPort) -* Session Control INBOUND {socketId, SessionId} -* Interservice Transfer OUTBOUND (sessionId, dataBuffer) +- Session Control OUTBOUND (socketId, remoteAddress, localPort) +- Session Control INBOUND {socketId, SessionId} +- Interservice Transfer OUTBOUND (sessionId, dataBuffer) ### Socket Send Has the following service relationships: -* Interservice Transfer INBOUND (sessionId, dataBuffer) -* Session Control OUTBOUND (sessionId) -* Session Control INBOUND (sessionId, socketId) +- Interservice Transfer INBOUND (sessionId, dataBuffer) +- Session Control OUTBOUND (sessionId) +- Session Control INBOUND (sessionId, socketId) ### Session Control Has the following service relationships: -* Socket Receive INBOUND (socketId, remoteAddress, localPort) -* Socket Receive OUTBOUND (socketId, sessionId) -* Socket Send INBOUND (sessionId) -* Socket Send OUTBOUND (sessionId, socketId) +- Socket Receive INBOUND (socketId, remoteAddress, localPort) +- Socket Receive OUTBOUND (socketId, sessionId) +- Socket Send INBOUND (sessionId) +- Socket Send OUTBOUND (sessionId, socketId) ### Interservice Transfer Has the following service relationships: -* Socket Receive INBOUND (sessionId, dataBuffer) -* Socket Send OUTBOUND (sessionId, dataBuffer) -* Login OUTBOUND (sessionId, dataBuffer) -* Login INBOUND (sessionId, dataBuffer) -* Persona OUTBOUND (sessionId, dataBuffer) -* Persona INBOUND (sessionId, dataBuffer) -* Lobby OUTBOUND (sessionId, dataBuffer) -* Lobby INBOUND (sessionId, dataBuffer) -* Database OUTBOUND (sessionId, dataBuffer) -* Database INBOUND (sessionId, dataBuffer) +- Socket Receive INBOUND (sessionId, dataBuffer) +- Socket Send OUTBOUND (sessionId, dataBuffer) +- Login OUTBOUND (sessionId, dataBuffer) +- Login INBOUND (sessionId, dataBuffer) +- Persona OUTBOUND (sessionId, dataBuffer) +- Persona INBOUND (sessionId, dataBuffer) +- Lobby OUTBOUND (sessionId, dataBuffer) +- Lobby INBOUND (sessionId, dataBuffer) +- Database OUTBOUND (sessionId, dataBuffer) +- Database INBOUND (sessionId, dataBuffer) ## Account diff --git a/package.json b/package.json index 88dd1f245..86dd9394b 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,19 @@ "name": "rusty-motors", "version": "1.0.1", "description": "This is a game server, being written from scratch, for a very old and long dead game. The owners of said game have shown no interest in bringing it back, but even so all names of their IP have been avoided to prevent issues.", - "main": "index.js", "type": "module", + "exports": { + ".": "./dist/index.js" + }, "scripts": { - "test": "tsc && eslint --fix . && prettier --write . && node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage packages thebeast", - "start": "pnpm --filter @rustymotors/server start" + "lint": "tsc", + "build": "node build.mjs", + "start": "node --openssl-legacy-provider --env-file=.env dist/server.js", + "dev:rsc": "tsc --watch --preserveWatchOutput", + "dev:node": "node --watch dist/apps/main/server.js", + "dev:esbuild": "pnpm run build --watch", + "dev": "run-p dev:*", + "test": "eslint --fix . && prettier --write . && node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage packages thebeast" }, "author": "Molly Crendraven ", "license": "AGPL-3.0", @@ -16,24 +24,33 @@ "url": "git@github.com:drazisil/mcos.git" }, "devDependencies": { + "@sentry/node": "^7.108.0", + "@sentry/profiling-node": "^7.108.0", "@slonik/migrator": "0.12.0", "@types/node": "20.11.30", "@vitest/coverage-v8": "1.4.0", + "esbuild": "^0.20.2", "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.1.3", + "npm-run-all": "^4.1.5", "prettier": "3.2.5", "typescript": "5.4.3", "vitest": "1.4.0" }, "dependencies": { + "@fastify/sensible": "^5.5.0", "@rustymotors/database": "workspace:^", "@rustymotors/shared": "workspace:^", "@rustymotors/shared-packets": "workspace:^", - "@sentry/node": "^7.102.0", - "@sentry/profiling-node": "^7.104.0", + "@sentry/esbuild-plugin": "^2.16.0", + "fastify": "^4.25.2", + "pino": "^8.18.0", + "pino-pretty": "^11.0.0", + "short-unique-id": "^5.0.3", "slonik": "37", - "tsx": "^4.7.1" + "tsx": "^4.7.1", + "zod": "^3.22.4" }, "packageManager": "pnpm@8.15.5" } diff --git a/packages/cli/ConsoleThread.d.ts b/packages/cli/ConsoleThread.d.ts new file mode 100644 index 000000000..4daf4c66f --- /dev/null +++ b/packages/cli/ConsoleThread.d.ts @@ -0,0 +1,31 @@ +import { SubThread } from "../shared/index.js"; +import { Gateway } from "../gateway/src/GatewayServer.js"; +import type { TServerLogger } from "../shared/index.js"; +/** + * @module ConsoleThread + */ +/** + * Console thread + */ +export declare class ConsoleThread extends SubThread { + parentThread: Gateway; + /** + * @param {object} options + * @param {Gateway} options.parentThread The parent thread + * @param {ServerLogger} options.log The logger + */ + constructor({ + parentThread, + log, + }: { + parentThread: Gateway; + log: TServerLogger; + }); + /** @param {import("../interfaces/index.js").KeypressEvent} key */ + handleKeypressEvent( + key: import("../interfaces/index.js").KeypressEvent, + ): void; + init(): void; + run(): void; + stop(): void; +} diff --git a/packages/cli/ConsoleThread.ts b/packages/cli/ConsoleThread.ts index 969ecffa7..3e9840efb 100644 --- a/packages/cli/ConsoleThread.ts +++ b/packages/cli/ConsoleThread.ts @@ -1,10 +1,7 @@ import { emitKeypressEvents } from "node:readline"; -import { SubThread } from "@rustymotors/shared"; -// eslint-disable-next-line no-unused-vars +import { SubThread, type TServerLogger } from "../shared"; import { Gateway } from "../gateway/src/GatewayServer.js"; -import type { TServerLogger } from "@rustymotors/shared"; - /** * @module ConsoleThread */ diff --git a/packages/core/src/serializationHelpers.d.ts b/packages/core/src/serializationHelpers.d.ts new file mode 100644 index 000000000..ad416bb6c --- /dev/null +++ b/packages/core/src/serializationHelpers.d.ts @@ -0,0 +1,96 @@ +/// +/** + * Clamp a value between 0 and 255 + * @param {number} value + * @returns {number} + */ +export declare function clamp16(value: number): number; +/** + * Clamp a value between 0 and 65535 + * @param {number} value + * @returns {number} + */ +export declare function clamp32(value: number): number; +/** + * Serializes a boolean to a buffer. + * @param {boolean} bool + * @returns {Buffer} + */ +export declare function serializeBool(bool: boolean): Buffer; +/** + * Serializes a byte to a buffer. + * @param {number} byte + * @returns {Buffer} + */ +export declare function serializeByte(byte: number): Buffer; +/** + * Serializes a word to a buffer. + * @param {number} word + * @returns {Buffer} + */ +export declare function serializeWord(word: number): Buffer; +/** + * Serializes a dword to a buffer. + * @param {number} dword + * @returns {Buffer} + */ +export declare function serializeDWord(dword: number): Buffer; +/** + * Serializes a float to a buffer. + * @param {number} f + * @returns {Buffer} + */ +export declare function serializeFloat(f: number): Buffer; +/** + * Serializes a string to a buffer. The buffer will be prefixed with the length of the string. + * @param {string} str + * @returns {Buffer} + */ +export declare function serializeString(str: string): Buffer; +/** + * Deserializes a boolean from a buffer. + * @param {Buffer} buff + * @returns {boolean} + */ +export declare function deserializeBool(buff: Buffer): boolean; +/** + * Deserializes a byte from a buffer. + * @param {Buffer} buff + * @returns {number} + */ +export declare function deserializeByte(buff: Buffer): number; +/** + * Deserializes a word from a buffer. + * @param {Buffer} buff + * @returns {number} + */ +export declare function deserializeWord(buff: Buffer): number; +/** + * Deserializes a dword from a buffer. + * @param {Buffer} buff + * @returns {number} + */ +export declare function deserializeDWord(buff: Buffer): number; +/** + * Deserializes a float from a buffer. + * @param {Buffer} buff + * @returns {number} + */ +export declare function deserializeFloat(buff: Buffer): number; +/** + * 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 declare function deserializeString(buf: Buffer): string; +export declare function sizeOfBool(): number; +export declare function sizeOfByte(): number; +export declare function sizeOfWord(): number; +export declare function sizeOfDWord(): number; +export declare function sizeOfFloat(): number; +/** + * Returns the size of a string, including the length prefix. + * @param {string} string + * @returns {number} + */ +export declare function sizeOfString(string: string): number; diff --git a/packages/core/src/serializationHelpers.test.d.ts b/packages/core/src/serializationHelpers.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/core/src/serializationHelpers.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/database/index.d.ts b/packages/database/index.d.ts new file mode 100644 index 000000000..ff8f9927d --- /dev/null +++ b/packages/database/index.d.ts @@ -0,0 +1,14 @@ +export { + updateUser, + fetchSessionKeyByCustomerId, + updateSessionKey, + fetchSessionKeyByConnectionId, +} from "./src/DatabaseManager.js"; +export { getVehiclePartTree } from "./src/cache.js"; +export { + buildVehiclePartTreeFromDB, + buildVehiclePartTree, + saveVehiclePartTree, + saveVehicle, +} from "./src/models/VehiclePartTree.js"; +export type { TPart } from "./src/models/Part.js"; diff --git a/packages/database/package.json b/packages/database/package.json index 692086c67..62cb1857c 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -4,8 +4,8 @@ "description": "", "exports": { ".": { - "import": "./index.ts", - "require": "./index.ts" + "import": "./index.js", + "require": "./index.js" } }, "type": "module", diff --git a/packages/database/src/DatabaseManager.d.ts b/packages/database/src/DatabaseManager.d.ts new file mode 100644 index 000000000..c9e92b84a --- /dev/null +++ b/packages/database/src/DatabaseManager.d.ts @@ -0,0 +1,55 @@ +/** + * This class abstracts database methods + * @see {@link getDatabaseServer()} to get a singleton instance + */ +/// +/** + * This class abstracts database methods + * @see {@link getDatabaseServer()} to get a singleton instance + */ +import type { ConnectionRecord } from "../../interfaces/index.js"; +/** + * @module Database + */ +/** + * Update a user record in the database + +* @throws {Error} If the user record is not found + */ +export declare function updateUser(user: { + userId: number; + userData: Buffer; +}): Promise; +/** + * Locate customer session encryption key in the database + * + * @throws {Error} If the session key is not found + */ +export declare function fetchSessionKeyByCustomerId( + customerId: number, +): Promise; +/** + * Create or overwrite a customer's session key record + * + * @param {number} customerId + * @param {string} sessionKey + * @param {string} contextId + * @param {string} connectionId + * @returns {Promise} + */ +export declare function updateSessionKey( + customerId: number, + sessionKey: string, + contextId: string, + connectionId: string, +): Promise; +/** + * Locate customer session encryption key in the database + * + * @param {string} connectionId + * @returns {Promise} + * @throws {Error} If the session key is not found + */ +export declare function fetchSessionKeyByConnectionId( + connectionId: string, +): Promise; diff --git a/packages/database/src/DatabaseManager.ts b/packages/database/src/DatabaseManager.ts index 14eb4799f..7d08749e9 100644 --- a/packages/database/src/DatabaseManager.ts +++ b/packages/database/src/DatabaseManager.ts @@ -3,7 +3,11 @@ * @see {@link getDatabaseServer()} to get a singleton instance */ -import { ConnectionRecord } from "../../interfaces/index.js"; +/** + * This class abstracts database methods + * @see {@link getDatabaseServer()} to get a singleton instance + */ +import type { ConnectionRecord } from "../../interfaces/index.js"; // This is a fake database table that holds sessions of currently logged in users const _sessions: ConnectionRecord[] = []; diff --git a/packages/database/src/cache.d.ts b/packages/database/src/cache.d.ts new file mode 100644 index 000000000..a75a550b5 --- /dev/null +++ b/packages/database/src/cache.d.ts @@ -0,0 +1,12 @@ +import type { TBrand } from "./models/Brand.js"; +import type { VehiclePartTreeType } from "./models/VehiclePartTree.js"; +export declare function getBrand( + brandName: string, +): Promise; +export declare function getVehiclePartTree( + vehicleId: number, +): Promise; +export declare function setVehiclePartTree( + vehicleId: number, + vehiclePartTree: VehiclePartTreeType, +): Promise; diff --git a/packages/database/src/cache.ts b/packages/database/src/cache.ts index 48ec69c65..b6fcb3458 100644 --- a/packages/database/src/cache.ts +++ b/packages/database/src/cache.ts @@ -1,5 +1,5 @@ -import { TBrand } from "./models/Brand.js"; -import { VehiclePartTreeType } from "./models/VehiclePartTree.js"; +import type { TBrand } from "./models/Brand.js"; +import type { VehiclePartTreeType } from "./models/VehiclePartTree.js"; import { getSlonik } from "./services/database.js"; import * as Sentry from "@sentry/node"; diff --git a/packages/database/src/models/AttachmentPoint.d.ts b/packages/database/src/models/AttachmentPoint.d.ts new file mode 100644 index 000000000..7b7b7c9e2 --- /dev/null +++ b/packages/database/src/models/AttachmentPoint.d.ts @@ -0,0 +1,41 @@ +export type TAttachmentPointRecord = { + attachmentPointId: number; + attachmentPoint: string; +}; +export type TAttachmentPoint = + | "Default" + | "FrontLeft" + | "FrontRight" + | "RearLeft" + | "RearRight" + | "Left" + | "Right" + | "A" + | "B" + | "C" + | "Front" + | "Rear"; +export declare const EAttachmentPoint: { + Default: number; + FrontLeft: number; + FrontRight: number; + RearLeft: number; + RearRight: number; + Left: number; + Right: number; + A: number; + B: number; + C: number; + Front: number; + Rear: number; +}; +export declare const attachmentPoints: TAttachmentPointRecord[]; +export declare function isValidAttachmentPoint( + attachmentPoint: string, +): boolean; +export declare function getAttachmentPoint( + attachmentPoint: TAttachmentPoint, +): number; +export declare function getAttachmentPointName( + attachmentPointId: number, +): TAttachmentPoint | undefined; diff --git a/packages/database/src/models/Brand.d.ts b/packages/database/src/models/Brand.d.ts new file mode 100644 index 000000000..dfba4ad7b --- /dev/null +++ b/packages/database/src/models/Brand.d.ts @@ -0,0 +1,5 @@ +export type TBrand = { + brandId: number; + brand: string | null; + isStock: boolean; +}; diff --git a/packages/database/src/models/BrandedPart.d.ts b/packages/database/src/models/BrandedPart.d.ts new file mode 100644 index 000000000..6ebf774f6 --- /dev/null +++ b/packages/database/src/models/BrandedPart.d.ts @@ -0,0 +1,10 @@ +export type BrandedPartType = { + brandedPartId: number; + partyTypeId: number; + modelId: number; + mfgDate: Date; + qtyAvailable: number; + retailPrice: number; + maxItemWear: number | null; + engineBlockFamilyId: number; +}; diff --git a/packages/database/src/models/Model.d.ts b/packages/database/src/models/Model.d.ts new file mode 100644 index 000000000..f61604b3f --- /dev/null +++ b/packages/database/src/models/Model.d.ts @@ -0,0 +1,30 @@ +export type TModel = { + modelId: number; + brandId: number; + eModel: string | null; + gModel: string | null; + fModel: string | null; + sModel: string | null; + iModel: string | null; + jModel: string | null; + swModel: string | null; + bModel: string | null; + eExtraInfo: string | null; + gExtraInfo: string | null; + fExtraInfo: string | null; + sExtraInfo: string | null; + iExtraInfo: string | null; + jExtraInfo: string | null; + swExtraInfo: string | null; + bExtraInfo: string | null; + eShortModel: string | null; + gShortModel: string | null; + fShortModel: string | null; + sShortModel: string | null; + iShortModel: string | null; + jShortModel: string | null; + swShortModel: string | null; + bShortModel: string | null; + debug_string: string | null; + debug_sort_string: string | null; +}; diff --git a/packages/database/src/models/Part.d.ts b/packages/database/src/models/Part.d.ts new file mode 100644 index 000000000..a17b488d9 --- /dev/null +++ b/packages/database/src/models/Part.d.ts @@ -0,0 +1,12 @@ +export type TPart = { + partId: number; + parentPartId: number | null; + brandedPartId: number; + percentDamage: number; + itemWear: number; + attachmentPointId: number | null; + ownerID: number | null; + partName: string | null; + repairCost: number; + scrapValue: number; +}; diff --git a/packages/database/src/models/VehiclePartTree.d.ts b/packages/database/src/models/VehiclePartTree.d.ts new file mode 100644 index 000000000..6098d1dc8 --- /dev/null +++ b/packages/database/src/models/VehiclePartTree.d.ts @@ -0,0 +1,57 @@ +/// +import type { TPart } from "./Part.js"; +export type TVehicle = { + vehicleId: number; + skinId: number; + flags: number; + class: number; + infoSetting: number; + damageInfo: Buffer | null; +}; +export type VehiclePartTreeType = { + vehicleId: number; + skinId: number; + flags: number; + class: number; + infoSetting: number; + damageInfo: Buffer | null; + isStock: boolean; + ownedLotId: number | null; + ownerID: number | null; + partId: number; + parentPartId: null; + brandedPartId: number; + partTree: { + level1: { + partId: number; + parts: TPart[]; + }; + level2: { + partId: number; + parts: TPart[]; + }; + }; +}; +export declare function savePart(part: TPart): Promise; +export declare function saveVehicle( + vehiclePartTree: VehiclePartTreeType, +): Promise; +export declare function saveVehiclePartTree( + vehiclePartTree: VehiclePartTreeType, +): Promise; +export declare function buildVehiclePartTreeFromDB( + vehicleId: number, +): Promise; +export declare function buildVehiclePartTree({ + brandedPartId, + skinId, + ownedLotId, + ownerID, + isStock, +}: { + brandedPartId: number; + skinId: number; + ownedLotId?: number; + ownerID?: number; + isStock: boolean; +}): Promise; diff --git a/packages/database/src/models/VehiclePartTree.ts b/packages/database/src/models/VehiclePartTree.ts index 9834476b3..4d1e8b328 100644 --- a/packages/database/src/models/VehiclePartTree.ts +++ b/packages/database/src/models/VehiclePartTree.ts @@ -1,8 +1,8 @@ -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../../shared"; import * as Sentry from "@sentry/node"; import { setVehiclePartTree } from "../cache.js"; import { getSlonik } from "../services/database.js"; -import { TPart } from "./Part.js"; +import type { TPart } from "./Part.js"; const level1PartTypes = [1001, 2001, 4001, 5001, 6001, 15001, 36001, 37001]; diff --git a/packages/database/src/services/admin.d.ts b/packages/database/src/services/admin.d.ts new file mode 100644 index 000000000..f5ba25500 --- /dev/null +++ b/packages/database/src/services/admin.d.ts @@ -0,0 +1,17 @@ +export declare function createNewCar( + brandedPartId: number, + skinId: number, + newCarOwnerId: number, +): Promise; +export type DBPart = { + partId: number; + parentPartId: number; + brandedPartId: number; + percentDamage: number; + itemWear: number; + attachmentPointId: number; + ownerId: number; + partName: string; + repairCost: number; + scrapValue: number; +}; diff --git a/packages/database/src/services/admin.ts b/packages/database/src/services/admin.ts index 6ab8394f3..72b158d30 100644 --- a/packages/database/src/services/admin.ts +++ b/packages/database/src/services/admin.ts @@ -1,4 +1,4 @@ -import { DatabaseTransactionConnection } from "slonik"; +import type { DatabaseTransactionConnection } from "slonik"; import { getSlonik } from "./database.js"; import * as Sentry from "@sentry/node"; @@ -136,7 +136,7 @@ export async function createNewCar( SELECT b.brandedpartid, a.attachmentpointid From StockAssembly a inner join brandedpart b on a.childbrandedpartid = b.brandedpartid - where a.parentbrandedpartid = ${tmpParts[0].brandedPartId} + where a.parentbrandedpartid = ${tmpParts[0] ? tmpParts[0].brandedPartId : null} `); }, ); @@ -176,6 +176,10 @@ export async function createNewCar( let parentPartId = null; let currentPartId = await getNextSq("part_partid_seq"); + if (typeof tmpParts[0] === "undefined") { + throw Error("currentPartId is null"); + } + // Make sure the first part's branded part id is not null if (tmpParts[0].brandedPartId === null) { throw Error("The first part's branded part id is null"); @@ -230,17 +234,21 @@ export async function createNewCar( console.log("currentPartId"); console.dir(currentPartId); + if (typeof tmpParts[i] === "undefined") { + throw Error("currentPartId is null"); + } await addPart( connection, currentPartId, parentPartId, - tmpParts[i], + tmpParts[i] as partTableEntry, newCarOwnerId, ); // Update the partid of the part in the tmpParts array - tmpParts[i].partId = currentPartId; - tmpParts[i].parentPartId = parentPartId; + (tmpParts[i] as partTableEntry).partId = currentPartId; + (tmpParts[i] as partTableEntry).parentPartId = + parentPartId; } }); }, diff --git a/packages/database/src/services/database.d.ts b/packages/database/src/services/database.d.ts new file mode 100644 index 000000000..502b9ec76 --- /dev/null +++ b/packages/database/src/services/database.d.ts @@ -0,0 +1,5 @@ +import { type DatabasePool, createSqlTag } from "slonik"; +export declare function getSlonik(): Promise<{ + slonik: DatabasePool; + sql: ReturnType; +}>; diff --git a/packages/database/src/services/database.ts b/packages/database/src/services/database.ts index 6f912ce06..033de45e3 100644 --- a/packages/database/src/services/database.ts +++ b/packages/database/src/services/database.ts @@ -1,4 +1,4 @@ -import { createPool, DatabasePool, createSqlTag } from "slonik"; +import { createPool, type DatabasePool, createSqlTag } from "slonik"; import { z } from "zod"; let slonik: DatabasePool; diff --git a/packages/database/test/Database.test.d.ts b/packages/database/test/Database.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/database/test/Database.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/database/test/Database.test.ts b/packages/database/test/Database.test.ts index afa0d556f..29cafcfd3 100644 --- a/packages/database/test/Database.test.ts +++ b/packages/database/test/Database.test.ts @@ -4,7 +4,7 @@ import { fetchSessionKeyByCustomerId, fetchSessionKeyByConnectionId, updateUser, -} from "@rustymotors/database"; +} from "../../database"; describe("Database", () => { describe("fetchSessionKeyByCustomerId", () => { diff --git a/packages/gateway/src/GatewayServer.d.ts b/packages/gateway/src/GatewayServer.d.ts new file mode 100644 index 000000000..0e16d58f9 --- /dev/null +++ b/packages/gateway/src/GatewayServer.d.ts @@ -0,0 +1,121 @@ +/// +/// +import { Socket } from "node:net"; +import { Configuration, type TServerLogger } from "../../shared"; +import { ConsoleThread } from "../../cli/ConsoleThread.js"; +/** + * @module gateway + */ +export type TGatewayOptions = { + config?: Configuration; + log: TServerLogger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log: TServerLogger; + }) => void; +}; +/** + * Gateway server + * @see {@link getGatewayServer()} to get a singleton instance + */ +export declare class Gateway { + config: Configuration; + log: TServerLogger; + timer: NodeJS.Timeout | null; + loopInterval: number; + status: string; + consoleEvents: string[]; + backlogAllowedCount: number; + listeningPortList: number[]; + servers: import("node:net").Server[]; + socketconnection: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log: TServerLogger; + }) => void; + static _instance: Gateway | undefined; + webServer: import("fastify").FastifyInstance | undefined; + readThread: ConsoleThread | undefined; + /** + * Creates an instance of GatewayServer. + * @param {TGatewayOptions} options + */ + constructor({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, + }: TGatewayOptions); + /** + * Delete the GatewayServer instance + */ + static deleteInstance(): void; + /** + * Assert that the listeningPortList is not empty + * @param {number[]} listeningPortList + * @throws {Error} If the listeningPortList is empty + */ + private verifyPortListIsNotEmpty; + /** + * @return {import("fastify").FastifyInstance} + */ + getWebServer(): import("fastify").FastifyInstance; + start(): Promise; + restart(): Promise; + exit(): Promise; + stop(): Promise; + /** + * @param {string} event + */ + handleReadThreadEvent(event: string): void; + init(): Promise; + help(): void; + run(): void; + /** + * + * @param {TGatewayOptions} options + * @returns {Gateway} + * @memberof Gateway + */ + static getInstance({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, + }: TGatewayOptions): Gateway; + shutdown(): void; +} +/** + * Get a singleton instance of GatewayServer + * + * @param {TGatewayOptions} options + * @returns {Gateway} + */ +export declare function getGatewayServer({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, +}: { + config?: Configuration; + log: TServerLogger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log: TServerLogger; + }) => void; +}): Gateway; diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index c435c462b..c58483e47 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -7,8 +7,8 @@ import { addOnDataHandler, createInitialState, fetchStateFromDatabase, - TServerLogger, -} from "@rustymotors/shared"; + type TServerLogger, +} from "../../shared"; import { ConsoleThread } from "../../cli/ConsoleThread.js"; import { addWebRoutes } from "./web.js"; diff --git a/packages/gateway/src/encryption.d.ts b/packages/gateway/src/encryption.d.ts new file mode 100644 index 000000000..33c2bd93c --- /dev/null +++ b/packages/gateway/src/encryption.d.ts @@ -0,0 +1,27 @@ +import { McosEncryptionPair } from "../../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 + */ +export declare function createCommandEncryptionPair( + key: string, +): McosEncryptionPair; +/** + * This function creates a new encryption pair for use with the database server + * + * @param {string} key The key to use for encryption + * @returns {McosEncryptionPair} The encryption pair + * @throws Error if the key is too short + */ +export declare function createDataEncryptionPair( + key: string, +): McosEncryptionPair; +/** + * This function checks if the server supports the legacy ciphers + * + * @returns void + * @throws Error if the server does not support the legacy ciphers + */ +export declare function verifyLegacyCipherSupport(): void; diff --git a/packages/gateway/src/encryption.ts b/packages/gateway/src/encryption.ts index f597f212f..ac122870f 100644 --- a/packages/gateway/src/encryption.ts +++ b/packages/gateway/src/encryption.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { createCipheriv, createDecipheriv, getCiphers } from "node:crypto"; -import { McosEncryptionPair } from "@rustymotors/shared"; +import { McosEncryptionPair } from "../../shared"; /** * This function creates a new encryption pair for use with the game server diff --git a/packages/gateway/src/index.d.ts b/packages/gateway/src/index.d.ts new file mode 100644 index 000000000..7d53ff627 --- /dev/null +++ b/packages/gateway/src/index.d.ts @@ -0,0 +1,86 @@ +/// +/// +/// +import { type TServerLogger } from "../../shared"; +import { ServerLogger } from "../../shared"; +import { Socket } from "node:net"; +import { GameMessage as OldGameMessage } from "../../nps/index.js"; +import type { SocketCallback } from "../../nps/messageProcessors/index.js"; +/** + * @typedef {object} OnDataHandlerArgs + * @property {object} args + * @property {string} args.connectionId The connection id of the socket that + * received the data. + * @property {module:packages/shared/RawMessage} args.message The data that was received. + * @property {module:shared/log.ServerLogger} args.log + * response + * to the + * data. + */ +/** + * @typedef {function} OnDataHandler + * @param {OnDataHandlerArgs} args The arguments for the handler. + * @returns {ServiceResponse} The + * response + * to the + * data. + */ +/** + * Handle socket errors + */ +export declare function socketErrorHandler({ + connectionId, + error, + log, +}: { + connectionId: string; + error: NodeJS.ErrnoException; + log: TServerLogger; +}): void; +/** + * Handle the end of a socket connection + * + * @param {object} options + * @param {string} options.connectionId The connection ID + * @param {ServerLogger} options.log The logger to use + */ +export declare function socketEndHandler({ + connectionId, + log, +}: { + connectionId: string; + log: ServerLogger; +}): void; +/** + * Handle incoming TCP connections + * + * @param {object} options + * @param {module:net.Socket} options.incomingSocket The incoming socket + * @param {ServerLogger} options.log The logger to use + * + */ +export declare function onSocketConnection({ + incomingSocket, + log, +}: { + incomingSocket: Socket; + log: TServerLogger; +}): void; +export declare function processGameMessage( + connectionId: string, + message: OldGameMessage, + log: TServerLogger, + socketCallback: SocketCallback, +): void; +export declare function handleGameMessage( + connectionId: string, + bytes: Buffer, + log: TServerLogger, + socketCallback: SocketCallback, +): void; +export declare function handleServerMessage( + connectionId: string, + bytes: Buffer, + log: ServerLogger, + socketCallback: SocketCallback, +): void; diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index b26b95420..56c07c372 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -16,19 +16,19 @@ import { randomUUID } from "node:crypto"; import { - OnDataHandler, - TServerLogger, + type OnDataHandler, + type TServerLogger, addSocket, fetchStateFromDatabase, getOnDataHandler, removeSocket, wrapSocket, -} from "@rustymotors/shared"; +} from "../../shared"; -import { ServerLogger } from "@rustymotors/shared"; +import { ServerLogger } from "../../shared"; import { Socket } from "node:net"; -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; import { MessageProcessorError, @@ -36,10 +36,10 @@ import { getPortMessageType, GameMessage as OldGameMessage, } from "../../nps/index.js"; -import { SocketCallback } from "../../nps/messageProcessors/index.js"; +import type { SocketCallback } from "../../nps/messageProcessors/index.js"; import { getAsHex } from "../../nps/utils/pureGet.js"; -import { ServiceResponse } from "@rustymotors/shared"; -import { GameMessage } from "@rustymotors/shared-packets"; +import type { ServiceResponse } from "../../shared"; +import { GameMessage } from "../../shared-packets"; /** * @typedef {object} OnDataHandlerArgs diff --git a/packages/gateway/src/web.d.ts b/packages/gateway/src/web.d.ts new file mode 100644 index 000000000..d2b575a73 --- /dev/null +++ b/packages/gateway/src/web.d.ts @@ -0,0 +1,8 @@ +/** + * Add web routes to the web server + * + * @param {import("fastify").FastifyInstance} webServer The web server + */ +export declare function addWebRoutes( + webServer: import("fastify").FastifyInstance, +): Promise; diff --git a/packages/gateway/src/web.ts b/packages/gateway/src/web.ts index 32df7aad6..af6ef1866 100644 --- a/packages/gateway/src/web.ts +++ b/packages/gateway/src/web.ts @@ -16,7 +16,7 @@ import { CastanetResponse } from "../../patch/src/PatchServer.js"; import { generateShardList } from "../../shard/src/ShardServer.js"; -import { getServerConfiguration } from "@rustymotors/shared"; +import { getServerConfiguration } from "../../shared"; import { handleGetCert, handleGetKey, diff --git a/packages/gateway/test/GatewayServer.test.d.ts b/packages/gateway/test/GatewayServer.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/gateway/test/GatewayServer.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/gateway/test/GatewayServer.test.ts b/packages/gateway/test/GatewayServer.test.ts index bf7539304..e7a3f5a8b 100644 --- a/packages/gateway/test/GatewayServer.test.ts +++ b/packages/gateway/test/GatewayServer.test.ts @@ -1,4 +1,4 @@ -import { TServerLogger } from "@rustymotors/shared"; +import type { TServerLogger } from "../../shared"; import { Gateway, getGatewayServer } from "../src/GatewayServer.js"; import type { TGatewayOptions } from "../src/GatewayServer.js"; import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; diff --git a/packages/gateway/test/encryption.test.d.ts b/packages/gateway/test/encryption.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/gateway/test/encryption.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/gateway/test/encryption.test.ts b/packages/gateway/test/encryption.test.ts index 978cf9b78..4e92efd39 100644 --- a/packages/gateway/test/encryption.test.ts +++ b/packages/gateway/test/encryption.test.ts @@ -6,11 +6,11 @@ import { import { Socket } from "node:net"; import { McosEncryption, - State, + type State, addEncryption, createInitialState, getEncryption, -} from "@rustymotors/shared"; +} from "../../shared"; import { randomUUID } from "node:crypto"; let testSave: (state: State) => void; diff --git a/packages/gateway/test/socketErrorHandler.test.d.ts b/packages/gateway/test/socketErrorHandler.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/gateway/test/socketErrorHandler.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/gateway/test/socketErrorHandler.test.ts b/packages/gateway/test/socketErrorHandler.test.ts index 7f22206ce..d4a1fef1f 100644 --- a/packages/gateway/test/socketErrorHandler.test.ts +++ b/packages/gateway/test/socketErrorHandler.test.ts @@ -1,4 +1,4 @@ -import { TServerLogger } from "@rustymotors/shared"; +import type { TServerLogger } from "../../shared"; import { socketErrorHandler } from "../src/index.js"; import { describe, it, expect, vi } from "vitest"; diff --git a/packages/interfaces/index.d.ts b/packages/interfaces/index.d.ts index 2c0f6a3c5..570067c12 100644 --- a/packages/interfaces/index.d.ts +++ b/packages/interfaces/index.d.ts @@ -1,11 +1,7 @@ import { Socket } from "node:net"; import { Cipher, Decipher } from "node:crypto"; import { IncomingMessage, ServerResponse } from "node:http"; -import { - ServerError, - SerializedBuffer, - Configuration, -} from "@rustymotors/shared"; +import { ServerError, SerializedBuffer, Configuration } from "../../shared"; /** * @module interfaces diff --git a/packages/lobby/src/LoginInfoMessage.d.ts b/packages/lobby/src/LoginInfoMessage.d.ts new file mode 100644 index 000000000..d89908696 --- /dev/null +++ b/packages/lobby/src/LoginInfoMessage.d.ts @@ -0,0 +1,24 @@ +/// +import { LegacyMessage } from "../../shared"; +export declare class LoginInfoMessage extends LegacyMessage { + _userId: number; + _userName: string; + _userData: Buffer; + _customerId: number; + _flags: number; + _dllVersion: string; + _hostname: string; + _idAddress: string; + _hashKey: Buffer; + constructor(); + /** + * @param {Buffer} buffer + * @returns {LoginInfoMessage} + */ + deserialize(buffer: Buffer): LoginInfoMessage; + /** + * @returns {Buffer} + */ + serialize(): Buffer; + toString(): string; +} diff --git a/packages/lobby/src/LoginInfoMessage.ts b/packages/lobby/src/LoginInfoMessage.ts index 4504daf87..3c82cdb68 100644 --- a/packages/lobby/src/LoginInfoMessage.ts +++ b/packages/lobby/src/LoginInfoMessage.ts @@ -2,7 +2,7 @@ import { LegacyMessage, deserializeString, serializeString, -} from "@rustymotors/shared"; +} from "../../shared"; export class LoginInfoMessage extends LegacyMessage { _userId: number; diff --git a/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.d.ts b/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.d.ts new file mode 100644 index 000000000..cfe7e53e7 --- /dev/null +++ b/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.d.ts @@ -0,0 +1,14 @@ +/** + * Commands from the game client to the game server + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +/** + * Commands from the game client to the game server + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +import type { GameMessageOpCode } from "../../interfaces/index.js"; +export declare const NPS_LOBBYCLIENT_COMMANDS: GameMessageOpCode[]; diff --git a/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts b/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts index ca9ce169d..ca1e94527 100644 --- a/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts +++ b/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts @@ -5,7 +5,13 @@ * @type {TNPS_COMMAND_MAP[]} */ -import { GameMessageOpCode } from "../../interfaces/index.js"; +/** + * Commands from the game client to the game server + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +import type { GameMessageOpCode } from "../../interfaces/index.js"; export const NPS_LOBBYCLIENT_COMMANDS: GameMessageOpCode[] = [ { name: "NPS_LOGIN", value: 256, module: "Lobby" }, diff --git a/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.d.ts b/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.d.ts new file mode 100644 index 000000000..61af57585 --- /dev/null +++ b/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.d.ts @@ -0,0 +1,8 @@ +import type { GameMessageOpCode } from "../../interfaces/index.js"; +/** + * Commands from the game server to the game client + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +export declare const NPS_LOBBYSERVER_COMMANDS: GameMessageOpCode[]; diff --git a/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts b/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts index 486a3a096..10b70eb76 100644 --- a/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts +++ b/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts @@ -1,4 +1,4 @@ -import { GameMessageOpCode } from "../../interfaces/index.js"; +import type { GameMessageOpCode } from "../../interfaces/index.js"; /** * Commands from the game server to the game client diff --git a/packages/lobby/src/NPS_LOBBY_COMMANDS.d.ts b/packages/lobby/src/NPS_LOBBY_COMMANDS.d.ts new file mode 100644 index 000000000..1946d7d07 --- /dev/null +++ b/packages/lobby/src/NPS_LOBBY_COMMANDS.d.ts @@ -0,0 +1,7 @@ +import type { GameMessageOpCode } from "../../interfaces/index.js"; +/** + * @export + * @readonly + * @type {NpsCommandMap[]} + */ +export declare const NPS_LOBBY_COMMANDS: GameMessageOpCode[]; diff --git a/packages/lobby/src/NPS_LOBBY_COMMANDS.ts b/packages/lobby/src/NPS_LOBBY_COMMANDS.ts index 1379582dc..3012b619a 100644 --- a/packages/lobby/src/NPS_LOBBY_COMMANDS.ts +++ b/packages/lobby/src/NPS_LOBBY_COMMANDS.ts @@ -1,4 +1,4 @@ -import { GameMessageOpCode } from "../../interfaces/index.js"; +import type { GameMessageOpCode } from "../../interfaces/index.js"; import { NPS_LOBBYCLIENT_COMMANDS } from "./NPS_LOBBYCLIENT_COMMANDS.js"; import { NPS_LOBBYSERVER_COMMANDS } from "./NPS_LOBBYSERVER_COMMANDS.js"; diff --git a/packages/lobby/src/UserInfoMessage.d.ts b/packages/lobby/src/UserInfoMessage.d.ts new file mode 100644 index 000000000..470b7cbfa --- /dev/null +++ b/packages/lobby/src/UserInfoMessage.d.ts @@ -0,0 +1,33 @@ +/// +import { LegacyMessage } from "../../shared"; +import { LoginInfoMessage } from "./LoginInfoMessage.js"; +export declare class UserInfo { + _userId: number; + _userName: string; + _userData: Buffer; + constructor(); + deserialize(buffer: Buffer): this; + serialize(): Buffer; + size(): number; +} +export declare class UserInfoMessage extends LegacyMessage { + _userId: number; + _userName: string; + _userData: Buffer; + constructor(); + /** + * @param {Buffer} buffer + * @returns {UserInfoMessage} + */ + deserialize(buffer: Buffer): this; + /** + * @returns {Buffer} + */ + serialize(): Buffer; + /** + * @param {LoginInfoMessage} loginInfoMessage + */ + fromLoginInfoMessage(loginInfoMessage: LoginInfoMessage): this; + calculateLength(): any; + toString(): string; +} diff --git a/packages/lobby/src/UserInfoMessage.ts b/packages/lobby/src/UserInfoMessage.ts index abf4d1f6d..1eabbbb2f 100644 --- a/packages/lobby/src/UserInfoMessage.ts +++ b/packages/lobby/src/UserInfoMessage.ts @@ -2,7 +2,7 @@ import { LegacyMessage, deserializeString, serializeString, -} from "@rustymotors/shared"; +} from "../../shared"; import { LoginInfoMessage } from "./LoginInfoMessage.js"; export class UserInfo { diff --git a/packages/lobby/src/handlers/_setMyUserData.d.ts b/packages/lobby/src/handlers/_setMyUserData.d.ts new file mode 100644 index 000000000..fb0e5f3ec --- /dev/null +++ b/packages/lobby/src/handlers/_setMyUserData.d.ts @@ -0,0 +1,13 @@ +import { ServerLogger, LegacyMessage } from "../../shared"; +export declare function _setMyUserData({ + connectionId, + message, + log, +}: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; +}): Promise<{ + connectionId: string; + message: LegacyMessage; +}>; diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 0751abc1d..439765dd6 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -1,6 +1,6 @@ -import { ServerLogger, LegacyMessage } from "@rustymotors/shared"; +import { ServerLogger, LegacyMessage } from "../../../shared"; import { UserInfo } from "../UserInfoMessage.js"; -import { updateUser } from "@rustymotors/database"; +import { updateUser } from "../../../database"; export async function _setMyUserData({ connectionId, diff --git a/packages/lobby/src/handlers/encryptedCommand.d.ts b/packages/lobby/src/handlers/encryptedCommand.d.ts new file mode 100644 index 000000000..8fc1eccac --- /dev/null +++ b/packages/lobby/src/handlers/encryptedCommand.d.ts @@ -0,0 +1,71 @@ +import { ServerLogger, LegacyMessage, SerializedBuffer } from "../../shared"; +/** + * Array of supported command handlers + * + * @type {{ + * opCode: number, + * name: string, + * handler: (args: { + * connectionId: string, + * message: SerializedBuffer, + * log: ServerLogger, + * }) => Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>}[]} + */ +export declare const messageHandlers: { + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; +}[]; +export type NpsCommandHandler = { + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; + }) => Promise<{ + connectionId: string; + message: LegacyMessage; + }>; +}; +/** + * + * + * @param {object} args + * @param {string} args.connectionId + * @param {SerializedBuffer} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ +* connectionId: string, +* messages: SerializedBuffer[], +* }>} + + */ +export declare function handleEncryptedNPSCommand({ + connectionId, + message, + log, +}: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; +export declare const channelRecordSize = 40; +export declare const channels: { + id: number; + name: string; + population: number; +}[]; diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index 51c94de05..922423e2b 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -6,7 +6,7 @@ import { LegacyMessage, MessageBuffer, SerializedBuffer, -} from "@rustymotors/shared"; +} from "../../../shared"; import { handleSendMiniRiffList } from "./handleSendMiniRiffList.js"; import { handleGetMiniUserList } from "./handleGetMiniUserList.js"; import { _setMyUserData } from "./_setMyUserData.js"; diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.d.ts b/packages/lobby/src/handlers/handleGetMiniUserList.d.ts new file mode 100644 index 000000000..e03c4f290 --- /dev/null +++ b/packages/lobby/src/handlers/handleGetMiniUserList.d.ts @@ -0,0 +1,19 @@ +import { ServerLogger, LegacyMessage } from "../../shared"; +/** + * @param {object} args + * @param {string} args.connectionId + * @param {LegacyMessage} args.message + * @param {ServerLogger} args.log + */ +export declare function handleGetMiniUserList({ + connectionId, + message, + log, +}: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; +}): Promise<{ + connectionId: string; + message: LegacyMessage; +}>; diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.ts b/packages/lobby/src/handlers/handleGetMiniUserList.ts index bf7c26d51..ad25ac88b 100644 --- a/packages/lobby/src/handlers/handleGetMiniUserList.ts +++ b/packages/lobby/src/handlers/handleGetMiniUserList.ts @@ -3,7 +3,7 @@ import { GameMessage, LegacyMessage, serializeString, -} from "@rustymotors/shared"; +} from "../../../shared"; import { UserInfo } from "../UserInfoMessage.js"; import { channelRecordSize, channels } from "./encryptedCommand.js"; diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.d.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.d.ts new file mode 100644 index 000000000..4d277e89e --- /dev/null +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.d.ts @@ -0,0 +1,19 @@ +import { ServerLogger, LegacyMessage } from "../../shared"; +/** + * @param {object} args + * @param {string} args.connectionId + * @param {LegacyMessage} args.message + * @param {ServerLogger} args.log + */ +export declare function handleSendMiniRiffList({ + connectionId, + message, + log, +}: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; +}): Promise<{ + connectionId: string; + message: LegacyMessage; +}>; diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.ts index 6bf80f094..6cd4917fe 100644 --- a/packages/lobby/src/handlers/handleSendMiniRiffList.ts +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.ts @@ -3,7 +3,7 @@ import { GameMessage, LegacyMessage, serializeString, -} from "@rustymotors/shared"; +} from "../../../shared"; import { channelRecordSize, channels } from "./encryptedCommand.js"; // const users = [user1]; diff --git a/packages/lobby/src/handlers/handleTrackingPing.d.ts b/packages/lobby/src/handlers/handleTrackingPing.d.ts new file mode 100644 index 000000000..79fb8faa6 --- /dev/null +++ b/packages/lobby/src/handlers/handleTrackingPing.d.ts @@ -0,0 +1,13 @@ +import { ServerLogger, SerializedBuffer } from "../../shared"; +export declare function handleTrackingPing({ + connectionId, + message, + log, +}: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/lobby/src/handlers/handleTrackingPing.ts b/packages/lobby/src/handlers/handleTrackingPing.ts index 7f6552b56..6fed3ee44 100644 --- a/packages/lobby/src/handlers/handleTrackingPing.ts +++ b/packages/lobby/src/handlers/handleTrackingPing.ts @@ -1,4 +1,4 @@ -import { ServerLogger, SerializedBuffer } from "@rustymotors/shared"; +import { ServerLogger, SerializedBuffer } from "../../../shared"; export async function handleTrackingPing({ connectionId, diff --git a/packages/lobby/src/handlers/requestConnectGameServer.d.ts b/packages/lobby/src/handlers/requestConnectGameServer.d.ts new file mode 100644 index 000000000..95196f528 --- /dev/null +++ b/packages/lobby/src/handlers/requestConnectGameServer.d.ts @@ -0,0 +1,28 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * Convert to zero padded hex + * + * @export + * @param {Buffer} data + * @return {string} + */ +export declare function toHex(data: Buffer): string; +/** + * Handle a request to connect to a game server packet + * + * @private + * @param {import("../../../interfaces/index.js").ServiceArgs} args + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>} + */ +export declare function _npsRequestGameConnectServer({ + connectionId, + message, + log, +}: import("../../../interfaces/index.js").ServiceArgs): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index a514dba04..60da76fdd 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -1,5 +1,5 @@ import { getPersonasByPersonaId } from "../../../persona/src/getPersonasByPersonaId.js"; -import { fetchSessionKeyByCustomerId } from "@rustymotors/database"; +import { fetchSessionKeyByCustomerId } from "../../../database"; import { LoginInfoMessage } from "../LoginInfoMessage.js"; import { UserInfoMessage } from "../UserInfoMessage.js"; @@ -13,7 +13,7 @@ import { fetchStateFromDatabase, getEncryption, SerializedBuffer, -} from "@rustymotors/shared"; +} from "../../../shared"; /** * Convert to zero padded hex diff --git a/packages/lobby/src/internal.d.ts b/packages/lobby/src/internal.d.ts new file mode 100644 index 000000000..74c2353cb --- /dev/null +++ b/packages/lobby/src/internal.d.ts @@ -0,0 +1,51 @@ +import { ServerLogger, SerializedBuffer } from "../../shared"; +/** + * Array of supported message handlers + * + * @type {{ + * opCode: number, + * name: string, + * handler: (args: { + * connectionId: string, + * message: SerializedBuffer, + * log: ServerLogger, + * }) => Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>}[]} + */ +export declare const messageHandlers: { + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; +}[]; +/** + * @param {object} args + * @param {string} args.connectionId + * @param {SerializedBuffer} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>} + * @throws {Error} Unknown code was received + */ +export declare function receiveLobbyData({ + connectionId, + message, + log, +}: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index 8a9a45339..8ca552464 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -21,7 +21,7 @@ import { LegacyMessage, NPSMessage, SerializedBuffer, -} from "@rustymotors/shared"; +} from "../../shared"; import { handleTrackingPing } from "./handlers/handleTrackingPing.js"; /** diff --git a/packages/lobby/test/handlers/handleSendMiniRiffList.test.d.ts b/packages/lobby/test/handlers/handleSendMiniRiffList.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/lobby/test/handlers/handleSendMiniRiffList.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts b/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts index 437b72835..171341079 100644 --- a/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts +++ b/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts @@ -1,6 +1,6 @@ import { handleSendMiniRiffList } from "../../src/handlers/handleSendMiniRiffList.js"; import { describe, it, expect } from "vitest"; -import { LegacyMessage } from "@rustymotors/shared"; +import { LegacyMessage } from "../../../shared"; import { mockLogger } from "../../../../test/factoryMocks.js"; describe("handleSendMiniRiffList", () => { diff --git a/packages/login/src/NPSUserStatus.d.ts b/packages/login/src/NPSUserStatus.d.ts new file mode 100644 index 000000000..e95d79cec --- /dev/null +++ b/packages/login/src/NPSUserStatus.d.ts @@ -0,0 +1,62 @@ +/// +import { LegacyMessage, Configuration, ServerLogger } from "../../shared"; +/** + * @typedef {Configuration} Configuration + */ +/** + * + * + * @export + * @typedef {object} NPSMessageValues + * @property {number} msgNo + * @property {number} msgVersion + * @property {number} reserved + * @property {Buffer} content + * @property {number} msgLength + * @property {"sent" | "received"} direction + * @property {string} serviceName + */ +/** + * + * @class NPSUserStatus + * @property {string} sessionKey + * @property {string} opCode + * @property {Buffer} buffer + */ +export declare class NPSUserStatus extends LegacyMessage { + _config: Configuration; + log: ServerLogger; + sessionKey: string; + opCode: number; + contextId: string; + buffer: Buffer; + /** + * + * @param {Buffer} packet + * @param {Configuration} config + * @param {ServerLogger} log + */ + constructor(packet: Buffer, config: Configuration, log: ServerLogger); + /** + * ExtractSessionKeyFromPacket + * + * Take 128 bytes + * They are the utf-8 of the hex bytes that are the key + * + * @param {Buffer} rawPacket + * @return {void} + */ + extractSessionKeyFromPacket(rawPacket: Buffer): void; + toJSON(): { + msgNo: number; + msgLength: any; + content: string; + contextId: string; + sessionKey: string; + rawBuffer: string; + }; + /** + * @return {string} + */ + dumpPacket(): string; +} diff --git a/packages/login/src/NPSUserStatus.ts b/packages/login/src/NPSUserStatus.ts index 0448da14d..c733c14e1 100644 --- a/packages/login/src/NPSUserStatus.ts +++ b/packages/login/src/NPSUserStatus.ts @@ -1,11 +1,7 @@ import { privateDecrypt } from "node:crypto"; import { readFileSync } from "node:fs"; -import { - LegacyMessage, - Configuration, - ServerLogger, -} from "@rustymotors/shared"; +import { LegacyMessage, Configuration, ServerLogger } from "../../shared"; /** * @typedef {Configuration} Configuration diff --git a/packages/login/src/NPS_LOGINCLIENT_COMMANDS.d.ts b/packages/login/src/NPS_LOGINCLIENT_COMMANDS.d.ts new file mode 100644 index 000000000..9a10a756e --- /dev/null +++ b/packages/login/src/NPS_LOGINCLIENT_COMMANDS.d.ts @@ -0,0 +1,14 @@ +/** + * Commands from the game client to the login server + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +/** + * Commands from the game client to the login server + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +import type { GameMessageOpCode } from "../../interfaces/index.js"; +export declare const NPS_LOGINCLIENT_COMMANDS: GameMessageOpCode[]; diff --git a/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts b/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts index f0fa79993..97a4e60c2 100644 --- a/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts +++ b/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts @@ -5,7 +5,13 @@ * @type {TNPS_COMMAND_MAP[]} */ -import { GameMessageOpCode } from "../../interfaces/index.js"; +/** + * Commands from the game client to the login server + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +import type { GameMessageOpCode } from "../../interfaces/index.js"; export const NPS_LOGINCLIENT_COMMANDS: GameMessageOpCode[] = [ { name: "NPS_USER_LOGIN", value: 1281, module: "Login" }, diff --git a/packages/login/src/NPS_LOGIN_COMMANDS.d.ts b/packages/login/src/NPS_LOGIN_COMMANDS.d.ts new file mode 100644 index 000000000..ac6660a46 --- /dev/null +++ b/packages/login/src/NPS_LOGIN_COMMANDS.d.ts @@ -0,0 +1,7 @@ +import type { GameMessageOpCode } from "../../interfaces/index.js"; +/** + * @export + * @readonly + * @type {TNPS_COMMAND_MAP[]} + */ +export declare const NPS_LOGIN_COMMANDS: GameMessageOpCode[]; diff --git a/packages/login/src/NPS_LOGIN_COMMANDS.ts b/packages/login/src/NPS_LOGIN_COMMANDS.ts index 407bc17ff..eebf30fe3 100644 --- a/packages/login/src/NPS_LOGIN_COMMANDS.ts +++ b/packages/login/src/NPS_LOGIN_COMMANDS.ts @@ -1,4 +1,4 @@ -import { GameMessageOpCode } from "../../interfaces/index.js"; +import type { GameMessageOpCode } from "../../interfaces/index.js"; import { NPS_LOGINCLIENT_COMMANDS } from "./NPS_LOGINCLIENT_COMMANDS.js"; /** diff --git a/packages/login/src/index.d.ts b/packages/login/src/index.d.ts new file mode 100644 index 000000000..281fe8a6f --- /dev/null +++ b/packages/login/src/index.d.ts @@ -0,0 +1,51 @@ +import type { ServerLogger, ServiceResponse, NPSMessage } from "../../shared"; +/** + * Please use {@link LoginServer.getInstance()} + */ +export declare class LoginServer { + _log: any; + static _instance: LoginServer | undefined; + /** + * Please use {@see LoginServer.getInstance} instead + * @param {object} options + * @param {ServerLogger} options.log + * @memberof LoginServer + */ + constructor({ log }: { log: ServerLogger }); + /** + * Get the single instance of the login server + * + * @static + * @param {ServerLogger} log + * @return {LoginServer} + */ + static getInstance(log: ServerLogger): LoginServer; + /** + * + * @param {string} contextId + * @return {import("../../interfaces/index.js").UserRecordMini} + */ + _npsGetCustomerIdByContextId( + contextId: string, + ): import("../../interfaces/index.js").UserRecordMini; +} +/** + * Entry and exit point of the Login service + * + * @export + * @param {object} args + * @param {string} args.connectionId + * @param {NPSMessage} args.message + * @param {ServerLogger} args.log + * + * @return {Promise} + */ +export declare function receiveLoginData({ + connectionId, + message, + log, +}: { + connectionId: string; + message: NPSMessage; + log: ServerLogger; +}): Promise; diff --git a/packages/login/src/index.ts b/packages/login/src/index.ts index a02747873..3a34d4a60 100644 --- a/packages/login/src/index.ts +++ b/packages/login/src/index.ts @@ -14,7 +14,22 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { ServerLogger, ServiceResponse, NPSMessage } from "@rustymotors/shared"; +// mcos is a game server, written from scratch, for an old game +// Copyright (C) <2017> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +import type { ServerLogger, ServiceResponse, NPSMessage } from "../../shared"; import { handleLoginData } from "./internal.js"; /** diff --git a/packages/login/src/internal.d.ts b/packages/login/src/internal.d.ts new file mode 100644 index 000000000..071192bdf --- /dev/null +++ b/packages/login/src/internal.d.ts @@ -0,0 +1,53 @@ +import { ServerLogger, SerializedBuffer } from "../../shared"; +/** + * Array of supported message handlers + * + * @type {{ + * opCode: number, + * name: string, + * handler: (args: { + * connectionId: string, + * message: SerializedBuffer, + * log: ServerLogger, + * }) => Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>}[]} + */ +export declare const messageHandlers: { + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; +}[]; +/** + * Entry and exit point of the Login service + * + * @export + * @param {object} args + * @param {string} args.connectionId + * @param {SerializedBuffer} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>} + */ +export declare function handleLoginData({ + connectionId, + message, + log, +}: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index bc8677364..79d838696 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -14,16 +14,16 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { getServerConfiguration } from "@rustymotors/shared"; +import { getServerConfiguration } from "../../shared"; import { NPSUserStatus } from "./NPSUserStatus.js"; -import { updateSessionKey } from "@rustymotors/database"; +import { updateSessionKey } from "../../database"; import { ServerLogger, NPSMessage, SerializedBuffer, NetworkMessage, -} from "@rustymotors/shared"; -import { UserRecordMini } from "../../interfaces/index.js"; +} from "../../shared"; +import type { UserRecordMini } from "../../interfaces/index.js"; const userRecords: UserRecordMini[] = [ { diff --git a/packages/login/src/premadeLogin.d.ts b/packages/login/src/premadeLogin.d.ts new file mode 100644 index 000000000..e90669ed1 --- /dev/null +++ b/packages/login/src/premadeLogin.d.ts @@ -0,0 +1,7 @@ +/** + * This is the response packet sent on the login port in response to a UserLogin + * + * @return {Buffer} + */ +/// +export declare function premadeLogin(): Buffer; diff --git a/packages/login/test/LoginServer.test.d.ts b/packages/login/test/LoginServer.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/login/test/LoginServer.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/nps/index.d.ts b/packages/nps/index.d.ts new file mode 100644 index 000000000..953cf6c37 --- /dev/null +++ b/packages/nps/index.d.ts @@ -0,0 +1,20 @@ +export { + MessageProcessorError, + gameMessageProcessors, + populateGameMessageProcessors, + getGameMessageProcessor, + PortMapError, + portToMessageTypes, + populatePortToMessageTypes, + getPortMessageType, +} from "./messageProcessors/index.js"; +export { GameMessage } from "./messageStructs/GameMessage.js"; +export { getWord } from "./utils/pureGet.js"; +export { processUserLogin } from "./messageProcessors/processUserLogin.js"; +export { + populateGameUsers, + getUser, + checkPassword, +} from "./services/account.js"; +export { generateToken } from "./services/token.js"; +export { createNewUserSession, setUserSession } from "./services/session.js"; diff --git a/packages/nps/messageProcessors/getLobMiniRiffList.d.ts b/packages/nps/messageProcessors/getLobMiniRiffList.d.ts new file mode 100644 index 000000000..5904579c1 --- /dev/null +++ b/packages/nps/messageProcessors/getLobMiniRiffList.d.ts @@ -0,0 +1,5 @@ +/// +export declare function getLobMiniRiffList( + commandId: number, + data: Buffer, +): Promise; diff --git a/packages/nps/messageProcessors/getLobMiniRiffList.ts b/packages/nps/messageProcessors/getLobMiniRiffList.ts index cd3d0db29..1e94dd7f4 100644 --- a/packages/nps/messageProcessors/getLobMiniRiffList.ts +++ b/packages/nps/messageProcessors/getLobMiniRiffList.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; import { GameMessage } from "../messageStructs/GameMessage.js"; import { MiniRiffInfo, MiniRiffList } from "../messageStructs/MiniRiffList.js"; import { getAsHex } from "../utils/pureGet.js"; diff --git a/packages/nps/messageProcessors/getLobMiniUserList.d.ts b/packages/nps/messageProcessors/getLobMiniUserList.d.ts new file mode 100644 index 000000000..9562aba75 --- /dev/null +++ b/packages/nps/messageProcessors/getLobMiniUserList.d.ts @@ -0,0 +1,5 @@ +/// +export declare function getLobMiniUserList( + commandId: number, + data: Buffer, +): Promise; diff --git a/packages/nps/messageProcessors/getLobMiniUserList.ts b/packages/nps/messageProcessors/getLobMiniUserList.ts index 105695356..26bab00c7 100644 --- a/packages/nps/messageProcessors/getLobMiniUserList.ts +++ b/packages/nps/messageProcessors/getLobMiniUserList.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; import { GameMessage } from "../messageStructs/GameMessage.js"; import { MiniUserInfo, MiniUserList } from "../messageStructs/MiniUserList.js"; import { getAsHex } from "../utils/pureGet.js"; diff --git a/packages/nps/messageProcessors/index.d.ts b/packages/nps/messageProcessors/index.d.ts new file mode 100644 index 000000000..249bfc55d --- /dev/null +++ b/packages/nps/messageProcessors/index.d.ts @@ -0,0 +1,28 @@ +/// +import { GameMessage } from "../messageStructs/GameMessage.js"; +export type SocketCallback = (messages: Buffer[]) => void; +export type MessageProcessor = ( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +) => Promise; +export declare class MessageProcessorError extends Error { + constructor(id: number, message: string); +} +export declare const gameMessageProcessors: Map; +export declare function populateGameMessageProcessors( + processors: Map, +): void; +export declare function getGameMessageProcessor( + messageId: number, +): MessageProcessor; +export declare class PortMapError extends Error { + port: number; + constructor(port: number, message: string); + toString(): string; +} +export declare const portToMessageTypes: Map; +export declare function populatePortToMessageTypes( + portMap: Map, +): void; +export declare function getPortMessageType(port: number): string; diff --git a/packages/nps/messageProcessors/lobbyCommands.d.ts b/packages/nps/messageProcessors/lobbyCommands.d.ts new file mode 100644 index 000000000..51b6d6db5 --- /dev/null +++ b/packages/nps/messageProcessors/lobbyCommands.d.ts @@ -0,0 +1,6 @@ +/// +export type lobbyCommandProcessor = ( + commandId: number, + data: Buffer, +) => Promise; +export declare const lobbyCommandMap: Map; diff --git a/packages/nps/messageProcessors/processCheckPlateText.d.ts b/packages/nps/messageProcessors/processCheckPlateText.d.ts new file mode 100644 index 000000000..b589108ef --- /dev/null +++ b/packages/nps/messageProcessors/processCheckPlateText.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processCheckPlateText( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processCheckPlateText.ts b/packages/nps/messageProcessors/processCheckPlateText.ts index 6e1c95bad..d373bf12d 100644 --- a/packages/nps/messageProcessors/processCheckPlateText.ts +++ b/packages/nps/messageProcessors/processCheckPlateText.ts @@ -1,11 +1,11 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { getLenString, getNBytes } from "../utils/pureGet.js"; import { getUserSessionByConnectionId, setUserSession, } from "../services/session.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processCheckProfileName.d.ts b/packages/nps/messageProcessors/processCheckProfileName.d.ts new file mode 100644 index 000000000..876066f54 --- /dev/null +++ b/packages/nps/messageProcessors/processCheckProfileName.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processCheckProfileName( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processCheckProfileName.ts b/packages/nps/messageProcessors/processCheckProfileName.ts index 86aa48c47..cf2e19a75 100644 --- a/packages/nps/messageProcessors/processCheckProfileName.ts +++ b/packages/nps/messageProcessors/processCheckProfileName.ts @@ -1,9 +1,8 @@ -import { ISerializable, IMessageHeader, IMessage } from "../types.js"; import { GameMessage } from "../messageStructs/GameMessage.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { getLenString, getNBytes } from "../utils/pureGet.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processCreateProfile.d.ts b/packages/nps/messageProcessors/processCreateProfile.d.ts new file mode 100644 index 000000000..6c6737f62 --- /dev/null +++ b/packages/nps/messageProcessors/processCreateProfile.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processCreateProfile( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processCreateProfile.ts b/packages/nps/messageProcessors/processCreateProfile.ts index 960f86856..b9069cc56 100644 --- a/packages/nps/messageProcessors/processCreateProfile.ts +++ b/packages/nps/messageProcessors/processCreateProfile.ts @@ -1,8 +1,8 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { GameProfile } from "../messageStructs/GameProfile.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processDeleteProfile.d.ts b/packages/nps/messageProcessors/processDeleteProfile.d.ts new file mode 100644 index 000000000..d3cc23272 --- /dev/null +++ b/packages/nps/messageProcessors/processDeleteProfile.d.ts @@ -0,0 +1,17 @@ +import type { SocketCallback } from "./index.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +export declare function loadPrivateKey(path: string): string; +export declare function decryptSessionKey( + encryptedSessionKey: string, + privateKey: string, +): string; +export declare function unpackUserLoginMessage(message: GameMessage): { + sessionKey: string; + gameId: string; + contextToken: string; +}; +export declare function processDeleteProfile( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processDeleteProfile.ts b/packages/nps/messageProcessors/processDeleteProfile.ts index 9632cc2c2..40878db24 100644 --- a/packages/nps/messageProcessors/processDeleteProfile.ts +++ b/packages/nps/messageProcessors/processDeleteProfile.ts @@ -1,11 +1,11 @@ import fs from "node:fs"; import crypto from "node:crypto"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { GameMessage } from "../messageStructs/GameMessage.js"; import { SessionKey } from "../messageStructs/SessionKey.js"; import { getLenString } from "../utils/pureGet.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processEncryptedGameCommand.d.ts b/packages/nps/messageProcessors/processEncryptedGameCommand.d.ts new file mode 100644 index 000000000..0f8ba6444 --- /dev/null +++ b/packages/nps/messageProcessors/processEncryptedGameCommand.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processEncryptedGameCommand( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processEncryptedGameCommand.ts b/packages/nps/messageProcessors/processEncryptedGameCommand.ts index e03c9c84d..e66166286 100644 --- a/packages/nps/messageProcessors/processEncryptedGameCommand.ts +++ b/packages/nps/messageProcessors/processEncryptedGameCommand.ts @@ -2,10 +2,10 @@ import { GameMessage, SerializableData, } from "../messageStructs/GameMessage.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { getAsHex } from "../utils/pureGet.js"; import { - EncryptionSession, + type EncryptionSession, getEncryptionSession, getUserSessionByConnectionId, newEncryptionSession, @@ -13,7 +13,7 @@ import { } from "../services/session.js"; import { lobbyCommandMap } from "./lobbyCommands.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processGameLogin.d.ts b/packages/nps/messageProcessors/processGameLogin.d.ts new file mode 100644 index 000000000..583084c49 --- /dev/null +++ b/packages/nps/messageProcessors/processGameLogin.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processGameLogin( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processGameLogin.ts b/packages/nps/messageProcessors/processGameLogin.ts index cac9eaf0f..664ee03af 100644 --- a/packages/nps/messageProcessors/processGameLogin.ts +++ b/packages/nps/messageProcessors/processGameLogin.ts @@ -1,12 +1,12 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { getDWord, getLenString, getNBytes } from "../utils/pureGet.js"; import { getUserSessionByCustomerId, setUserSession, } from "../services/session.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processGetFirstBuddy.d.ts b/packages/nps/messageProcessors/processGetFirstBuddy.d.ts new file mode 100644 index 000000000..36a6868b3 --- /dev/null +++ b/packages/nps/messageProcessors/processGetFirstBuddy.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processFirstBuddy( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processGetFirstBuddy.ts b/packages/nps/messageProcessors/processGetFirstBuddy.ts index ac305a0e4..7883664b2 100644 --- a/packages/nps/messageProcessors/processGetFirstBuddy.ts +++ b/packages/nps/messageProcessors/processGetFirstBuddy.ts @@ -3,11 +3,11 @@ import { SerializableData, } from "../messageStructs/GameMessage.js"; import { getDWord, getAsHex } from "../utils/pureGet.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { getGameProfilesForCustomerId } from "../services/profile.js"; import { ProfileList } from "../messageStructs/ProfileList.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processGetProfileInfo.d.ts b/packages/nps/messageProcessors/processGetProfileInfo.d.ts new file mode 100644 index 000000000..9567778ad --- /dev/null +++ b/packages/nps/messageProcessors/processGetProfileInfo.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "../messageProcessors/index.js"; +export declare function processGetProfileInfo( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processGetProfileInfo.ts b/packages/nps/messageProcessors/processGetProfileInfo.ts index 69e2e24f1..1576c46aa 100644 --- a/packages/nps/messageProcessors/processGetProfileInfo.ts +++ b/packages/nps/messageProcessors/processGetProfileInfo.ts @@ -1,10 +1,10 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; import { getDWord, getAsHex } from "../utils/pureGet.js"; -import { SocketCallback } from "../messageProcessors/index.js"; +import type { SocketCallback } from "../messageProcessors/index.js"; import { getGameProfilesForCustomerId } from "../services/profile.js"; import { ProfileList } from "../messageStructs/ProfileList.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processGetProfileMaps.d.ts b/packages/nps/messageProcessors/processGetProfileMaps.d.ts new file mode 100644 index 000000000..b32a85a22 --- /dev/null +++ b/packages/nps/messageProcessors/processGetProfileMaps.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "../messageProcessors/index.js"; +export declare function processGetProfileMaps( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processGetProfileMaps.ts b/packages/nps/messageProcessors/processGetProfileMaps.ts index 6961ff1c5..e97bb7ae7 100644 --- a/packages/nps/messageProcessors/processGetProfileMaps.ts +++ b/packages/nps/messageProcessors/processGetProfileMaps.ts @@ -1,10 +1,10 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; import { getDWord, getAsHex } from "../utils/pureGet.js"; -import { SocketCallback } from "../messageProcessors/index.js"; +import type { SocketCallback } from "../messageProcessors/index.js"; import { getGameProfilesForCustomerId } from "../services/profile.js"; import { ProfileList } from "../messageStructs/ProfileList.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processLobbyLogin.d.ts b/packages/nps/messageProcessors/processLobbyLogin.d.ts new file mode 100644 index 000000000..3c4a26fc7 --- /dev/null +++ b/packages/nps/messageProcessors/processLobbyLogin.d.ts @@ -0,0 +1,7 @@ +import type { SocketCallback } from "./index.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +export declare function processLobbyLogin( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processLobbyLogin.ts b/packages/nps/messageProcessors/processLobbyLogin.ts index fefe99c44..a0f2066bb 100644 --- a/packages/nps/messageProcessors/processLobbyLogin.ts +++ b/packages/nps/messageProcessors/processLobbyLogin.ts @@ -1,4 +1,4 @@ -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { getDWord, getLenString, getNBytes } from "../utils/pureGet.js"; import { getUserSessionByProfileId, @@ -8,7 +8,7 @@ import { import { GameMessage } from "../messageStructs/GameMessage.js"; import { UserInfo } from "../messageStructs/UserInfo.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processPing.d.ts b/packages/nps/messageProcessors/processPing.d.ts new file mode 100644 index 000000000..6ee91c030 --- /dev/null +++ b/packages/nps/messageProcessors/processPing.d.ts @@ -0,0 +1,7 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function processPing( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processPing.ts b/packages/nps/messageProcessors/processPing.ts index 6d25ac141..7d35c1b25 100644 --- a/packages/nps/messageProcessors/processPing.ts +++ b/packages/nps/messageProcessors/processPing.ts @@ -1,7 +1,7 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageProcessors/processUserLogin.d.ts b/packages/nps/messageProcessors/processUserLogin.d.ts new file mode 100644 index 000000000..bef4472dc --- /dev/null +++ b/packages/nps/messageProcessors/processUserLogin.d.ts @@ -0,0 +1,18 @@ +import type { ISerializable } from "../types.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { SocketCallback } from "./index.js"; +export declare function loadPrivateKey(path: string): string; +export declare function decryptSessionKey( + encryptedSessionKey: string, + privateKey: string, +): string; +export declare function unpackUserLoginMessage(message: ISerializable): { + sessionKey: string; + gameId: string; + contextToken: string; +}; +export declare function processUserLogin( + connectionId: string, + message: GameMessage, + socketCallback: SocketCallback, +): Promise; diff --git a/packages/nps/messageProcessors/processUserLogin.ts b/packages/nps/messageProcessors/processUserLogin.ts index b55565bd9..c2d19120a 100644 --- a/packages/nps/messageProcessors/processUserLogin.ts +++ b/packages/nps/messageProcessors/processUserLogin.ts @@ -1,16 +1,16 @@ -import { ISerializable } from "../types.js"; +import type { ISerializable } from "../types.js"; import { GameMessage } from "../messageStructs/GameMessage.js"; import fs from "node:fs"; import crypto from "node:crypto"; import * as Sentry from "@sentry/node"; import { getToken } from "../services/token.js"; import { createNewUserSession, setUserSession } from "../services/session.js"; -import { SocketCallback } from "./index.js"; +import type { SocketCallback } from "./index.js"; import { SessionKey } from "../messageStructs/SessionKey.js"; import { getAsHex, getLenString } from "../utils/pureGet.js"; import { UserStatus } from "../messageStructs/UserStatus.js"; import { UserAction } from "../messageStructs/UserAction.js"; -import { getServerConfiguration, getServerLogger } from "@rustymotors/shared"; +import { getServerConfiguration, getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageStructs/GameMessage.d.ts b/packages/nps/messageStructs/GameMessage.d.ts new file mode 100644 index 000000000..89b69b6cc --- /dev/null +++ b/packages/nps/messageStructs/GameMessage.d.ts @@ -0,0 +1,45 @@ +/// +import type { ISerializable, IMessageHeader, IMessage } from "../types.js"; +export declare class MessageHeader implements IMessageHeader { + private version; + private id; + private length; + constructor(version: 0 | 257, id: number, length: number); + getDataOffset(): number; + getByteSize(): number; + getVersion(): number; + getId(): number; + getLength(): number; + setVersion(version: 0 | 257): void; + setId(id: number): void; + setLength(length: number): void; + private serializeV0; + private serializeV1; + serialize(): Buffer; + private deserializeV0; + private deserializeV1; + deserialize(data: Buffer): void; +} +export declare class SerializableData implements ISerializable { + private data; + constructor(requestedSize: number); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} +export declare class GameMessage implements IMessage { + header: MessageHeader; + data: ISerializable; + constructor(version: 0 | 257); + getDataAsBuffer(): Buffer; + /** The message length is the length of the message data, not including the id */ + getByteSize(): number; + getData(): ISerializable; + setData(data: ISerializable): void; + serialize(): Buffer; + deserialize(data: Buffer): void; + toString(): string; + static identifyVersion(data: Buffer): 0 | 257; + static fromGameMessage(version: 0 | 257, source: GameMessage): GameMessage; +} diff --git a/packages/nps/messageStructs/GameMessage.ts b/packages/nps/messageStructs/GameMessage.ts index f78c4fc16..f8093f296 100644 --- a/packages/nps/messageStructs/GameMessage.ts +++ b/packages/nps/messageStructs/GameMessage.ts @@ -1,4 +1,4 @@ -import { ISerializable, IMessageHeader, IMessage } from "../types.js"; +import type { ISerializable, IMessageHeader, IMessage } from "../types.js"; export class MessageHeader implements IMessageHeader { private version: 0 | 257; diff --git a/packages/nps/messageStructs/GameProfile.d.ts b/packages/nps/messageStructs/GameProfile.d.ts new file mode 100644 index 000000000..8d112153e --- /dev/null +++ b/packages/nps/messageStructs/GameProfile.d.ts @@ -0,0 +1,36 @@ +/// +import type { ISerializable } from "../types.js"; +export declare class GameProfile implements ISerializable { + customerId: number; + profileName: string; + serverId: number; + createStamp: number; + lastLoginStamp: number; + numberGames: number; + profileId: number; + isOnline: boolean; + gamePurchaseStamp: number; + gameSerialNumber: string; + timeOnline: number; + timeInGame: number; + gameBlob: Buffer; + personalBlob: Buffer; + pictureBlob: Buffer; + dnd: boolean; + gameStartStamp: number; + currentKey: string; + profileLevel: number; + shardId: number; + constructor(); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + static new(): GameProfile; + static fromBytes(data: Buffer, size: number): GameProfile; + toBytes(): Buffer; + toString(): string; + toHex(): string; + setData(data: Buffer): void; + getData(): Buffer; + getSize(): number; +} diff --git a/packages/nps/messageStructs/GameProfile.ts b/packages/nps/messageStructs/GameProfile.ts index d4842508e..b89b00e97 100644 --- a/packages/nps/messageStructs/GameProfile.ts +++ b/packages/nps/messageStructs/GameProfile.ts @@ -1,4 +1,4 @@ -import { ISerializable, IMessageHeader, IMessage } from "../types.js"; +import type { ISerializable } from "../types.js"; import { putLenBlob, putLenString, putShortBool } from "../utils/purePut.js"; import { getAsHex, diff --git a/packages/nps/messageStructs/MiniRiffList.d.ts b/packages/nps/messageStructs/MiniRiffList.d.ts new file mode 100644 index 000000000..8bc9bfc6f --- /dev/null +++ b/packages/nps/messageStructs/MiniRiffList.d.ts @@ -0,0 +1,25 @@ +/// +import type { ISerializable } from "../types.js"; +import { NPSList } from "./NPSList.js"; +export declare class MiniRiffInfo implements ISerializable { + riffName: string; + riffId: number; + population: number; + constructor(riffName: string, riffId: number, population: number); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} +export declare class MiniRiffList extends NPSList implements ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + private riffs; + getMaxRiffs(): number; + addRiff(riff: MiniRiffInfo): void; + toBytes(): Buffer; + toString(): string; + toHex(): string; + getSize(): number; +} diff --git a/packages/nps/messageStructs/MiniRiffList.ts b/packages/nps/messageStructs/MiniRiffList.ts index 6630ec381..b485a82b4 100644 --- a/packages/nps/messageStructs/MiniRiffList.ts +++ b/packages/nps/messageStructs/MiniRiffList.ts @@ -1,8 +1,8 @@ -import { ISerializable } from "../types.js"; +import type { ISerializable } from "../types.js"; import { putLenString } from "../utils/purePut.js"; import { NPSList } from "./NPSList.js"; -import { getServerLogger } from "@rustymotors/shared"; +import { getServerLogger } from "../../shared"; const log = getServerLogger(); diff --git a/packages/nps/messageStructs/MiniUserList.d.ts b/packages/nps/messageStructs/MiniUserList.d.ts new file mode 100644 index 000000000..f20ab5d01 --- /dev/null +++ b/packages/nps/messageStructs/MiniUserList.d.ts @@ -0,0 +1,21 @@ +/// +import type { ISerializable } from "../types.js"; +export declare class MiniUserInfo implements ISerializable { + userId: number; + userName: string; + constructor(userId: number, userName: string); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} +export declare class MiniUserList implements ISerializable { + private channelId; + private channelUsers; + constructor(channelId: number); + addChannelUser(user: MiniUserInfo): void; + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} diff --git a/packages/nps/messageStructs/MiniUserList.ts b/packages/nps/messageStructs/MiniUserList.ts index 1b40434a1..0b71077a2 100644 --- a/packages/nps/messageStructs/MiniUserList.ts +++ b/packages/nps/messageStructs/MiniUserList.ts @@ -1,4 +1,4 @@ -import { ISerializable } from "../types.js"; +import type { ISerializable } from "../types.js"; import { putLenString } from "../utils/purePut.js"; export class MiniUserInfo implements ISerializable { diff --git a/packages/nps/messageStructs/NPSList.d.ts b/packages/nps/messageStructs/NPSList.d.ts new file mode 100644 index 000000000..6daf9d1e0 --- /dev/null +++ b/packages/nps/messageStructs/NPSList.d.ts @@ -0,0 +1,14 @@ +/// +import type { ISerializable } from "../types.js"; +export declare class NPSList implements ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + private list; + toBytes(): Buffer; + toString(): string; + toHex(): string; + setData(data: Buffer): void; + getData(): Buffer; + getSize(): number; +} diff --git a/packages/nps/messageStructs/NPSList.ts b/packages/nps/messageStructs/NPSList.ts index 759e9a34b..a7b6bb4f1 100644 --- a/packages/nps/messageStructs/NPSList.ts +++ b/packages/nps/messageStructs/NPSList.ts @@ -1,4 +1,4 @@ -import { ISerializable, IMessage } from "../types.js"; +import type { ISerializable, IMessage } from "../types.js"; export class NPSList implements ISerializable { serialize(): Buffer { diff --git a/packages/nps/messageStructs/ProfileList.d.ts b/packages/nps/messageStructs/ProfileList.d.ts new file mode 100644 index 000000000..c0ff01d68 --- /dev/null +++ b/packages/nps/messageStructs/ProfileList.d.ts @@ -0,0 +1,19 @@ +/// +import type { ISerializable } from "../types.js"; +import { GameProfile } from "./GameProfile.js"; +import { NPSList } from "./NPSList.js"; +export declare class ProfileList extends NPSList implements ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + maxProfiles: number; + private profiles; + getMaxProfiles(): number; + addProfile(profile: GameProfile): void; + toBytes(): Buffer; + toString(): string; + toHex(): string; + setData(data: Buffer): void; + getData(): Buffer; + getSize(): number; +} diff --git a/packages/nps/messageStructs/ProfileList.ts b/packages/nps/messageStructs/ProfileList.ts index f2ce88118..25b30f02f 100644 --- a/packages/nps/messageStructs/ProfileList.ts +++ b/packages/nps/messageStructs/ProfileList.ts @@ -1,4 +1,4 @@ -import { ISerializable, IMessageHeader, IMessage } from "../types.js"; +import type { ISerializable } from "../types.js"; import { GameProfile } from "./GameProfile.js"; import { NPSList } from "./NPSList.js"; diff --git a/packages/nps/messageStructs/SessionKey.d.ts b/packages/nps/messageStructs/SessionKey.d.ts new file mode 100644 index 000000000..4e9f618b9 --- /dev/null +++ b/packages/nps/messageStructs/SessionKey.d.ts @@ -0,0 +1,19 @@ +/// +import type { ISerializable } from "../types.js"; +export declare class SessionKey implements ISerializable { + private key; + private timestamp; + constructor(key: Buffer, timestamp: number); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + static fromBytes(bytes: Buffer): SessionKey; + static fromKeyString(key: string): SessionKey; + getKey(): string; + toString(): string; + toHex(): string; + toBytes(): Buffer; + getSize(): number; + getData(): Buffer; + setData(data: Buffer): void; +} diff --git a/packages/nps/messageStructs/SessionKey.ts b/packages/nps/messageStructs/SessionKey.ts index c1ad031a4..bb4d2c8ed 100644 --- a/packages/nps/messageStructs/SessionKey.ts +++ b/packages/nps/messageStructs/SessionKey.ts @@ -1,4 +1,4 @@ -import { ISerializable, IMessageHeader, IMessage } from "../types.js"; +import type { ISerializable } from "../types.js"; import { getAsHex } from "../utils/pureGet.js"; export class SessionKey implements ISerializable { diff --git a/packages/nps/messageStructs/UserAction.d.ts b/packages/nps/messageStructs/UserAction.d.ts new file mode 100644 index 000000000..40fb0b725 --- /dev/null +++ b/packages/nps/messageStructs/UserAction.d.ts @@ -0,0 +1,17 @@ +/// +import type { ISerializable } from "../types.js"; +export declare class UserAction implements ISerializable { + private name; + private data; + constructor(name: string, bytes?: Buffer); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + setData(data: Buffer): void; + getData(): Buffer; + static fromBytes(name: string, bytes: Buffer): UserAction; + toBytes(): Buffer; + toString(): string; + toHex(): string; + getSize(): number; +} diff --git a/packages/nps/messageStructs/UserAction.ts b/packages/nps/messageStructs/UserAction.ts index 3931eae7c..e3ef7e1e5 100644 --- a/packages/nps/messageStructs/UserAction.ts +++ b/packages/nps/messageStructs/UserAction.ts @@ -1,4 +1,4 @@ -import { ISerializable } from "../types.js"; +import type { ISerializable } from "../types.js"; import { getAsHex } from "../utils/pureGet.js"; export class UserAction implements ISerializable { diff --git a/packages/nps/messageStructs/UserInfo.d.ts b/packages/nps/messageStructs/UserInfo.d.ts new file mode 100644 index 000000000..77a2380e7 --- /dev/null +++ b/packages/nps/messageStructs/UserInfo.d.ts @@ -0,0 +1,12 @@ +/// +import type { ISerializable } from "../types.js"; +export declare class UserInfo implements ISerializable { + private profileId; + private profileName; + private userData; + constructor(id: number, name: string); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} diff --git a/packages/nps/messageStructs/UserInfo.ts b/packages/nps/messageStructs/UserInfo.ts index 7df00043c..24b891419 100644 --- a/packages/nps/messageStructs/UserInfo.ts +++ b/packages/nps/messageStructs/UserInfo.ts @@ -1,4 +1,4 @@ -import { ISerializable } from "../types.js"; +import type { ISerializable } from "../types.js"; export class UserInfo implements ISerializable { private profileId: number; // 4 bytes diff --git a/packages/nps/messageStructs/UserStatus.d.ts b/packages/nps/messageStructs/UserStatus.d.ts new file mode 100644 index 000000000..1c69cea76 --- /dev/null +++ b/packages/nps/messageStructs/UserStatus.d.ts @@ -0,0 +1,39 @@ +/// +import type { ISerializable } from "../types.js"; +import { SessionKey } from "./SessionKey.js"; +import { UserAction } from "./UserAction.js"; +export declare class UserStatus implements ISerializable { + private customerId; + private personaId; + private isCacheHit; + private ban; + private gag; + private sessionKey; + constructor( + customerId: number, + personaId: number, + isCacheHit: boolean, + ban: UserAction, + gag: UserAction, + sessionKey: SessionKey, + ); + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + static new(): UserStatus; + static fromBytes(bytes: Buffer): UserStatus; + toBytes(): Buffer; + getSize(): number; + getCustomerId(): number; + setCustomerId(customerId: number): void; + getPersonaId(): number; + setPersonaId(personaId: number): void; + getSessionKey(): SessionKey; + setSessionKey(sessionKey: SessionKey): void; + setBan(ban: UserAction): void; + getGag(): UserAction; + setGag(gag: UserAction): void; + toString(): string; + toHex(): string; + setData(data: Buffer): void; +} diff --git a/packages/nps/messageStructs/UserStatus.ts b/packages/nps/messageStructs/UserStatus.ts index 4a417b13f..0d49a784d 100644 --- a/packages/nps/messageStructs/UserStatus.ts +++ b/packages/nps/messageStructs/UserStatus.ts @@ -1,4 +1,4 @@ -import { ISerializable, IMessageHeader, IMessage } from "../types.js"; +import type { ISerializable } from "../types.js"; import { SessionKey } from "./SessionKey.js"; import { UserAction } from "./UserAction.js"; diff --git a/packages/nps/services/account.d.ts b/packages/nps/services/account.d.ts new file mode 100644 index 000000000..8f9c9fe2a --- /dev/null +++ b/packages/nps/services/account.d.ts @@ -0,0 +1,18 @@ +export type User = { + username: string; + password: string; + customerId: number; + createdAt: Date; + updatedAt: Date; +}; +export declare function populateGameUsers(): Promise; +export declare function getUser(username: string): Promise; +export declare function addUser(user: User): Promise; +export declare function deleteUser(username: string): Promise; +export declare function getCustomerId( + username: string, +): Promise; +export declare function checkPassword( + user: User, + password: string, +): Promise; diff --git a/packages/nps/services/profile.d.ts b/packages/nps/services/profile.d.ts new file mode 100644 index 000000000..014b2de66 --- /dev/null +++ b/packages/nps/services/profile.d.ts @@ -0,0 +1,14 @@ +import { GameProfile } from "../messageStructs/GameProfile.js"; +export declare const gameProfiles: GameProfile[]; +export declare function populateGameProfiles( + profiles: GameProfile[], +): Promise; +export declare function getGameProfilesForCustomerId( + customerId: number, +): Promise; +export declare function gameProfileExists( + profileName: string, +): Promise; +export declare function addGameProfile(profile: GameProfile): Promise; +export declare function deleteGameProfile(profileId: number): Promise; +export declare function createGameProfile(): Promise; diff --git a/packages/nps/services/session.d.ts b/packages/nps/services/session.d.ts new file mode 100644 index 000000000..aaf8d4975 --- /dev/null +++ b/packages/nps/services/session.d.ts @@ -0,0 +1,70 @@ +/// +import { Cipher, Decipher } from "node:crypto"; +export type ClientVersion = "debug" | "release" | "unknown"; +export type EncryptionSession = { + connectionId: string; + customerId: number; + sessionKey: string; + gameCipher: Cipher; + gameDecipher: Decipher; +}; +export declare const encryptionSessions: Map; +export declare function setEncryptionSession( + encryptionSession: EncryptionSession, +): Promise; +export declare function getEncryptionSession( + connectionId: string, +): Promise; +export declare function deleteEncryptionSession( + connectionId: string, +): Promise; +export declare function newEncryptionSession({ + connectionId, + customerId, + sessionKey, +}: { + connectionId: string; + customerId: number; + sessionKey: string; +}): Promise; +export type UserSession = { + customerId: number; + token: string; + connectionId: string; + port: number; + ipAddress: string; + activeProfileId: number; + nextSequenceNumber: number; + sessionKey: string; + clientVersion: ClientVersion; +}; +export declare const userSessions: Map; +export declare function setUserSession(userSession: UserSession): Promise; +export declare function getUserSession( + token: string, +): Promise; +export declare function deleteUserSession(token: string): Promise; +export declare function getUserSessionByConnectionId( + connectionId: string, +): Promise; +export declare function getUserSessionByProfileId( + profileId: number, +): Promise; +export declare function getUserSessionByCustomerId( + customerId: number, +): Promise; +export declare function getUserSessionByIPAndPort( + ipAddress: string, + port: number, +): Promise; +export declare function createNewUserSession({ + customerId, + token, + connectionId, + port, + ipAddress, + activeProfileId, + nextSequenceNumber, + sessionKey, + clientVersion, +}: UserSession): Promise; diff --git a/packages/nps/services/token.d.ts b/packages/nps/services/token.d.ts new file mode 100644 index 000000000..48f0339c7 --- /dev/null +++ b/packages/nps/services/token.d.ts @@ -0,0 +1,12 @@ +export type TokenRecord = { + customerId: number; + token: string; +}; +export declare const activeTokens: Map; +export declare function generateTokenRecord(customerId: number): TokenRecord; +export declare function generateToken(customerId: number): string; +export declare function isTokenExpired(token: string): boolean; +export declare function getToken(token: string): TokenRecord | undefined; +export declare function deleteToken(token: string): void; +export declare function deleteExpiredTokens(): void; +export declare function getCustomerId(token: string): number | undefined; diff --git a/packages/nps/services/types.d.ts b/packages/nps/services/types.d.ts new file mode 100644 index 000000000..7950fbde2 --- /dev/null +++ b/packages/nps/services/types.d.ts @@ -0,0 +1,17 @@ +export type Part = { + PartID: number; + ParentPartID: number; + BrandedPartID: number; + RepairPrice: number; + JunkPrice: number; + Wear: number; + AttachmentPoint: number; + Damage: number; +}; +export type Vehicle = { + VehicleID: number; + SkinID: number; + Flags: number; + Delta: number; + Damage: number; +}; diff --git a/packages/nps/types.d.ts b/packages/nps/types.d.ts new file mode 100644 index 000000000..f161f3577 --- /dev/null +++ b/packages/nps/types.d.ts @@ -0,0 +1,22 @@ +/// +export interface ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} +export interface IMessageHeader extends ISerializable { + getVersion(): number; + getId(): number; + getLength(): number; + getDataOffset(): number; + setVersion(version: number): void; + setId(id: number): void; + setLength(length: number): void; +} +export interface IMessage extends ISerializable { + header: IMessageHeader; + getData(): ISerializable; + getDataAsBuffer(): Buffer; + setData(data: ISerializable): void; +} diff --git a/packages/nps/utils/pureCompare.d.ts b/packages/nps/utils/pureCompare.d.ts new file mode 100644 index 000000000..6cac26f31 --- /dev/null +++ b/packages/nps/utils/pureCompare.d.ts @@ -0,0 +1,6 @@ +export declare function isZero(n: number): boolean; +export declare function lessThan(a: number, b: number): boolean; +export declare function lessThanOrEqual(a: number, b: number): boolean; +export declare function greaterThan(a: number, b: number): boolean; +export declare function greaterThanOrEqual(a: number, b: number): boolean; +export declare function areBothZero(a: number, b: number): boolean; diff --git a/packages/nps/utils/pureGet.d.ts b/packages/nps/utils/pureGet.d.ts new file mode 100644 index 000000000..6462b209a --- /dev/null +++ b/packages/nps/utils/pureGet.d.ts @@ -0,0 +1,28 @@ +/// +export declare function getWord( + bytes: Buffer, + offset: number, + isLE: boolean, +): number; +export declare function getDWord( + bytes: Buffer, + offset: number, + isLE: boolean, +): number; +/** + * Get the first n bytes of a buffer. + * If the buffer is shorter than n bytes, return the whole buffer + */ +export declare function getNBytes(bytes: Buffer, n: number): Buffer; +export declare function getAsHex(bytes: Buffer): string; +export declare function getLenString( + bytes: Buffer, + offset: number, + isLE: boolean, +): string; +export declare function getLenBlob( + bytes: Buffer, + offset: number, + isLE: boolean, +): Buffer; +export declare function getShortBool(bytes: Buffer, offset: number): boolean; diff --git a/packages/nps/utils/purePut.d.ts b/packages/nps/utils/purePut.d.ts new file mode 100644 index 000000000..5d05003ac --- /dev/null +++ b/packages/nps/utils/purePut.d.ts @@ -0,0 +1,55 @@ +/// +export declare function put16( + bytes: Buffer, + offset: number, + word: number, + isLE: boolean, +): Buffer; +export declare function put8( + bytes: Buffer, + offset: number, + byte: number, +): Buffer; +export declare function put16BE( + bytes: Buffer, + offset: number, + word: number, +): Buffer; +export declare function put16LE( + bytes: Buffer, + offset: number, + word: number, +): Buffer; +export declare function put32( + bytes: Buffer, + offset: number, + word: number, + isLE: boolean, +): Buffer; +export declare function put32BE( + bytes: Buffer, + offset: number, + word: number, +): Buffer; +export declare function put32LE( + bytes: Buffer, + offset: number, + word: number, +): Buffer; +export declare function putLenString( + bytes: Buffer, + offset: number, + str: string, + isLE: boolean, +): Buffer; +export declare function putLenBlob( + bytes: Buffer, + offset: number, + blob: Buffer, + isLE: boolean, +): Buffer; +export declare function putShortBool( + bytes: Buffer, + offset: number, + bool: boolean, +): Buffer; diff --git a/packages/patch/src/PatchServer.d.ts b/packages/patch/src/PatchServer.d.ts new file mode 100644 index 000000000..1fe7d873c --- /dev/null +++ b/packages/patch/src/PatchServer.d.ts @@ -0,0 +1,76 @@ +/// +/// +import { IncomingMessage, ServerResponse } from "node:http"; +import { ServerLogger } from "../../shared"; +import { Buffer } from "node:buffer"; +export declare const CastanetResponse: { + body: Buffer; + header: { + type: string; + value: string; + }; +}; +/** + * The PatchServer class handles HTTP requests from the client for patching and upgrades + * Please use {@link getPatchServer()} to access + * @export + * @class PatchServer + */ +export declare class PatchServer { + /** + * + * + * @static + * @type {PatchServer} + * @memberof PatchServer + */ + static _instance: PatchServer; + /** + * + * + * @private + * @type {ServerLogger} + */ + _log: ServerLogger; + /** + * Creates an instance of PatchServer. + * Please use getInstance() instead + * @param {ServerLogger} log + * @memberof PatchServer + */ + constructor(log: ServerLogger); + /** + * Return the instance of the PatchServer class + * + * @static + * @param {ServerLogger} log + * @return {PatchServer} + * @memberof PatchServer + */ + static getInstance(log: ServerLogger): PatchServer; + /** + * Returns the hard-coded value that tells the client there are no updates or patches + * @param {IncomingMessage} request + * @param {ServerResponse} response + * @returns {ServerResponse} + */ + castanetResponse( + request: IncomingMessage, + response: ServerResponse, + ): ServerResponse; + /** + * Routes incomming HTTP requests + * @param {IncomingMessage} request + * @param {ServerResponse} response + * @returns {ServerResponse} + */ + handleRequest( + request: IncomingMessage, + response: ServerResponse, + ): ServerResponse; +} +/** + * Return the instance of the PatchServer class + * @returns {PatchServer} + */ +export declare function getPatchServer(log: ServerLogger): PatchServer; diff --git a/packages/patch/src/PatchServer.ts b/packages/patch/src/PatchServer.ts index 23e8dea7d..53fafc6e8 100644 --- a/packages/patch/src/PatchServer.ts +++ b/packages/patch/src/PatchServer.ts @@ -1,5 +1,5 @@ import { IncomingMessage, ServerResponse } from "node:http"; -import { ServerLogger, getServerLogger } from "@rustymotors/shared"; +import { ServerLogger, getServerLogger } from "../../shared"; import { Buffer } from "node:buffer"; const debug_reseponse = Buffer.from([ diff --git a/packages/patch/test/PatchServer.test.d.ts b/packages/patch/test/PatchServer.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/patch/test/PatchServer.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/persona/src/BuddyInfoMessage.d.ts b/packages/persona/src/BuddyInfoMessage.d.ts new file mode 100644 index 000000000..376aa9f3b --- /dev/null +++ b/packages/persona/src/BuddyInfoMessage.d.ts @@ -0,0 +1,45 @@ +/// +import { NetworkMessage, RawMessage } from "../../shared"; +/** + * BuddyInfoMessage + * + * This is a response to a NPS_GET_BUDDY_LIST message. + * It is actually two messages, the first is a NPS_BUDDY_LIST_COUNT + * message, which contains the number of buddies in the list and has + * a response code of NPS_BUDDY_LIST_COUNT - 1556 (0x614). + * + * The second message is a NPS_BUDDY_LIST message, which contains the + * buddy list itself. It has a response code of 1544 (0x608). + */ +export declare class BuddyInfoMessage extends RawMessage { + _buddyCount: number; + _buddyList: BuddyList[]; + _longOne: number; + _longTwo: number; + constructor(); + get length(): number; + serialize(): Buffer; + add(buddy: BuddyList): void; +} +export declare class BuddyCount extends NetworkMessage { + _buddyCount: number; + constructor(); + get length(): number; + serialize(): Buffer; + set buddyCount(count: number); +} +export declare class BuddyList extends RawMessage { + buddyName: string; + gameName: string; + isBuddy: boolean; + isOnline: boolean; + dnd: boolean; + dnb: boolean; + noEntry: boolean; + muteWhispers: boolean; + muteChat: boolean; + constructor(); + get length(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/persona/src/BuddyInfoMessage.ts b/packages/persona/src/BuddyInfoMessage.ts index aa03285ed..ebe067b1b 100644 --- a/packages/persona/src/BuddyInfoMessage.ts +++ b/packages/persona/src/BuddyInfoMessage.ts @@ -1,8 +1,4 @@ -import { - serializeStringRaw, - NetworkMessage, - RawMessage, -} from "@rustymotors/shared"; +import { serializeStringRaw, NetworkMessage, RawMessage } from "../../shared"; /** * BuddyInfoMessage diff --git a/packages/persona/src/PersonaMapsMessage.d.ts b/packages/persona/src/PersonaMapsMessage.d.ts new file mode 100644 index 000000000..997fe03cf --- /dev/null +++ b/packages/persona/src/PersonaMapsMessage.d.ts @@ -0,0 +1,100 @@ +/// +import { NPSHeader, NPSMessage } from "../../shared"; +/** + * + * This is type UserGameData + */ +export declare class PersonaRecord { + customerId: number; + personaName: string; + serverDataId: number; + createDate: number; + lastLogin: number; + numberOfGames: number; + personaId: number; + isOnline: number; + purchaseTimestamp: number; + gameSerialNumber: string; + timeOnline: number; + timeInGame: number; + extraData: Buffer; + personaData: Buffer; + pictureData: Buffer; + dnd: number; + startedPlayingTimestamp: number; + hashedKey: string; + personaLevel: number; + shardId: number; + constructor(); + /** + * + * @param {Buffer} buffer + * @returns {PersonaRecord} + */ + deserialize(buffer: Buffer): PersonaRecord; + /** + * + * @returns {Buffer} + */ + serialize(): Buffer; + static size(): number; + toJSON(): { + customerId: number; + personaId: number; + personaName: string; + shardId: number; + serverDataId: number; + }; + asJSON(): { + customerId: number; + personaId: number; + personaName: string; + shardId: number; + serverDataId: number; + }; + toString(): string; +} +export declare class PersonaList { + _personaRecords: PersonaRecord[]; + constructor(); + /** + * + * @param {Buffer} buffer + * @returns {PersonaList} + */ + deserialize(buffer: Buffer): PersonaList; + /** + * + * @returns {Buffer} + */ + serialize(): Buffer; + /** + * @param {PersonaRecord} personaRecord + */ + addPersonaRecord(personaRecord: PersonaRecord): void; + personaCount(): number; + size(): number; + asJSON(): { + personaRecords: PersonaRecord[]; + }; + toString(): string; +} +export declare class PersonaMapsMessage extends NPSMessage { + _personaRecords: PersonaList | undefined; + raw: Buffer | undefined; + constructor(); + /** + * @param {Buffer} buffer + * @returns {PersonaMapsMessage} + */ + deserialize(buffer: Buffer): PersonaMapsMessage; + /** + * @returns {Buffer} + */ + serialize(): Buffer; + asJSON(): { + header: NPSHeader; + personaRecords: PersonaList | undefined; + }; + toString(): string; +} diff --git a/packages/persona/src/PersonaMapsMessage.ts b/packages/persona/src/PersonaMapsMessage.ts index 04187df61..d0b5d7c46 100644 --- a/packages/persona/src/PersonaMapsMessage.ts +++ b/packages/persona/src/PersonaMapsMessage.ts @@ -1,5 +1,5 @@ import { serializeString } from "../../core/src/serializationHelpers.js"; -import { NPSHeader, NPSMessage } from "@rustymotors/shared"; +import { NPSHeader, NPSMessage } from "../../shared"; /** * diff --git a/packages/persona/src/_gameLogout.d.ts b/packages/persona/src/_gameLogout.d.ts new file mode 100644 index 000000000..06f4a8f46 --- /dev/null +++ b/packages/persona/src/_gameLogout.d.ts @@ -0,0 +1,22 @@ +import { LegacyMessage, SerializedBuffer } from "../../shared"; +/** + * Handle game logout + * @param {object} args + * @param {string} args.connectionId + * @param {LegacyMessage} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>} + */ +export declare function _gameLogout({ + connectionId, + message, +}: { + connectionId: string; + message: LegacyMessage; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/persona/src/_gameLogout.ts b/packages/persona/src/_gameLogout.ts index db67b3e9e..faa652503 100644 --- a/packages/persona/src/_gameLogout.ts +++ b/packages/persona/src/_gameLogout.ts @@ -1,8 +1,4 @@ -import { - getServerLogger, - LegacyMessage, - SerializedBuffer, -} from "@rustymotors/shared"; +import { getServerLogger, LegacyMessage, SerializedBuffer } from "../../shared"; const log = getServerLogger(); diff --git a/packages/persona/src/_getFirstBuddy.d.ts b/packages/persona/src/_getFirstBuddy.d.ts new file mode 100644 index 000000000..8e847ad83 --- /dev/null +++ b/packages/persona/src/_getFirstBuddy.d.ts @@ -0,0 +1,25 @@ +import { LegacyMessage, SerializedBuffer } from "../../shared"; +export declare function _getFirstBuddy({ + connectionId, + message, +}: { + connectionId: string; + message: LegacyMessage; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; +interface BuddyInfoRecord { + buddyId: number; + buddyName: string; + gameName: string; + isBuddy: boolean; + isOnline: boolean; + dnd: boolean; + dnb: boolean; + noEntry: boolean; + muteWhispers: boolean; + muteChat: boolean; +} +export declare const buddies: BuddyInfoRecord[]; +export {}; diff --git a/packages/persona/src/_getFirstBuddy.ts b/packages/persona/src/_getFirstBuddy.ts index 8fc6103de..6ee90ce8c 100644 --- a/packages/persona/src/_getFirstBuddy.ts +++ b/packages/persona/src/_getFirstBuddy.ts @@ -3,7 +3,7 @@ import { LegacyMessage, NPSMessage, SerializedBuffer, -} from "@rustymotors/shared"; +} from "../../shared"; import { BuddyCount, BuddyInfoMessage, BuddyList } from "./BuddyInfoMessage.js"; const log = getServerLogger(); diff --git a/packages/persona/src/_selectGamePersona.d.ts b/packages/persona/src/_selectGamePersona.d.ts new file mode 100644 index 000000000..1655186dd --- /dev/null +++ b/packages/persona/src/_selectGamePersona.d.ts @@ -0,0 +1,25 @@ +import { ServerLogger } from "../../shared"; +import { LegacyMessage, SerializedBuffer } from "../../shared"; +/** + * Selects a game persona and marks it as in use + * @param {object} args + * @param {string} args.connectionId + * @param {LegacyMessage} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>} + */ +export declare function _selectGamePersona({ + connectionId, + message, + log, +}: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/persona/src/_selectGamePersona.ts b/packages/persona/src/_selectGamePersona.ts index 7650ad141..644dcc543 100644 --- a/packages/persona/src/_selectGamePersona.ts +++ b/packages/persona/src/_selectGamePersona.ts @@ -1,5 +1,5 @@ -import { ServerLogger, getServerLogger } from "@rustymotors/shared"; -import { LegacyMessage, SerializedBuffer } from "@rustymotors/shared"; +import { ServerLogger, getServerLogger } from "../../shared"; +import { LegacyMessage, SerializedBuffer } from "../../shared"; /** * Selects a game persona and marks it as in use diff --git a/packages/persona/src/getPersonasByPersonaId.d.ts b/packages/persona/src/getPersonasByPersonaId.d.ts new file mode 100644 index 000000000..7b6f8d905 --- /dev/null +++ b/packages/persona/src/getPersonasByPersonaId.d.ts @@ -0,0 +1,13 @@ +import type { PersonaRecord } from "../../interfaces/index.js"; +/** + * + * @param {number} id + * @return {Promise} + */ +export declare function getPersonasByPersonaId({ + personas, + id, +}: { + personas?: PersonaRecord[]; + id: number; +}): Promise; diff --git a/packages/persona/src/getPersonasByPersonaId.ts b/packages/persona/src/getPersonasByPersonaId.ts index af774594a..37193c1e7 100644 --- a/packages/persona/src/getPersonasByPersonaId.ts +++ b/packages/persona/src/getPersonasByPersonaId.ts @@ -1,4 +1,4 @@ -import { PersonaRecord } from "../../interfaces/index.js"; +import type { PersonaRecord } from "../../interfaces/index.js"; import { personaRecords } from "./internal.js"; /** diff --git a/packages/persona/src/handlers/validatePersonaName.d.ts b/packages/persona/src/handlers/validatePersonaName.d.ts new file mode 100644 index 000000000..754e377bf --- /dev/null +++ b/packages/persona/src/handlers/validatePersonaName.d.ts @@ -0,0 +1,16 @@ +import { ServerLogger, LegacyMessage, SerializedBuffer } from "../../shared"; +/** + * Check if a new persona name is valid + */ +export declare function validatePersonaName({ + connectionId, + message, + log, +}: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index 35d8e6833..d07b20131 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -3,7 +3,7 @@ import { LegacyMessage, SerializedBuffer, RawMessage, -} from "@rustymotors/shared"; +} from "../../../shared"; /** * Check if a new persona name is valid diff --git a/packages/persona/src/internal.d.ts b/packages/persona/src/internal.d.ts new file mode 100644 index 000000000..95a2e7f57 --- /dev/null +++ b/packages/persona/src/internal.d.ts @@ -0,0 +1,64 @@ +/// +import { ServerLogger, LegacyMessage, SerializedBuffer } from "../../shared"; +/** + * Array of supported message handlers + * + * @type {{ + * opCode: number, + * name: string, + * handler: (args: { + * connectionId: string, + * message: LegacyMessage, + * log: ServerLogger, + * }) => Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>}[]} + */ +export declare const messageHandlers: { + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: LegacyMessage; + log: ServerLogger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; +}[]; +/** + * Return string as buffer + */ +export declare function generateNameBuffer(name: string, size: number): Buffer; +/** + * All personas + * NOTE: Currently we only support one persona per customer + * @type {import("../../interfaces/index.js").PersonaRecord[]} + */ +export declare const personaRecords: import("../../interfaces/index.js").PersonaRecord[]; +/** + * + * + * @param {object} args + * @param {string} args.connectionId + * @param {SerializedBuffer} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[], + * }>} + * @throws {Error} Unknown code was received + */ +export declare function receivePersonaData({ + connectionId, + message, + log, +}: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index 32aa6a2e5..20a6cac86 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -14,11 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { - ServerLogger, - LegacyMessage, - SerializedBuffer, -} from "@rustymotors/shared"; +import { ServerLogger, LegacyMessage, SerializedBuffer } from "../../shared"; import { PersonaList, diff --git a/packages/persona/test/getPersonasByPersonaId.test.d.ts b/packages/persona/test/getPersonasByPersonaId.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/persona/test/getPersonasByPersonaId.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/persona/test/getPersonasByPersonaId.test.ts b/packages/persona/test/getPersonasByPersonaId.test.ts index fe2841eb3..f8b64904c 100644 --- a/packages/persona/test/getPersonasByPersonaId.test.ts +++ b/packages/persona/test/getPersonasByPersonaId.test.ts @@ -1,4 +1,4 @@ -import { PersonaRecord } from "../../interfaces/index.js"; +import type { PersonaRecord } from "../../interfaces/index.js"; import { getPersonasByPersonaId } from "../src/getPersonasByPersonaId.js"; import { describe, it, expect } from "vitest"; @@ -23,6 +23,9 @@ describe("getPersonasByPersonaId", () => { // assert expect(result).toBeInstanceOf(Array); + if (result[0] === undefined) { + throw new Error("Expected result[0] to be defined"); + } expect(result[0].id.readInt32BE(0)).toBe(id); }); }); diff --git a/packages/shard/src/ShardServer.d.ts b/packages/shard/src/ShardServer.d.ts new file mode 100644 index 000000000..b36eb1315 --- /dev/null +++ b/packages/shard/src/ShardServer.d.ts @@ -0,0 +1,6 @@ +/** + * Generate a shard list web document + * + * @param {string} shardHost + */ +export declare function generateShardList(shardHost: string): string; diff --git a/packages/shard/src/ShardServer.ts b/packages/shard/src/ShardServer.ts index 57d8c23a0..2edc8fa24 100644 --- a/packages/shard/src/ShardServer.ts +++ b/packages/shard/src/ShardServer.ts @@ -49,7 +49,9 @@ export function generateShardList(shardHost: string) { /** @type {string[]} */ const activeShardList: string[] = []; - activeShardList.push(_possibleShards[0]); + if (typeof _possibleShards[0] !== "undefined") { + activeShardList.push(_possibleShards[0]); + } return activeShardList.join("\n"); } diff --git a/packages/shard/src/index.d.ts b/packages/shard/src/index.d.ts new file mode 100644 index 000000000..dedbc5660 --- /dev/null +++ b/packages/shard/src/index.d.ts @@ -0,0 +1,19 @@ +import { Configuration } from "../../shared"; +/** + * Read the TLS certificate file + * @param {TConfiguration} config + * @return {string} + */ +export declare function handleGetCert(config: Configuration): string; +/** + * Generate Windows registry configuration file for clients + * @param {TConfiguration} config + * @return {string} + */ +export declare function handleGetRegistry(config: Configuration): string; +/** + * Read TLS public key file to string + * @param {TConfiguration} config + * @return {string} + */ +export declare function handleGetKey(config: Configuration): string; diff --git a/packages/shard/src/index.ts b/packages/shard/src/index.ts index 397f9daa8..1c62b4e90 100644 --- a/packages/shard/src/index.ts +++ b/packages/shard/src/index.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { readFileSync } from "node:fs"; -import { Configuration } from "@rustymotors/shared"; +import { Configuration } from "../../shared"; // This section of the server can not be encrypted. This is an intentional choice for compatibility // deepcode ignore HttpToHttps: This is intentional. See above note. diff --git a/packages/shard/src/shard-entry.d.ts b/packages/shard/src/shard-entry.d.ts new file mode 100644 index 000000000..d75e60ddc --- /dev/null +++ b/packages/shard/src/shard-entry.d.ts @@ -0,0 +1,58 @@ +export declare class ShardEntry { + name: string; + description: string; + id: number; + loginServerIp: string; + loginServerPort: number; + lobbyServerIp: string; + lobbyServerPort: number; + mcotsServerIp: string; + statusId: number; + statusReason: string; + serverGroupName: string; + population: number; + maxPersonasPerUser: number; + diagnosticServerHost: string; + diagnosticServerPort: number; + /** + * + * @param {string} name + * @param {string} description + * @param {number} id + * @param {string} loginServerIp + * @param {number} loginServerPort + * @param {string} lobbyServerIp + * @param {number} lobbyServerPort + * @param {string} mcotsServerIp + * @param {number} statusId + * @param {string} statusReason + * @param {string} serverGroupName + * @param {number} population + * @param {number} maxPersonasPerUser + * @param {string} diagnosticServerHost + * @param {number} diagnosticServerPort + */ + constructor( + name: string, + description: string, + id: number, + loginServerIp: string, + loginServerPort: number, + lobbyServerIp: string, + lobbyServerPort: number, + mcotsServerIp: string, + statusId: number, + statusReason: string, + serverGroupName: string, + population: number, + maxPersonasPerUser: number, + diagnosticServerHost: string, + diagnosticServerPort: number, + ); + /** + * Return the entry in a formatted string + * + * @return {string} + */ + formatForShardList(): string; +} diff --git a/packages/shard/test/shard-entry.test.d.ts b/packages/shard/test/shard-entry.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/shard/test/shard-entry.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared-packets/index.d.ts b/packages/shared-packets/index.d.ts new file mode 100644 index 000000000..e2d19c773 --- /dev/null +++ b/packages/shared-packets/index.d.ts @@ -0,0 +1,2 @@ +export * from "./src/interfaces.js"; +export { GameMessage } from "./src/GameMessage.js"; diff --git a/packages/shared-packets/package.json b/packages/shared-packets/package.json index 8af357bac..ae2eb7ad3 100644 --- a/packages/shared-packets/package.json +++ b/packages/shared-packets/package.json @@ -6,8 +6,8 @@ "type": "module", "exports": { ".": { - "import": "./index.ts", - "require": "./index.ts" + "import": "./index.js", + "require": "./index.js" } }, "scripts": { diff --git a/packages/shared-packets/src/BasePacket.d.ts b/packages/shared-packets/src/BasePacket.d.ts new file mode 100644 index 000000000..243900334 --- /dev/null +++ b/packages/shared-packets/src/BasePacket.d.ts @@ -0,0 +1,18 @@ +/// +import type { ISerializable } from "./interfaces.js"; +export declare class Serializable implements ISerializable { + protected _data: Buffer; + protected _asHex(bytes: Buffer): string; + protected _assertEnoughData(data: Buffer, expected: number): void; + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + asHexString(): string; +} +export declare class BasePacket extends Serializable implements ISerializable { + private header; + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + asHexString(): string; +} diff --git a/packages/shared-packets/src/BasePacket.ts b/packages/shared-packets/src/BasePacket.ts index 4379ac35e..4edefd8f2 100644 --- a/packages/shared-packets/src/BasePacket.ts +++ b/packages/shared-packets/src/BasePacket.ts @@ -1,4 +1,4 @@ -import { ISerializable } from "./interfaces.js"; +import type { ISerializable } from "./interfaces.js"; export class Serializable implements ISerializable { protected _data: Buffer = Buffer.alloc(0); diff --git a/packages/shared-packets/src/GameMessage.d.ts b/packages/shared-packets/src/GameMessage.d.ts new file mode 100644 index 000000000..afb4adb91 --- /dev/null +++ b/packages/shared-packets/src/GameMessage.d.ts @@ -0,0 +1,44 @@ +/// +import { Serializable } from "./BasePacket.js"; +import type { ISerializable, IMessage } from "./interfaces.js"; +/** + * + */ +export declare class GameMessageHeader + extends Serializable + implements ISerializable +{ + private id; + private length; + private version; + constructor(version: 0 | 1); + getDataOffset(): number; + getByteSize(): number; + getVersion(): number; + getId(): number; + getLength(): number; + setVersion(version: 0 | 1): void; + setId(id: number): void; + setLength(length: number): void; + private serializeV0; + private serializeV1; + serialize(): Buffer; + private deserializeV0; + private deserializeV1; + deserialize(data: Buffer): GameMessageHeader; +} +export declare class GameMessage extends Serializable implements IMessage { + header: GameMessageHeader; + data: ISerializable; + constructor(version: 0 | 1); + getDataBuffer(): Buffer; + setDataBuffer(data: Buffer): void; + /** The message length is the length of the message data, not including the id */ + getByteSize(): number; + getData(): ISerializable; + setData(data: ISerializable): void; + serialize(): Buffer; + deserialize(data: Buffer): GameMessage; + toString(): string; + static identifyVersion(data: Buffer): 0 | 257; +} diff --git a/packages/shared-packets/src/GameMessage.ts b/packages/shared-packets/src/GameMessage.ts index 911f8c13e..2e55e0aca 100644 --- a/packages/shared-packets/src/GameMessage.ts +++ b/packages/shared-packets/src/GameMessage.ts @@ -1,5 +1,5 @@ import { Serializable } from "./BasePacket.js"; -import { ISerializable, IMessage } from "./interfaces.js"; +import type { ISerializable, IMessage } from "./interfaces.js"; /** * diff --git a/packages/shared-packets/src/ServerMessage.d.ts b/packages/shared-packets/src/ServerMessage.d.ts new file mode 100644 index 000000000..eedd58a04 --- /dev/null +++ b/packages/shared-packets/src/ServerMessage.d.ts @@ -0,0 +1,47 @@ +/// +import { Serializable } from "./BasePacket.js"; +import type { ISerializable, IMessage } from "./interfaces.js"; +/** + * + */ +export declare class ServerMessageHeader + extends Serializable + implements ISerializable +{ + private length; + private signature; + private sequence; + private flags; + getDataOffset(): number; + getByteSize(): number; + getLength(): number; + serialize(): Buffer; + deserialize(data: Buffer): ServerMessageHeader; + isValidSignature(): boolean; + isPayloadEncrypted(): boolean; + togglePayloadEncryption(): ServerMessageHeader; +} +export declare class ServerMessagePayload + extends Serializable + implements ISerializable +{ + private messageId; + getByteSize(): number; + serialize(): Buffer; + deserialize(data: Buffer): ServerMessagePayload; + getMessageId(): number; + setMessageId(messageId: number): ServerMessagePayload; +} +export declare class ServerMessage extends Serializable implements IMessage { + header: ServerMessageHeader; + data: ServerMessagePayload; + constructor(messageId: number); + getDataBuffer(): Buffer; + setDataBuffer(data: Buffer): ServerMessage; + /** The message length is the length of the message data, not including the id */ + getByteSize(): number; + getData(): ISerializable; + setData(data: ServerMessagePayload): ServerMessage; + serialize(): Buffer; + deserialize(data: Buffer): ServerMessage; +} diff --git a/packages/shared-packets/src/ServerMessage.ts b/packages/shared-packets/src/ServerMessage.ts index 7687e75fa..4f93377f5 100644 --- a/packages/shared-packets/src/ServerMessage.ts +++ b/packages/shared-packets/src/ServerMessage.ts @@ -1,5 +1,5 @@ import { Serializable } from "./BasePacket.js"; -import { ISerializable, IMessage } from "./interfaces.js"; +import type { ISerializable, IMessage } from "./interfaces.js"; /** * diff --git a/packages/shared-packets/src/interfaces.d.ts b/packages/shared-packets/src/interfaces.d.ts new file mode 100644 index 000000000..24f3846b1 --- /dev/null +++ b/packages/shared-packets/src/interfaces.d.ts @@ -0,0 +1,14 @@ +/// +export interface ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + asHexString(): string; +} +export interface IMessage extends ISerializable { + header: ISerializable; + getData(): ISerializable; + getDataBuffer(): Buffer; + setData(data: ISerializable): void; + setDataBuffer(data: Buffer): void; +} diff --git a/packages/shared/Configuration.d.ts b/packages/shared/Configuration.d.ts new file mode 100644 index 000000000..4e771b431 --- /dev/null +++ b/packages/shared/Configuration.d.ts @@ -0,0 +1,37 @@ +/** + * @module shared/Configuration + * @exports Configuration + */ +type ConfigurationArgs = { + host: string; + certificateFile: string; + privateKeyFile: string; + publicKeyFile: string; +}; +export declare class Configuration { + certificateFile: string; + privateKeyFile: string; + publicKeyFile: string; + host: string; + static instance: Configuration | undefined; + /** + * + * @param {object} args + * @param {string} args.host + * @param {string} args.certificateFile + * @param {string} args.privateKeyFile + * @param {string} args.publicKeyFile + * @param {string} args.logLevel + * @param {ServerLogger} args.logger + */ + constructor(options: ConfigurationArgs); +} +/** + * Get a singleton instance of Configuration + * + * @returns {Configuration} + */ +export declare function getServerConfiguration( + options: Partial, +): Configuration; +export {}; diff --git a/packages/shared/Configuration.ts b/packages/shared/Configuration.ts index 433248c85..92ded40f6 100644 --- a/packages/shared/Configuration.ts +++ b/packages/shared/Configuration.ts @@ -1,5 +1,3 @@ -import { ServerLogger, ServerLoggerLevels, getServerLogger } from "./log.js"; - /** * @module shared/Configuration * @exports Configuration diff --git a/packages/shared/MessageNode.d.ts b/packages/shared/MessageNode.d.ts new file mode 100644 index 000000000..771f5e8c9 --- /dev/null +++ b/packages/shared/MessageNode.d.ts @@ -0,0 +1,31 @@ +/// +import { SerializedBuffer } from "./messageFactory.js"; +export declare class MessageNode { + header: { + length: number; + mcoSig: string; + }; + seq: number; + flags: number; + data: Buffer; + msgNo: number; + constructor(); + /** + * @static + * @param {module:shared/RawMessage} rawMessage + * @return {MessageNode} + */ + static fromRawMessage(rawMessage: SerializedBuffer): MessageNode; + get size(): number; + /** + * + * @param {Buffer} packet + */ + deserialize(packet: Buffer): void; + /** + * + * @return {Buffer} + */ + serialize(): Buffer; + toString(): string; +} diff --git a/packages/shared/ServerMessage.test.d.ts b/packages/shared/ServerMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/shared/ServerMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared/State.d.ts b/packages/shared/State.d.ts new file mode 100644 index 000000000..4213abe58 --- /dev/null +++ b/packages/shared/State.d.ts @@ -0,0 +1,433 @@ +/** + * @fileoverview State management for the gateway server. + * @module shared/state + * @exports GatewayServer/State + * + */ +/// +/// +/// +import { Cipher, Decipher } from "crypto"; +import { SerializedBuffer } from "./messageFactory.js"; +import { Socket } from "node:net"; +/** + * @external RawMessage + * @see {@link "packages/shared/messageFactory.js.RawMessage"} + */ +/** + * State management for the gateway server. + * + * This file contains the state management for the gateway server. It is + * responsible for keeping track of the state of the server, including + * connections, encryption, and sessions. + * + * @example + * ```ts + * import { createInitialState, addSocket, removeSocket } from "./state.js"; + * + * const state = createInitialState(); + * + * const wrappedSocket = wrapSocket(socket, connectionId); + * + * + * + */ +/** + * @external crypto + * @see {@link https://nodejs.org/api/crypto.html} + */ +/** + * A pair of encryption ciphers. + */ +export declare class McosEncryptionPair { + _cipher: Cipher; + _decipher: Decipher; + /** + * Create a new encryption pair. + * + * This function creates a new encryption pair. It is used to encrypt and + * decrypt data sent to and from the client. + * + * @param {module:crypto.Cipher} cipher The cipher to use for encryption. + * @param {module:crypto.Decipher} decipher The decipher to use for decryption. + */ + constructor(cipher: Cipher, decipher: Decipher); + /** + * @param {Buffer} data The data to encrypt. + * @returns {Buffer} The encrypted data. + */ + encrypt(data: Buffer): Buffer; + /** + * @param {Buffer} data The data to decrypt. + * @returns {Buffer} The decrypted data. + */ + decrypt(data: Buffer): Buffer; +} +/** + * The encryption settings for a session. + */ +export declare class McosEncryption { + connectionId: string; + _commandEncryptionPair: McosEncryptionPair; + _dataEncryptionPair: McosEncryptionPair; + /** + * Create a new encryption object. + * + * @param {object} args + * @param {string} args.connectionId The connection id of the session that + * this encryption is for. + * @param {McosEncryptionPair} args.commandEncryptionPair The encryption + * pair for + * command packets. + * @param {McosEncryptionPair} args.dataEncryptionPair The encryption pair + * for data packets. + */ + constructor({ + connectionId, + commandEncryptionPair, + dataEncryptionPair, + }: { + connectionId: string; + commandEncryptionPair: McosEncryptionPair; + dataEncryptionPair: McosEncryptionPair; + }); + get commandEncryption(): McosEncryptionPair; + get dataEncryption(): McosEncryptionPair; +} +/** + * A client session. + */ +export declare class McosSession { + connectionId: string; + gameId: number; + /** + * Create a new session. + * + * @param {object} args + * @param {string} args.connectionId A unique identifier for this session. + * @param {number} args.username The username of the user who owns this + * session. + */ + constructor({ + connectionId, + gameId, + }: { + connectionId: string; + gameId: number; + }); +} +/** + * @external net + * @see {@link https://nodejs.org/api/net.html} + */ +/** + * A wrapped socket. + * + * This is a socket that has been wrapped with a connection id. + * @interface + */ +interface WrappedSocket { + socket: Socket; + connectionId: string; +} +/** + * Wrap a socket with a connection id. + * + * @param {module:NetConnectOpts.Socket} socket The socket to wrap. + * @param {string} connectionId The connection id to wrap the socket with. + * @returns {WrappedSocket} The wrapped socket. + */ +export declare function wrapSocket( + socket: Socket, + connectionId: string, +): WrappedSocket; +/** + * @requires module:packages/shared/RawMessage + */ +export interface ServiceResponse { + connectionId: string; + messages: SerializedBuffer[]; +} +export type OnDataHandler = Function; +/** + * @param {OnDataHandlerArgs} args The arguments for the handler. + * @returns {ServiceResponse} The + * response + * to the + * data. + */ +/** + * @param {State} state The state to save. + * @returns {void} + */ +/** + * The state of the gateway server. + * + * This is the state of the gateway server. It is responsible for keeping track + * of the state of the server, including connections, encryption, and sessions. + * @global + * @interface + */ +export interface State { + filePaths: Record; + sockets: Record; + encryptions: Record; + sessions: Record; + queuedConnections: Record; + onDataHandlers: Record; + save: (state?: State) => void; +} +/** + * Create the initial state. + * + * This function creates the initial state for the gateway server. + * You should call save on the returned state to save it to the database. + * + * @param {object} args + * @param {StateSaveFunction} [args.saveFunction=saveStateToDatabase] The + * save + * function + * to use. + * Defaults + * to + * saveStateToDatabase. + * @returns The initial state. + */ +export declare function createInitialState({ + saveFunction, +}: { + saveFunction?: (state: State) => void; +}): State; +/** + * 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 declare function addOnDataHandler( + state: State, + port: number, + handler: OnDataHandler, +): State; +/** + * 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 declare function getOnDataHandler( + state: State, + port: number, +): OnDataHandler | undefined; +/** + * Add a socket to the state. + * + * This function adds a socket 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 socket to. + * @param {WrappedSocket} socket The socket to add to the state. + * @returns {State} The state with the socket added. + */ +export declare function addSocket(state: State, socket: WrappedSocket): State; +/** + * Get a socket from the state. + * + * This function gets a socket from the state. + * + * @param {State} state The state to get the socket from. + * @param {string} connectionId The connection id of the socket to get. + * @returns {WrappedSocket | undefined} The socket with the given connection id, or undefined if no socket + */ +export declare function getSocket( + state: State, + connectionId: string, +): WrappedSocket | undefined; +/** + * Get all the sockets from the state. + * + * This function gets all the sockets from the state. + * + * @param {State} state The state to get the sockets from. + * @returns {Record} An array of all the sockets in the state. + */ +export declare function getSockets(state: State): Record; +/** + * Remove a socket from the state. + * + * This function removes a socket from 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 remove the socket from. + * @param {string} connectionId The connection id of the socket to remove. + * @returns {State} The state with the socket removed. + */ +export declare function removeSocket(state: State, connectionId: string): State; +/** + * Add a queued connection to the state. + * + * This function adds a queued connection 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 queued connection to. + * @param {WrappedSocket} socket The queued connection to add to the state. + * @returns {State} The state with the queued connection added. + */ +export declare function addQueuedConnection( + state: State, + socket: WrappedSocket, +): State; +/** + * Get queued connections from the state. + * + * This function gets all the queued connections from the state. + * + * @param {State} state The state to get the queued connections from. + * @returns {string[]} An array of all the queued connections in the state. + */ +export declare function getQueuedConnections(state: State): string[]; +/** + * Remove a queued connection from the state. + * + * This function removes a queued connection from 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 remove the queued connection from. + * @param {string} connectionId The connection id of the queued connection to remove. + * @returns {State} The state with the queued connection removed. + */ +export declare function removeQueuedConnection( + state: State, + connectionId: string, +): State; +/** + * Add an encryption to the state. + * + * This function adds an encryption 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 encryption to. + * @param {McosEncryption} encryption The encryption to add to the state. + * @returns {State} - The state with the encryption added. + */ +export declare function addEncryption( + state: State, + encryption: McosEncryption, +): State; +/** + * Get an encryption from the state. + * + * This function gets an encryption from the state. + * + * @param {State} state The state to get the encryption from. + * @param {string} connectionId The connection id of the encryption to get. + * @returns {McosEncryption | undefined} The encryption with the given connection id, or undefined if no encryption + */ +export declare function getEncryption( + state: State, + connectionId: string, +): McosEncryption | undefined; +/** + * Update an encryption in the state. + * + * This function updates an encryption in 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 update the encryption in. + * @param {McosEncryption} encryption The encryption to update in the state. + * @returns {State} The state with the encryption updated. + */ +export declare function updateEncryption( + state: State, + encryption: McosEncryption, +): State; +/** + * Remove an encryption from the state. + * + * This function removes an encryption from 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 remove the encryption from. + * @param {string} connectionId The connection id of the encryption to remove. + * @returns {State} The state with the encryption removed. + */ +export declare function removeEncryption( + state: State, + connectionId: string, +): State; +/** + * Add a session to the state. + * + * This function adds a session 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 session to. + * @param {McosSession} session The session to add to the state. + * @returns {State} The state with the session added. + */ +export declare function addSession(state: State, session: McosSession): State; +/** + * Remove a session from the state. + * + * This function removes a session from the state. It also removes the socket + * and encryption for the session. + * 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 remove the session from. + * @param {string} connectionId The connection id of the session to remove. + * @returns {State} The state with the session removed. + */ +export declare function removeSession( + state: State, + connectionId: string, +): State; +export declare function findSessionByConnectionId( + state: State, + connectionId: string, +): McosSession | undefined; +/** + * Fetch the state from the database. + * + * This function fetches the state from the database. + * + * @returns {State} The state from the database. + */ +export declare function fetchStateFromDatabase(): State; +export {}; diff --git a/packages/shared/SubThread.d.ts b/packages/shared/SubThread.d.ts new file mode 100644 index 000000000..32c879414 --- /dev/null +++ b/packages/shared/SubThread.d.ts @@ -0,0 +1,16 @@ +/** + * @module SubThread + */ +/// +import { EventEmitter } from "node:events"; +import type { TServerLogger } from "./types.js"; +export declare class SubThread extends EventEmitter { + name: any; + log: any; + loopInterval: number; + timer: any; + constructor(name: string, log: TServerLogger, loopInterval?: number); + init(): void; + run(): void; + shutdown(): void; +} diff --git a/packages/shared/SubThread.ts b/packages/shared/SubThread.ts index aad687735..711120900 100644 --- a/packages/shared/SubThread.ts +++ b/packages/shared/SubThread.ts @@ -3,7 +3,7 @@ */ import { EventEmitter } from "node:events"; -import { TServerLogger } from "./types.js"; +import type { TServerLogger } from "./types.js"; export class SubThread extends EventEmitter { name: any; diff --git a/packages/shared/Timestamp.d.ts b/packages/shared/Timestamp.d.ts new file mode 100644 index 000000000..d5182a58c --- /dev/null +++ b/packages/shared/Timestamp.d.ts @@ -0,0 +1,17 @@ +/// +import { SerializedBuffer } from "./messageFactory.js"; +export declare class Timestamp extends SerializedBuffer { + _year: number; + _month: number; + _day: number; + _hour: number; + _minute: number; + _second: number; + _fraction: number; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; + as64BitNumber(): number; + static now(): Timestamp; +} diff --git a/packages/shared/index.d.ts b/packages/shared/index.d.ts new file mode 100644 index 000000000..69f5dc93c --- /dev/null +++ b/packages/shared/index.d.ts @@ -0,0 +1,39 @@ +export { SubThread } from "./SubThread.js"; +export { NetworkMessage } from "./src/NetworkMessage.js"; +export { ServerLogger, getServerLogger } from "./log.js"; +export { Configuration, getServerConfiguration } from "./Configuration.js"; +export { + McosEncryptionPair, + createInitialState, + addOnDataHandler, + fetchStateFromDatabase, + getOnDataHandler, + addSocket, + removeSocket, + wrapSocket, + McosEncryption, + addEncryption, + getEncryption, + McosSession, + updateEncryption, + findSessionByConnectionId, + addSession, +} from "./State.js"; +export type { OnDataHandler, ServiceResponse, State } from "./State.js"; +export { + SerializedBuffer, + LegacyMessage, + MessageBuffer, + GameMessage, + serializeString, + NPSMessage, + deserializeString, + serializeStringRaw, + NPSHeader, + OldServerMessage, +} from "./messageFactory.js"; +export { RawMessage } from "./src/RawMessage.js"; +export { ServerMessage } from "./src/ServerMessage.js"; +export { MessageNode } from "./MessageNode.js"; +export type { TServerLogger, ServerMessageType } from "./types.js"; +export { Timestamp } from "./Timestamp.js"; diff --git a/packages/shared/log.d.ts b/packages/shared/log.d.ts new file mode 100644 index 000000000..f9a4d8874 --- /dev/null +++ b/packages/shared/log.d.ts @@ -0,0 +1,61 @@ +import * as P from "pino"; +export type ServerLoggerLevels = + | "fatal" + | "error" + | "warn" + | "info" + | "debug" + | "trace" + | "silent"; +type ServerLoggerOptions = { + level: ServerLoggerLevels; + name?: string; +}; +/** + * @static + * @property {ServerLogger} instance + */ +export declare class ServerLogger { + logger: P.Logger; + static instance: ServerLogger; + /** + * Creates an instance of ServerLogger. + * @param {ServerLoggerOptions} options + */ + constructor(options?: ServerLoggerOptions); + /** + * @param {string} message + */ + fatal(message: string): void; + /** + * @param {string} message + */ + error(message: string): void; + /** + * @param {string} message + */ + warn(message: string): void; + /** + * @param {string} message + */ + info(message: string): void; + /** + * @param {string} message + */ + debug(message: string): void; + /** + * @param {string} message + */ + trace(message: string): void; +} +/** + * Get a logger instance + * + * @param {ServerLoggerOptions} options + * @return {ServerLogger} + */ +export declare function getServerLogger( + options?: ServerLoggerOptions, +): ServerLogger; +export declare const log: ServerLogger; +export {}; diff --git a/packages/shared/messageFactory.d.ts b/packages/shared/messageFactory.d.ts new file mode 100644 index 000000000..fb1f31e6e --- /dev/null +++ b/packages/shared/messageFactory.d.ts @@ -0,0 +1,352 @@ +/** + * @module shared/messageFactory + * @description Holds the base classes for the various message types. + * The message types are: + * - LegacyMessage + * - NPSMessage + * - ServerMessage + * - RawMessage + */ +/// +/** + * @module shared/messageFactory + * @description Holds the base classes for the various message types. + * The message types are: + * - LegacyMessage + * - NPSMessage + * - ServerMessage + * - RawMessage + */ +import type { ServerMessageType } from "./types.js"; +/** + * @abstract + * @property {Buffer} data + * @property {number} Size + */ +declare class AbstractSerializable { + internalBuffer: Buffer; + constructor(); + _doSerialize(): void; + /** + * @param {Buffer} _buffer + * @returns {AbstractSerializable} + */ + _doDeserialize(_buffer: Buffer): AbstractSerializable; + get data(): Buffer; + /** + * @param {Buffer} buffer + */ + setBuffer(buffer: Buffer): void; + /** + * @returns {number} + */ + static get Size(): number; +} +/** + * @param {Buffer} buffer + * @returns {string} + */ +export declare function deserializeString(buffer: Buffer): string; +/** + * Serializes a string with length prefix + * @param {string} string + * @param {Buffer} targetBuffer + * @param {number} offset + * @returns {number} + */ +export declare function serializeString( + string: string, + targetBuffer: Buffer, + offset: number, +): number; +/** + * Serializes a raw string without length prefix + * @param {string} string + * @param {Buffer} targetBuffer + * @param {number} offset + * @param {number} length + * @returns {number} + */ +export declare function serializeStringRaw( + string: string, + targetBuffer: Buffer, + offset: number, + length: number, +): number; +declare const legacyHeader_base: typeof AbstractSerializable; +/** + * A legacy header is a 4 byte header with the following fields: + * - 2 bytes - id + * - 2 bytes - length + * + * + */ +declare class legacyHeader extends legacyHeader_base { + _size: number; + id: number; + length: any; + constructor(); + /** + * @param {Buffer} buffer + */ + _doDeserialize(buffer: Buffer): this; + _doSerialize(): Buffer; + toString(): string; + static get Size(): number; +} +/** + * A game message header is a 8 byte header with the following fields: + * - 2 bytes - id + * - 2 bytes - length + * - 2 bytes - gameMessageId + * - 2 bytes - gameMessageLength + */ +export declare class GameMessageHeader extends legacyHeader { + _gameMessageId: number; + _gameMessageLength: number; + constructor(gameMessageId: number); + size(): number; + deserialize(buffer: Buffer): this; + serialize(): Buffer; +} +declare const NPSHeader_base: typeof AbstractSerializable; +/** + * A nps header is a 12 byte header with the following fields: + * - 2 bytes - id + * - 2 bytes - length + * - 2 bytes - version + * - 2 bytes - reserved + * - 4 bytes - checksum + * + * @mixin {SerializableMixin} + */ +export declare class NPSHeader extends NPSHeader_base { + _size: number; + id: number; + length: number; + version: number; + reserved: number; + checksum: number; + constructor(); + /** + * @param {Buffer} buffer + * @returns {NPSHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + _doDeserialize(buffer: Buffer): NPSHeader; + _doSerialize(): Buffer; + static size(): number; + static get Size(): number; + toString(): string; +} +declare const serverHeader_base: typeof AbstractSerializable; +/** + * A server header is an 11 byte header with the following fields: + * - 2 bytes - length + * - 4 bytes - mcoSig + * - 4 bytes - sequence + * - 1 byte - flags + */ +export declare class serverHeader extends serverHeader_base { + _size: number; + length: any; + mcoSig: string; + sequence: number; + flags: number; + constructor(); + size(): number; + /** + * @param {Buffer} buffer + * @returns {serverHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + _doDeserialize(buffer: Buffer): serverHeader; + _doSerialize(): Buffer; + toString(): string; +} +declare const LegacyMessage_base: typeof AbstractSerializable; +/** + * A legacy message is an older nps message type. It has a 4 byte header. @see {@link legacyHeader} + * + * @mixin {SerializableMixin} + */ +export declare class LegacyMessage extends LegacyMessage_base { + _header: legacyHeader; + constructor(); + /** + * @param {Buffer} buffer + * @returns {LegacyMessage} + */ + _doDeserialize(buffer: Buffer): LegacyMessage; + deserialize(buffer: Buffer): LegacyMessage; + _doSerialize(): Buffer; + serialize(): Buffer; + /** + * @param {Buffer} buffer + */ + setBuffer(buffer: Buffer): void; + asJSON(): { + header: legacyHeader; + data: string; + }; + toString(): string; +} +declare const NPSMessage_base: typeof AbstractSerializable; +/** + * A NPS message is a message that matches version 1.1 of the nps protocol. It has a 12 byte header. @see {@link NPSHeader} + * + * @mixin {SerializableMixin} + */ +export declare class NPSMessage extends NPSMessage_base { + _header: NPSHeader; + constructor(); + /** + * @param {Buffer} buffer + * @returns {NPSMessage} + */ + _doDeserialize(buffer: Buffer): NPSMessage; + serialize(): Buffer; + size(): number; + toString(): string; +} +declare const SerializedBuffer_base: typeof AbstractSerializable; +/** + * A raw message is a message that is not parsed into a specific type. + * It has no header, and is just a serialized buffer. + * + * @mixin {SerializableMixin} + */ +export declare class SerializedBuffer extends SerializedBuffer_base { + constructor(); + /** + * @param {Buffer} buffer + * @returns {SerializedBuffer} + */ + _doDeserialize(buffer: Buffer): SerializedBuffer; + serialize(): Buffer; + toString(): string; + size(): number; +} +export declare class GameMessage extends SerializedBuffer { + _header: GameMessageHeader; + _recordData: Buffer; + constructor(gameMessageId: number); + setRecordData(buffer: Buffer): void; + /** @deprecated - Use setRecordData instead */ + setBuffer(buffer: Buffer): void; + /** @deprecated - Use deserialize instead */ + _doDeserialize(buffer: Buffer): SerializedBuffer; + deserialize(buffer: Buffer): this; + /** @deprecated - Use serialize instead */ + _doSerialize(): void; + serialize(): Buffer; + toString(): string; +} +/** + * A list message is a message that contains a list of items of a specific type. + * + * @mixin {SerializableMixin} + */ +export declare class ListMessage extends SerializedBuffer { + _msgNo: number; + _listCount: number; + _shouldExpectMoreMessages: boolean; + _list: SerializedBuffer[]; + constructor(); + /** + * @param {SerializedBuffer} item + */ + add(item: SerializedBuffer): void; + serialize(): Buffer; + size(): number; + getFirstItemSize(): number; + toString(): string; +} +export declare class MessageHeader extends SerializedBuffer { + _size: number; + _messageId: number; + _messageLength: number; + constructor(); + get messageId(): number; + get messageLength(): number; + serializeSizeOf(): number; + size(): number; + get id(): number; + get length(): number; + /** + * @param {Buffer} buffer + * @returns {MessageHeader} + */ + deserialize(buffer: Buffer): MessageHeader; + serialize(): Buffer; + /** + * @param {Buffer} buffer + * @returns {MessageHeader} + */ + _doDeserialize(buffer: Buffer): MessageHeader; + _doSerialize(): Buffer; + toString(): string; +} +export declare class MessageBuffer extends SerializedBuffer { + _header: MessageHeader; + _buffer: Buffer; + constructor(); + /** + * @param {number} id - The ID of the message + * @param {Buffer} buffer - The buffer to deserialize + * @returns {MessageBuffer} + */ + static createGameMessage(id: number, buffer: Buffer): MessageBuffer; + get messageId(): number; + get messageLength(): number; + get data(): Buffer; + set data(buffer: Buffer); + /** + * @param {Buffer} buffer + */ + set buffer(buffer: Buffer); + /** @param {Buffer} buffer */ + setBuffer(buffer: Buffer): Buffer; + get buffer(): Buffer; + serializeSizeOf(): number; + /** + * @param {Buffer} buffer + * @returns {MessageBuffer} + */ + deserialize(buffer: Buffer): MessageBuffer; + serialize(): Buffer; + toString(): string; + asJSON(): { + header: MessageHeader; + buffer: string; + }; +} +/** + * 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} + */ +export declare class OldServerMessage + extends SerializedBuffer + implements ServerMessageType +{ + _header: serverHeader; + _msgNo: number; + constructor(); + size(): number; + /** + * @param {Buffer} buffer + * @returns {OldServerMessage} + */ + _doDeserialize(buffer: Buffer): OldServerMessage; + serialize(): Buffer; + /** + * @param {Buffer} buffer + */ + setBuffer(buffer: Buffer): void; + updateMsgNo(): void; + toString(): string; +} +export {}; diff --git a/packages/shared/messageFactory.ts b/packages/shared/messageFactory.ts index 6e631ab60..22fb4ab13 100644 --- a/packages/shared/messageFactory.ts +++ b/packages/shared/messageFactory.ts @@ -8,7 +8,16 @@ * - RawMessage */ -import { ServerMessageType } from "./types.js"; +/** + * @module shared/messageFactory + * @description Holds the base classes for the various message types. + * The message types are: + * - LegacyMessage + * - NPSMessage + * - ServerMessage + * - RawMessage + */ +import type { ServerMessageType } from "./types.js"; /** * @abstract @@ -627,7 +636,7 @@ export class ListMessage extends SerializedBuffer { override serialize() { let neededSize; - if (this._list.length === 0) { + if (typeof this._list[0] === "undefined") { neededSize = 5; } else { neededSize = 5 + this._list.length * this._list[0].size(); @@ -649,7 +658,14 @@ export class ListMessage extends SerializedBuffer { } override size() { - return 5 + this._list.length * this._list[0].size(); + return 5 + this._list.length * this.getFirstItemSize(); + } + + getFirstItemSize() { + if (typeof this._list[0] === "undefined") { + return 0; + } + return this._list[0].size(); } override toString() { diff --git a/packages/shared/package.json b/packages/shared/package.json index 5f12c46a7..49c5a1a0c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -4,8 +4,8 @@ "description": "", "exports": { ".": { - "import": "./index.ts", - "require": "./index.ts" + "import": "./index.js", + "require": "./index.js" } }, "type": "module", diff --git a/packages/shared/src/BaseSerialized.d.ts b/packages/shared/src/BaseSerialized.d.ts new file mode 100644 index 000000000..a34ce7dfe --- /dev/null +++ b/packages/shared/src/BaseSerialized.d.ts @@ -0,0 +1,24 @@ +/// +export interface Serializable { + data: Buffer; + serialize(): Buffer; + deserialize(buffer: Buffer): Serializable; + length: number; + toString(): string; + asHex(): string; +} +/** + * Base class for all serialized objects + * Just a wrapper around a buffer + */ +export declare class BaseSerialized implements Serializable { + protected _data: Buffer; + constructor(data?: Buffer); + get data(): Buffer; + set data(data: Buffer); + serialize(): Buffer; + deserialize(buffer: Buffer): Serializable; + get length(): number; + toString(): string; + asHex(): string; +} diff --git a/packages/shared/src/NetworkMessage.d.ts b/packages/shared/src/NetworkMessage.d.ts new file mode 100644 index 000000000..c027d29f1 --- /dev/null +++ b/packages/shared/src/NetworkMessage.d.ts @@ -0,0 +1,24 @@ +/// +import { SerializedBuffer } from "./SerializedBuffer.js"; +/** + * A serialized buffer, with the following fields: + * - 2-byte message id + * - 2-byte total length + * - 2-byte version + * - 2-byte reserved + * - 4-byte checksum (which is the size) + * - data + */ +export declare class NetworkMessage extends SerializedBuffer { + private _messageId; + version: number; + reserved: number; + private _checksum; + constructor(messageId: number, data?: Buffer); + serialize(): Buffer; + deserialize(buffer: Buffer): this; + set data(data: Buffer); + get messageId(): number; + get length(): number; + asHex(): string; +} diff --git a/packages/shared/src/RawMessage.d.ts b/packages/shared/src/RawMessage.d.ts new file mode 100644 index 000000000..081b4f67d --- /dev/null +++ b/packages/shared/src/RawMessage.d.ts @@ -0,0 +1,14 @@ +/// +import { SerializedBuffer } from "./SerializedBuffer.js"; +/** + * A serialized buffer, prefixed with a 2-byte message id and a 2-byte total length. + */ +export declare class RawMessage extends SerializedBuffer { + private _messageId; + constructor(messageId: number, data?: Buffer); + serialize(): Buffer; + deserialize(buffer: Buffer): this; + get messageId(): number; + get length(): number; + asHex(): string; +} diff --git a/packages/shared/src/SerializedBuffer.d.ts b/packages/shared/src/SerializedBuffer.d.ts new file mode 100644 index 000000000..b4db92227 --- /dev/null +++ b/packages/shared/src/SerializedBuffer.d.ts @@ -0,0 +1,10 @@ +/// +import { BaseSerialized } from "./BaseSerialized.js"; +/** + * A serialized buffer, prefixed with its 2-byte length. + */ +export declare class SerializedBuffer extends BaseSerialized { + constructor(data?: Buffer); + serialize(): Buffer; + deserialize(buffer: Buffer): this; +} diff --git a/packages/shared/src/ServerMessage.d.ts b/packages/shared/src/ServerMessage.d.ts new file mode 100644 index 000000000..5cea2aaab --- /dev/null +++ b/packages/shared/src/ServerMessage.d.ts @@ -0,0 +1,33 @@ +/// +import { SerializedBuffer } from "./SerializedBuffer.js"; +declare class HeaderShim { + private _realObject; + constructor(realObject: ServerMessage); + get flags(): number; + set flags(value: number); +} +/** + * A serialized buffer, with the following fields: + * - 2-byte total length + * - 4-byte signature (TOMC) + * - 4-byte sequence number + * - 1-byte flags + * - data + */ +export declare class ServerMessage extends SerializedBuffer { + private _signature; + private _sequence; + private _flags; + _header: HeaderShim; + constructor(sequence?: number, flags?: number, data?: Buffer); + serialize(): Buffer; + deserialize(buffer: Buffer): this; + get data(): Buffer; + set data(data: Buffer); + setBuffer(buffer: Buffer): void; + get length(): number; + asHex(): string; + get flags(): number; + set flags(value: number); +} +export {}; diff --git a/packages/shared/structs.d.ts b/packages/shared/structs.d.ts new file mode 100644 index 000000000..801ca136b --- /dev/null +++ b/packages/shared/structs.d.ts @@ -0,0 +1,74 @@ +/// +export interface Serialized { + serialize(): Buffer; + deserialize(buf: Buffer): void; + sizeOf(): number; +} +export declare class Header implements Serialized { + messageCode: number; + messageLength: number; + messageVersion: number; + readonly reserved = 0; + messageChecksum: number; + sizeOf(): number; + clear(): void; + serialize(): Buffer; + deserialize(buf: Buffer): void; +} +export declare class SerializedBase implements Serialized { + protected header: Header | null; + deserialize(_buff: Buffer): Buffer; + serialize(): Buffer; + sizeOf(): number; +} +export declare class UserStatus extends SerializedBase implements Serialized { + v2P320: number; + v2P321: number; + v2P1288: number; + v2P32: number; + v2P656: number; + v2P1292: number; + v2P341: number; + v2P1368: number; + sizeOf(): number; + serialize(): Buffer; + deserialize(_buff: Buffer): Buffer; +} +export declare class GetPersonaMapListRequest + extends SerializedBase + implements Serialized {} +export declare class SerializedList + extends SerializedBase + implements Serialized {} +export declare class Persona extends SerializedBase implements Serialized {} +export declare class SessionKey extends SerializedBase implements Serialized {} +export declare class UserAction extends SerializedBase implements Serialized {} +export declare class LoginRequestReply + extends SerializedBase + implements Serialized +{ + sessionKey: string; + setContext(context: string): void; + _doSerialize(): Buffer; + _serializeSizeOf(): number; +} +export declare class GameLogin extends SerializedBase implements Serialized {} +export declare class GameLoginReply + extends SerializedBase + implements Serialized {} +export declare class GetPersonaInfoRequest + extends SerializedBase + implements Serialized {} +export declare class UserStatusRequest + extends SerializedBase + implements Serialized {} +export declare class AddPersona extends SerializedBase implements Serialized {} +export declare class Login extends LoginRequestReply implements Serialized { + v2P82: boolean; + encryptedSessionKey: string; + readonly GAME_CODE = "2176"; + v2P187: boolean; + serialize(): Buffer; + serializeSizeOf(): number; + deserialize(buf: Buffer): Buffer; +} diff --git a/packages/shared/test/BaseSerialized.test.d.ts b/packages/shared/test/BaseSerialized.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/shared/test/BaseSerialized.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared/test/RawMessage.test.d.ts b/packages/shared/test/RawMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/shared/test/RawMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared/test/SerializedBuffer.test.d.ts b/packages/shared/test/SerializedBuffer.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/shared/test/SerializedBuffer.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared/types.d.ts b/packages/shared/types.d.ts new file mode 100644 index 000000000..2e4677e98 --- /dev/null +++ b/packages/shared/types.d.ts @@ -0,0 +1,21 @@ +/// +import { serverHeader } from "./messageFactory.js"; +export interface ServerMessageType { + _header: serverHeader; + _msgNo: number; + size(): number; + _doDeserialize(buffer: Buffer): ServerMessageType; + serialize(): Buffer; + setBuffer(buffer: Buffer): void; + updateMsgNo(): void; + toString(): string; + data: Buffer; +} +export type TServerLogger = { + info: (message: string) => void; + error: (message: string) => void; + fatal: (message: string) => void; + warn: (message: string) => void; + debug: (message: string) => void; + trace: (message: string) => void; +}; diff --git a/packages/transactions/src/ArcadeCarMessage.d.ts b/packages/transactions/src/ArcadeCarMessage.d.ts new file mode 100644 index 000000000..64ec80afc --- /dev/null +++ b/packages/transactions/src/ArcadeCarMessage.d.ts @@ -0,0 +1,29 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * A message listing the lobbies + * This is the body of a MessageNode + */ +export declare class ArcadeCarMessage extends SerializedBuffer { + _msgNo: number; + _carCount: number; + _shouldExpectMoreMessages: boolean; + _carList: ArcadeCarInfo[]; + constructor(); + size(): number; + /** + * Add a lobby to the list + * @param {ArcadeCarInfo} lobby + */ + addCar(lobby: ArcadeCarInfo): void; + serialize(): Buffer; + toString(): string; +} +export declare class ArcadeCarInfo extends SerializedBuffer { + _brandedPartId: number; + _lobbyId: number; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/ArcadeCarMessage.ts b/packages/transactions/src/ArcadeCarMessage.ts index 0b389dc4d..94a208fbd 100644 --- a/packages/transactions/src/ArcadeCarMessage.ts +++ b/packages/transactions/src/ArcadeCarMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; /** * A message listing the lobbies diff --git a/packages/transactions/src/EntryFeePurseMessage.d.ts b/packages/transactions/src/EntryFeePurseMessage.d.ts new file mode 100644 index 000000000..0cb0dde81 --- /dev/null +++ b/packages/transactions/src/EntryFeePurseMessage.d.ts @@ -0,0 +1,35 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * A message listing the entry fees and purses for each entry fee + * This is the body of a MessageNode + */ +export declare class EntryFeePurseMessage extends SerializedBuffer { + _msgNo: number; + _numberOfPurseEntries: number; + _shouldExpectMoreMessages: boolean; + _purseEntries: PurseEntry[]; + constructor(); + size(): number; + /** + * Add a lobby to the list + * @param {PurseEntry} lobby + */ + addEntry(purseEntry: PurseEntry): void; + serialize(): Buffer; + toString(): string; +} +export declare class PurseEntry extends SerializedBuffer { + _entryFee: number; + _purse: number; + constructor(); + size(): number; + /** + * Deserialize the data + * + * @param {Buffer} data + */ + deserialize(data: Buffer): this; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/EntryFeePurseMessage.ts b/packages/transactions/src/EntryFeePurseMessage.ts index 55e5793a6..1240130ad 100644 --- a/packages/transactions/src/EntryFeePurseMessage.ts +++ b/packages/transactions/src/EntryFeePurseMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; /** * A message listing the entry fees and purses for each entry fee diff --git a/packages/transactions/src/GameUrlsMessage.d.ts b/packages/transactions/src/GameUrlsMessage.d.ts new file mode 100644 index 000000000..91d150037 --- /dev/null +++ b/packages/transactions/src/GameUrlsMessage.d.ts @@ -0,0 +1,29 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * A message listing the lobbies + * This is the body of a MessageNode + */ +export declare class GameUrlsMessage extends SerializedBuffer { + _msgNo: number; + _urlCount: number; + _shouldExpectMoreMessages: boolean; + _urlList: GameUrl[]; + constructor(); + size(): number; + /** + * Add a lobby to the list + * @param {GameUrl} lobby + */ + addURL(lobby: GameUrl): void; + serialize(): Buffer; + toString(): string; +} +export declare class GameUrl extends SerializedBuffer { + _urlId: number; + urlRef: string; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/GameUrlsMessage.ts b/packages/transactions/src/GameUrlsMessage.ts index 2f3dda070..6077fb23a 100644 --- a/packages/transactions/src/GameUrlsMessage.ts +++ b/packages/transactions/src/GameUrlsMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer, serializeString } from "@rustymotors/shared"; +import { SerializedBuffer, serializeString } from "../../shared"; /** * A message listing the lobbies diff --git a/packages/transactions/src/GenericReplyMessage.d.ts b/packages/transactions/src/GenericReplyMessage.d.ts new file mode 100644 index 000000000..32200a4f1 --- /dev/null +++ b/packages/transactions/src/GenericReplyMessage.d.ts @@ -0,0 +1,67 @@ +/** + * @class + * @property {number} msgNo + * @property {number} toFrom + * @property {number} appId + * @property {number} msgReply + * @property {Buffer} result + * @property {Buffer} data + * @property {Buffer} data2 + */ +/// +import { SerializedBuffer } from "../../shared"; +export declare class GenericReply extends SerializedBuffer { + msgNo: number; + msgReply: number; + result: number; + data2: Buffer; + rawBuffer: Buffer; + constructor(); + serialize(): Buffer; + asJSON(): { + msgNo: number; + msgReply: number; + result: number; + data: string; + data2: string; + }; + toString(): string; +} +export declare class GenericReplyMessage extends SerializedBuffer { + msgNo: number; + msgReply: number; + result: number; + data1: number; + data2: number; + /** + * One of + * + * * MC_SUCCESS = 101 : Used with GenericReply structure to indicate that the request succeeded + * + * * MC_FAILED = 102 : Used with GenericReply structure to indicate that the request failed + * + * * MC_GENERIC_REPLY : Used with GenericReply structure for messages that return data + */ + constructor(); + setResult(buffer: number): void; + setData1(value: number): void; + setData2(value: number): void; + /** + * + * @param {Buffer} buffer + * @return {GenericReplyMessage} + */ + static deserialize(buffer: Buffer): GenericReplyMessage; + /** + * @override + * @return {Buffer} + */ + serialize(): Buffer; + /** + * DumpPacket + * @return {string} + */ + dumpPacket(): string; + toString(): string; + size(): number; +} diff --git a/packages/transactions/src/GenericReplyMessage.ts b/packages/transactions/src/GenericReplyMessage.ts index 348396cb7..ff5d34b9d 100644 --- a/packages/transactions/src/GenericReplyMessage.ts +++ b/packages/transactions/src/GenericReplyMessage.ts @@ -14,7 +14,7 @@ * @property {Buffer} data2 */ -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; export class GenericReply extends SerializedBuffer { msgNo: number; diff --git a/packages/transactions/src/GenericRequestMessage.d.ts b/packages/transactions/src/GenericRequestMessage.d.ts new file mode 100644 index 000000000..178e22793 --- /dev/null +++ b/packages/transactions/src/GenericRequestMessage.d.ts @@ -0,0 +1,32 @@ +/** + * + * + * @class + * @property {number} msgNo + * @property {Buffer} data + * @property {Buffer} data2 + * @property {string} serviceName + */ +/// +import { MessageNode } from "../../shared"; +export declare class GenericRequestMessage extends MessageNode { + data2: Buffer; + /** + * + */ + constructor(); + /** + * @override + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer): void; + /** + * @override + * @return {Buffer} + */ + serialize(): Buffer; + /** + * @override + */ + toString(): string; +} diff --git a/packages/transactions/src/GenericRequestMessage.ts b/packages/transactions/src/GenericRequestMessage.ts index 0817782ae..f4fb3a9a3 100644 --- a/packages/transactions/src/GenericRequestMessage.ts +++ b/packages/transactions/src/GenericRequestMessage.ts @@ -11,7 +11,7 @@ * @property {string} serviceName */ -import { MessageNode } from "@rustymotors/shared"; +import { MessageNode } from "../../shared"; export class GenericRequestMessage extends MessageNode { data2: Buffer; diff --git a/packages/transactions/src/LobbyMessage.d.ts b/packages/transactions/src/LobbyMessage.d.ts new file mode 100644 index 000000000..93003b0e6 --- /dev/null +++ b/packages/transactions/src/LobbyMessage.d.ts @@ -0,0 +1,128 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * A message listing the lobbies + * This is the body of a MessageNode + */ +export declare class LobbyMessage extends SerializedBuffer { + _msgNo: number; + _lobbyCount: number; + _shouldExpectMoreMessages: boolean; + _lobbyList: LobbyInfo[]; + constructor(); + size(): number; + /** + * Add a lobby to the list + * @param {LobbyInfo} lobby + */ + addLobby(lobby: LobbyInfo): void; + serialize(): Buffer; + toString(): string; +} +export declare class LobbyInfo extends SerializedBuffer { + _lobbyId: number; + _raceTypeId: number; + _terfId: number; + _lobbyName: string; + _turfName: string; + _clientArt: string; + _elementId: number; + _turfLengthId: number; + _startSlice: number; + _endSlice: number; + _dragStageLeft: number; + _dragStageRight: number; + _dragStagingSlice: number; + _gridSpreadFactor: number; + _linear: number; + _minNumberPlayers: number; + _maxNumberPlayers: number; + _defaultNumberPlayers: number; + _numberOfPlayersEnabled: boolean; + _minLaps: number; + _maxLaps: number; + _defaultNumberOfLaps: number; + _numberOfLapsEnabled: boolean; + _minNumberRounds: number; + _maxNumberRounds: number; + _defaultNumberRounds: number; + _numberOfRoundsEnabled: boolean; + _defaultWeather: number; + _weatherEnabled: boolean; + _defaultNight: number; + _nightEnabled: boolean; + _defaultBackwards: boolean; + _backwardsEnabled: boolean; + _defaultTraffic: boolean; + _trafficEnabled: boolean; + _defaultDriverAI: boolean; + _driverAIEnabled: boolean; + _topDog: string; + _turfOwner: string; + _qualifyingTime: number; + _numberOfClubPlayers: number; + _numberofClubLaps: number; + _numberOfClubRounds: number; + _clubNight: number; + _clubWeather: number; + _clubBackwards: number; + _bestLapTime: number; + _lobbyDifficulty: number; + _timetrialPointsToQualify: number; + _timetrialCashToQualify: number; + _timetrialPointsBonusIncrements: number; + _timetrialCashBonusIncrements: number; + _timetrialTimeIncrements: number; + _timetrial1stPlaceVictoryPoints: number; + _timetrial1stPlaceVictoryCash: number; + _timetrial2ndPlaceVictoryPoints: number; + _timetrial2ndPlaceVictoryCash: number; + _timetrial3rdPlaceVictoryPoints: number; + _timetrial3rdPlaceVictoryCash: number; + _minLevel: number; + _minResetSlice: number; + _maxResetSlice: number; + _newbieFlag: number; + _driverHelmetFlag: number; + _clubMaxNumberPlayers: number; + _clubMinNumberPlayers: number; + _clubNumberPlayersDefault: number; + _minNumberOfClubs: number; + _maxNumberOfClubs: number; + _racePointsFactor: number; + _maxBodyClass: number; + _maxPowerClass: number; + _partsPrizeMax: number; + _partsPrizeWon: number; + _clubLogoId: number; + _teamTrialsWeatherFlag: boolean; + _teamTrialsNightFlag: boolean; + _teamTrialsBackwardsFlag: boolean; + _teamTrialsNumberLaps: number; + _teamTrialsBaseTimeUnderPar: number; + _raceCashFactor: number; + constructor(); + /** + * Deserialize a 2 byte boolean + * + * @param {Buffer} data + * @returns {boolean} + */ + deserializeBool(data: Buffer): boolean; + /** + * Serialize a 2 byte boolean + * + * @param {number} value + * @returns {Buffer} + */ + serializeBool(value: number): Buffer; + size(): number; + /** + * Deserialize the data + * + * @param {Buffer} data + */ + deserialize(data: Buffer): this; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/LobbyMessage.ts b/packages/transactions/src/LobbyMessage.ts index bd1799246..ed4fd8452 100644 --- a/packages/transactions/src/LobbyMessage.ts +++ b/packages/transactions/src/LobbyMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; /** * A message listing the lobbies diff --git a/packages/transactions/src/OwnedVehiclesMessage.d.ts b/packages/transactions/src/OwnedVehiclesMessage.d.ts new file mode 100644 index 000000000..ada81ffca --- /dev/null +++ b/packages/transactions/src/OwnedVehiclesMessage.d.ts @@ -0,0 +1,28 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * A message listing the player's owned vehicles + * This is the body of a MessageNode + */ +export declare class OwnedVehiclesMessage extends SerializedBuffer { + _msgNo: number; + _numberOfVehicles: number; + _vehicleList: OwnedVehicle[]; + constructor(); + size(): number; + /** + * Add a lobby to the list + * @param {GameUrl} lobby + */ + addVehicle(vehicle: OwnedVehicle): void; + serialize(): Buffer; + toString(): string; +} +export declare class OwnedVehicle extends SerializedBuffer { + _vehicleId: number; + _brandedPartId: number; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/OwnedVehiclesMessage.ts b/packages/transactions/src/OwnedVehiclesMessage.ts index 10367cf79..2436ec3bd 100644 --- a/packages/transactions/src/OwnedVehiclesMessage.ts +++ b/packages/transactions/src/OwnedVehiclesMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; /** * A message listing the player's owned vehicles diff --git a/packages/transactions/src/PartsAssemblyMessage.d.ts b/packages/transactions/src/PartsAssemblyMessage.d.ts new file mode 100644 index 000000000..4fa798732 --- /dev/null +++ b/packages/transactions/src/PartsAssemblyMessage.d.ts @@ -0,0 +1,27 @@ +/// +import { SerializedBuffer } from "../../shared"; +export declare class PartsAssemblyMessage extends SerializedBuffer { + _msgNo: number; + _ownerId: number; + _numberOfParts: number; + _partList: Part[]; + constructor(owerId: number); + size(): number; + serialize(): Buffer; +} +export declare class Part extends SerializedBuffer { + _partId: number; + _parentPartId: number; + _brandedPartId: number; + _repairPrice: number; + _junkPrice: number; + _wear: number; + _attachmentPoint: number; + _damage: number; + _retailPrice: number; + _maxWear: number; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/PartsAssemblyMessage.ts b/packages/transactions/src/PartsAssemblyMessage.ts index b411927f1..3e2a294e3 100644 --- a/packages/transactions/src/PartsAssemblyMessage.ts +++ b/packages/transactions/src/PartsAssemblyMessage.ts @@ -1,4 +1,4 @@ -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; export class PartsAssemblyMessage extends SerializedBuffer { _msgNo: number; diff --git a/packages/transactions/src/PlayerInfoMessage.d.ts b/packages/transactions/src/PlayerInfoMessage.d.ts new file mode 100644 index 000000000..ca284f208 --- /dev/null +++ b/packages/transactions/src/PlayerInfoMessage.d.ts @@ -0,0 +1,50 @@ +/// +import { SerializedBuffer } from "../../shared"; +import { Timestamp } from "../../shared"; +/** + * A message listing the player's owned vehicles + * This is the body of a MessageNode + */ +export declare class PlayerInfoMessage extends SerializedBuffer { + _msgNo: number; + _playerId: number; + _playerName: string; + _driversLicense: string; + _driverClass: number; + _bankBalance: number; + _numberOfVehicles: number; + _isLoggedOn: boolean; + _carsList: string[]; + _licensesPlateCode: number; + _licensesPlateText: string; + _carInfoSetttings: number; + _vehicleId: number; + _numberOfRacesEntered: number; + _numberOfRacesWon: number; + _numberOfRacesCompleted: number; + _totalWinings: number; + _insuranceRisk: number; + _insurancePoints: number; + _challengeRacesEntered: number; + _challengeRacesWon: number; + _challengeRacesCompleted: number; + _numberofCarsWon: number; + _numberOfCarsLost: number; + _points: number; + _currentLevel: number; + _currentRank: number; + _numberOfPointsToNextLevel: number; + _numberOfPointsToNextRank: number; + _maxInventorySlots: number; + _numberOfInventorySlotsUsed: number; + _numberOfInventoryIemsOnAuction: number; + _highestBidInAuction: number; + _currentClub: number; + _dateLeftClub: Timestamp; + _canBeInvitedToClub: boolean; + _playerDescription: string; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/PlayerInfoMessage.ts b/packages/transactions/src/PlayerInfoMessage.ts index da7ec13cb..e6de774d4 100644 --- a/packages/transactions/src/PlayerInfoMessage.ts +++ b/packages/transactions/src/PlayerInfoMessage.ts @@ -14,8 +14,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer, serializeStringRaw } from "@rustymotors/shared"; -import { Timestamp } from "@rustymotors/shared"; +import { SerializedBuffer, serializeStringRaw } from "../../shared"; +import { Timestamp } from "../../shared"; /** * A message listing the player's owned vehicles diff --git a/packages/transactions/src/PlayerPhysicalMessage.d.ts b/packages/transactions/src/PlayerPhysicalMessage.d.ts new file mode 100644 index 000000000..c3e4f341f --- /dev/null +++ b/packages/transactions/src/PlayerPhysicalMessage.d.ts @@ -0,0 +1,16 @@ +/// +import { SerializedBuffer } from "../../shared"; +export declare class PlayerPhysicalMessage extends SerializedBuffer { + _msgNo: number; + _playerId: number; + _bodytype: number; + _hairColor: number; + _skinColor: number; + _shirtColor: number; + _pantsColor: number; + constructor(); + size(): number; + serialize(): Buffer; + deserialize(buffer: Buffer): void; + toString(): string; +} diff --git a/packages/transactions/src/PlayerPhysicalMessage.ts b/packages/transactions/src/PlayerPhysicalMessage.ts index 235b6aa71..dedb0634e 100644 --- a/packages/transactions/src/PlayerPhysicalMessage.ts +++ b/packages/transactions/src/PlayerPhysicalMessage.ts @@ -1,4 +1,4 @@ -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; export class PlayerPhysicalMessage extends SerializedBuffer { _msgNo: number; // 2 bytes diff --git a/packages/transactions/src/PlayerRacingHistoryMessage.d.ts b/packages/transactions/src/PlayerRacingHistoryMessage.d.ts new file mode 100644 index 000000000..121f3fab4 --- /dev/null +++ b/packages/transactions/src/PlayerRacingHistoryMessage.d.ts @@ -0,0 +1,30 @@ +/// +import { SerializedBuffer } from "../../shared"; +export declare class PlayerRacingHistoryMessage extends SerializedBuffer { + _msgId: number; + _userId: number; + _numRaces: number; + _expectMore: boolean; + _raceHistoryRecords: RacingHistoryRecordEntry[]; + constructor(); + size(): number; + addRecord(record: RacingHistoryRecordEntry): void; + deserialize(buffer: Buffer): PlayerRacingHistoryMessage; + serialize(): Buffer; + asString(): string; +} +export declare class RacingHistoryRecordEntry extends SerializedBuffer { + raceType: number; + numberOfRacesEntered: number; + numberOfRacesFinished: number; + numberOfRacesWon: number; + numberOfCarsWon: number; + numberOfCarsLost: number; + numberOfChampionshipsWon: number; + cashWon: number; + constructor(); + size(): number; + serialize(): Buffer; + deserialize(buffer: Buffer): RacingHistoryRecordEntry; + asString(): string; +} diff --git a/packages/transactions/src/PlayerRacingHistoryMessage.ts b/packages/transactions/src/PlayerRacingHistoryMessage.ts index 328fb1cc9..158bb92b1 100644 --- a/packages/transactions/src/PlayerRacingHistoryMessage.ts +++ b/packages/transactions/src/PlayerRacingHistoryMessage.ts @@ -1,4 +1,5 @@ -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; +import type { RacingHistoryRecord } from "./_getPlayerRaceHistory"; export class PlayerRacingHistoryMessage extends SerializedBuffer { _msgId: number; // 2 bytes @@ -58,7 +59,13 @@ export class PlayerRacingHistoryMessage extends SerializedBuffer { buffer.writeInt8(this._expectMore ? 1 : 0, offset); offset += 1; for (let i = 0; i < this._numRaces; i++) { - this._raceHistoryRecords[i].serialize().copy(buffer, offset); + if (typeof this._raceHistoryRecords[i] === "undefined") { + break; + } + + (this._raceHistoryRecords[i] as RacingHistoryRecordEntry) + .serialize() + .copy(buffer, offset); offset += 32; } @@ -68,7 +75,11 @@ export class PlayerRacingHistoryMessage extends SerializedBuffer { asString(): string { let result = `PlayerRacingHistoryMessage: MsgId: ${this._msgId}, UserId: ${this._userId}, NumRaces: ${this._numRaces}, ExpectMore: ${this._expectMore}`; for (let i = 0; i < this._numRaces; i++) { - result += `\n${this._raceHistoryRecords[i].asString()}`; + if (typeof this._raceHistoryRecords[i] === "undefined") { + result += "\nNo more records"; + } + + result += `\n${(this._raceHistoryRecords[i] as RacingHistoryRecordEntry).asString()}`; } return result; diff --git a/packages/transactions/src/StockCar.d.ts b/packages/transactions/src/StockCar.d.ts new file mode 100644 index 000000000..7dcf4d564 --- /dev/null +++ b/packages/transactions/src/StockCar.d.ts @@ -0,0 +1,34 @@ +/** + * Container object for Stock cars + */ +/** + * @class + * @property {number} brandedPartId + * @property {number} retailPrice + * @property {0 | 1} bIsDealOfTheDay + */ +/// +export declare class StockCar { + brandedPartId: number; + retailPrice: number; + bIsDealOfTheDay: boolean; + /** + * @param {number} brandedPartId + * @param {number} retailPrice + * @param {boolean} bIsDealOfTheDay + */ + constructor( + brandedPartId: number, + retailPrice: number, + bIsDealOfTheDay: boolean, + ); + /** + * + * @return {Buffer} + */ + serialize(): Buffer; + /** + * @return {string} + */ + toString(): string; +} diff --git a/packages/transactions/src/StockCarInfoMessage.d.ts b/packages/transactions/src/StockCarInfoMessage.d.ts new file mode 100644 index 000000000..f9dfb4b62 --- /dev/null +++ b/packages/transactions/src/StockCarInfoMessage.d.ts @@ -0,0 +1,48 @@ +/** + * Object for providing information on stock cars + */ +/** + * @class + * @property {number} msgNo + * @property {number} starterCash + * @property {number} dealerId + * @property {number} brand + * @property {number} noCars + * @property {number} moreToCome + * @property {StockCar[]} StockCarList + */ +/// +import { MessageNode } from "../../shared"; +type StockCar = import("./StockCar.js").StockCar; +export declare class StockCarInfoMessage extends MessageNode { + starterCash: number; + dealerId: number; + brand: number; + noCars: number; + moreToCome: boolean; + StockCarList: StockCar[]; + /** + * Creates an instance of StockCarInfoMsg. + * @class + * @param {number} starterCash + * @param {number} dealerId + * @param {number} brand + * @memberof StockCarInfoMsg + */ + constructor(starterCash: number, dealerId: number, brand: number); + /** + * + * @param {StockCar} car + */ + addStockCar(car: StockCar): void; + /** + * @override + * @return {Buffer} + */ + serialize(): Buffer; + /** + * @override + */ + toString(): string; +} +export {}; diff --git a/packages/transactions/src/StockCarInfoMessage.ts b/packages/transactions/src/StockCarInfoMessage.ts index 7ced580df..2b222c8d9 100644 --- a/packages/transactions/src/StockCarInfoMessage.ts +++ b/packages/transactions/src/StockCarInfoMessage.ts @@ -20,7 +20,7 @@ * @property {StockCar[]} StockCarList */ -import { MessageNode } from "@rustymotors/shared"; +import { MessageNode } from "../../shared"; type StockCar = import("./StockCar.js").StockCar; diff --git a/packages/transactions/src/TClientConnectMessage.d.ts b/packages/transactions/src/TClientConnectMessage.d.ts new file mode 100644 index 000000000..f0f0ad851 --- /dev/null +++ b/packages/transactions/src/TClientConnectMessage.d.ts @@ -0,0 +1,20 @@ +/// +import { OldServerMessage } from "../../shared"; +export declare class TClientConnectMessage extends OldServerMessage { + _customerId: number; + _personaId: number; + _customerName: string; + _personaName: string; + _mcVersion: string; + constructor(); + size(): number; + /** + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer): void; + serialize(): Buffer; + /** + * @override + */ + toString(): string; +} diff --git a/packages/transactions/src/TClientConnectMessage.ts b/packages/transactions/src/TClientConnectMessage.ts index ee62fcc36..2b6ba4d63 100644 --- a/packages/transactions/src/TClientConnectMessage.ts +++ b/packages/transactions/src/TClientConnectMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; export class TClientConnectMessage extends OldServerMessage { _customerId: number; diff --git a/packages/transactions/src/TLoginMessage.d.ts b/packages/transactions/src/TLoginMessage.d.ts new file mode 100644 index 000000000..91ed54b39 --- /dev/null +++ b/packages/transactions/src/TLoginMessage.d.ts @@ -0,0 +1,50 @@ +/// +import { SerializedBuffer, OldServerMessage } from "../../shared"; +export declare class ListEntry extends SerializedBuffer { + constructor(); +} +export declare class LoginCompleteMessage extends SerializedBuffer { + _msgNo: number; + _serverTime: number; + _firstTime: boolean; + _paycheckWaiting: boolean; + _clubInvitesWaiting: boolean; + tallyInProgress: boolean; + _secondsUntilShutdown: number; + _shardGNP: number; + _shardCarsSold: number; + _shardAverageSalaries: number; + _shardAverageCarsOwned: number; + _shardAverageLevel: number; + constructor(); + serialize(): Buffer; + size(): number; + toString(): string; +} +export declare class TLoginMessage extends OldServerMessage { + _size: number; + _customerId: number; + _personaId: number; + _lotOwnerId: number; + _brandedPartId: number; + _skinId: number; + _personaName: string; + _mcVersion: string; + constructor(); + /** + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer): void; + serialize(): Buffer; + asJSON(): { + msgNo: number; + customerId: number; + personaId: number; + lotOwnerId: number; + brandedPartId: number; + skinId: number; + personaName: string; + mcVersion: string; + }; + toString(): string; +} diff --git a/packages/transactions/src/TLoginMessage.ts b/packages/transactions/src/TLoginMessage.ts index 1dca19316..2044ecba9 100644 --- a/packages/transactions/src/TLoginMessage.ts +++ b/packages/transactions/src/TLoginMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer, OldServerMessage } from "@rustymotors/shared"; +import { SerializedBuffer, OldServerMessage } from "../../shared"; export class ListEntry extends SerializedBuffer { constructor() { diff --git a/packages/transactions/src/TunablesMessage.d.ts b/packages/transactions/src/TunablesMessage.d.ts new file mode 100644 index 000000000..90921cf92 --- /dev/null +++ b/packages/transactions/src/TunablesMessage.d.ts @@ -0,0 +1,39 @@ +/// +import { SerializedBuffer } from "../../shared"; +/** + * A message listing the lobbies + * This is the body of a MessageNode + */ +export declare class TunablesMessage extends SerializedBuffer { + _msgNo: number; + _clubCreationCost: number; + _clubCreationRequiredLevel: number; + _clubOfficerRequiredLevel: number; + _inventorySizePerLevel: number; + _carsPerLevel: number; + _maxEZStreetLevel: number; + _clubSwitchCooldown: number; + _universalRepairCostModifier: number; + _universalScrapValueModifier: number; + _addCost1Day: number; + _addCost2Days: number; + _addCost3Days: number; + _addCost4Days: number; + _addCost5Days: number; + _addCost6Days: number; + _addCost7Days: number; + _tradeinModifier: number; + _simStreetMaxWager: number; + saleryPerLevel: number; + _clubMaxMembers: number; + _clubRegistrationCost: number; + _clubReRegistrationCost: number; + _classifiedAdRate: number; + _classifiedAdMaxDuration: number; + _classifiedAdMaxSize: number; + _classifiedAdMaxCountPerPlayer: number; + constructor(); + size(): number; + serialize(): Buffer; + toString(): string; +} diff --git a/packages/transactions/src/TunablesMessage.ts b/packages/transactions/src/TunablesMessage.ts index a6b8a8bce..67a5ed24c 100644 --- a/packages/transactions/src/TunablesMessage.ts +++ b/packages/transactions/src/TunablesMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../shared"; /** * A message listing the lobbies diff --git a/packages/transactions/src/_getArcadeCarInfo.d.ts b/packages/transactions/src/_getArcadeCarInfo.d.ts new file mode 100644 index 000000000..345ac8e7f --- /dev/null +++ b/packages/transactions/src/_getArcadeCarInfo.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _getArcadeCarInfo({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getArcadeCarInfo.ts b/packages/transactions/src/_getArcadeCarInfo.ts index 90f305dbf..7e3873d72 100644 --- a/packages/transactions/src/_getArcadeCarInfo.ts +++ b/packages/transactions/src/_getArcadeCarInfo.ts @@ -1,7 +1,7 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { ArcadeCarInfo, ArcadeCarMessage } from "./ArcadeCarMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/_getGameUrls.d.ts b/packages/transactions/src/_getGameUrls.d.ts new file mode 100644 index 000000000..f92bc22fd --- /dev/null +++ b/packages/transactions/src/_getGameUrls.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _getGameUrls({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getGameUrls.ts b/packages/transactions/src/_getGameUrls.ts index 937b5c810..c883c6615 100644 --- a/packages/transactions/src/_getGameUrls.ts +++ b/packages/transactions/src/_getGameUrls.ts @@ -1,7 +1,7 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { GameUrl, GameUrlsMessage } from "./GameUrlsMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/_getOwnedParts.d.ts b/packages/transactions/src/_getOwnedParts.d.ts new file mode 100644 index 000000000..d41c5f861 --- /dev/null +++ b/packages/transactions/src/_getOwnedParts.d.ts @@ -0,0 +1,6 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare function _getOwnedParts({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getOwnedParts.ts b/packages/transactions/src/_getOwnedParts.ts index 9f6040e4b..d7d6958be 100644 --- a/packages/transactions/src/_getOwnedParts.ts +++ b/packages/transactions/src/_getOwnedParts.ts @@ -1,11 +1,11 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { PartsAssemblyMessage } from "./PartsAssemblyMessage.js"; import { fetchStateFromDatabase, findSessionByConnectionId, -} from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +} from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; export async function _getOwnedParts({ connectionId, diff --git a/packages/transactions/src/_getOwnedVehicles.d.ts b/packages/transactions/src/_getOwnedVehicles.d.ts new file mode 100644 index 000000000..133288194 --- /dev/null +++ b/packages/transactions/src/_getOwnedVehicles.d.ts @@ -0,0 +1,9 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare function getVehiclesForPerson(personId: number): { + personId: number; + vehicleId: number; + brandedPartId: number; +}[]; +export declare function _getOwnedVehicles( + args: MessageHandlerArgs, +): Promise; diff --git a/packages/transactions/src/_getOwnedVehicles.ts b/packages/transactions/src/_getOwnedVehicles.ts index 604a8a685..4fe7326b6 100644 --- a/packages/transactions/src/_getOwnedVehicles.ts +++ b/packages/transactions/src/_getOwnedVehicles.ts @@ -1,7 +1,7 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { OwnedVehicle, OwnedVehiclesMessage } from "./OwnedVehiclesMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; const vehicleList = [ { diff --git a/packages/transactions/src/_getPlayerInfo.d.ts b/packages/transactions/src/_getPlayerInfo.d.ts new file mode 100644 index 000000000..2208fb4d8 --- /dev/null +++ b/packages/transactions/src/_getPlayerInfo.d.ts @@ -0,0 +1,4 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare function _getPlayerInfo( + args: MessageHandlerArgs, +): Promise; diff --git a/packages/transactions/src/_getPlayerInfo.ts b/packages/transactions/src/_getPlayerInfo.ts index 661381eec..b002b8df9 100644 --- a/packages/transactions/src/_getPlayerInfo.ts +++ b/packages/transactions/src/_getPlayerInfo.ts @@ -1,7 +1,7 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { PlayerInfoMessage } from "./PlayerInfoMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; export async function _getPlayerInfo( args: MessageHandlerArgs, diff --git a/packages/transactions/src/_getPlayerPhysical.d.ts b/packages/transactions/src/_getPlayerPhysical.d.ts new file mode 100644 index 000000000..5a1c26fc2 --- /dev/null +++ b/packages/transactions/src/_getPlayerPhysical.d.ts @@ -0,0 +1,6 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare function _getPlayerPhysical({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getPlayerPhysical.ts b/packages/transactions/src/_getPlayerPhysical.ts index ef661a7a5..50f2757ff 100644 --- a/packages/transactions/src/_getPlayerPhysical.ts +++ b/packages/transactions/src/_getPlayerPhysical.ts @@ -1,7 +1,7 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { PlayerPhysicalMessage } from "./PlayerPhysicalMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; export async function _getPlayerPhysical({ connectionId, diff --git a/packages/transactions/src/_getPlayerRaceHistory.d.ts b/packages/transactions/src/_getPlayerRaceHistory.d.ts new file mode 100644 index 000000000..1707e4386 --- /dev/null +++ b/packages/transactions/src/_getPlayerRaceHistory.d.ts @@ -0,0 +1,26 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare enum RaceType { + RACES_TESTDRIVE = 14, + RACES_SIM_STREET = 16, + RACES_SIM_PRO = 17, + RACES_SIM_DRAG = 18, + RACES_SIM_TIMETRIAL = 19, + RACES_ARC_STUNT = 23, + RACES_ARC_TIMETRIAL = 25, + RACES_TRADEWINDOW = 26, +} +export type RacingHistoryRecord = { + raceType: RaceType; + numberOfRacesEntered: number; + numberOfRacesFinished: number; + numberOfRacesWon: number; + numberOfCarsWon: number; + numberOfCarsLost: number; + numberOfChampionshipsWon: number; + cashWon: number; +}; +export declare function _getPlayerRaceHistory({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getPlayerRaceHistory.ts b/packages/transactions/src/_getPlayerRaceHistory.ts index e0d328020..d57a71245 100644 --- a/packages/transactions/src/_getPlayerRaceHistory.ts +++ b/packages/transactions/src/_getPlayerRaceHistory.ts @@ -1,10 +1,10 @@ -import { ServerMessage } from "@rustymotors/shared"; +import { ServerMessage } from "../../shared"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerRacingHistoryMessage, RacingHistoryRecordEntry, } from "./PlayerRacingHistoryMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; export enum RaceType { RACES_TESTDRIVE = 14, diff --git a/packages/transactions/src/_getStockCarInfo.d.ts b/packages/transactions/src/_getStockCarInfo.d.ts new file mode 100644 index 000000000..1bcb2e41b --- /dev/null +++ b/packages/transactions/src/_getStockCarInfo.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _getStockCarInfo({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getStockCarInfo.ts b/packages/transactions/src/_getStockCarInfo.ts index 51cc04d38..d4bb7ef8c 100644 --- a/packages/transactions/src/_getStockCarInfo.ts +++ b/packages/transactions/src/_getStockCarInfo.ts @@ -1,8 +1,8 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { StockCarInfoMessage } from "./StockCarInfoMessage.js"; import { StockCar } from "./StockCar.js"; -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/_getTunables.d.ts b/packages/transactions/src/_getTunables.d.ts new file mode 100644 index 000000000..105331c5b --- /dev/null +++ b/packages/transactions/src/_getTunables.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _getTunables({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/_getTunables.ts b/packages/transactions/src/_getTunables.ts index e03ad8c15..7cf03ba65 100644 --- a/packages/transactions/src/_getTunables.ts +++ b/packages/transactions/src/_getTunables.ts @@ -1,7 +1,7 @@ import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { TunablesMessage } from "./TunablesMessage.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/_logout.d.ts b/packages/transactions/src/_logout.d.ts new file mode 100644 index 000000000..e781ab595 --- /dev/null +++ b/packages/transactions/src/_logout.d.ts @@ -0,0 +1,8 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _logout( + args: MessageHandlerArgs, +): Promise; diff --git a/packages/transactions/src/_logout.ts b/packages/transactions/src/_logout.ts index 8ef8c9ec0..18462bd35 100644 --- a/packages/transactions/src/_logout.ts +++ b/packages/transactions/src/_logout.ts @@ -1,6 +1,6 @@ import { GenericReplyMessage } from "./GenericReplyMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/_setOptions.d.ts b/packages/transactions/src/_setOptions.d.ts new file mode 100644 index 000000000..5c910dbaa --- /dev/null +++ b/packages/transactions/src/_setOptions.d.ts @@ -0,0 +1,4 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare function _setOptions( + args: MessageHandlerArgs, +): Promise; diff --git a/packages/transactions/src/_setOptions.ts b/packages/transactions/src/_setOptions.ts index dea3640ea..1b3f90196 100644 --- a/packages/transactions/src/_setOptions.ts +++ b/packages/transactions/src/_setOptions.ts @@ -1,5 +1,5 @@ -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; import { PlayerOptionsMessage } from "./messageStructs/PlayerOptionsMessage.js"; import { GenericReplyMessage } from "./GenericReplyMessage.js"; diff --git a/packages/transactions/src/_updatePlayerPhysical.d.ts b/packages/transactions/src/_updatePlayerPhysical.d.ts new file mode 100644 index 000000000..7a6c9a686 --- /dev/null +++ b/packages/transactions/src/_updatePlayerPhysical.d.ts @@ -0,0 +1,4 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +export declare function _updatePlayerPhysical( + args: MessageHandlerArgs, +): Promise; diff --git a/packages/transactions/src/_updatePlayerPhysical.ts b/packages/transactions/src/_updatePlayerPhysical.ts index c7163bbae..f080e8885 100644 --- a/packages/transactions/src/_updatePlayerPhysical.ts +++ b/packages/transactions/src/_updatePlayerPhysical.ts @@ -1,5 +1,5 @@ -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { PlayerPhysicalMessage } from "./PlayerPhysicalMessage.js"; diff --git a/packages/transactions/src/clientConnect.d.ts b/packages/transactions/src/clientConnect.d.ts new file mode 100644 index 000000000..4300ed1b6 --- /dev/null +++ b/packages/transactions/src/clientConnect.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function clientConnect({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/clientConnect.ts b/packages/transactions/src/clientConnect.ts index 382d12128..1267f4663 100644 --- a/packages/transactions/src/clientConnect.ts +++ b/packages/transactions/src/clientConnect.ts @@ -8,12 +8,12 @@ import { fetchStateFromDatabase, getEncryption, OldServerMessage, -} from "@rustymotors/shared"; +} from "../../shared"; import { createCommandEncryptionPair, createDataEncryptionPair, } from "../../gateway/src/encryption.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; import { getUserSessionByCustomerId } from "../../nps/services/session.js"; /** diff --git a/packages/transactions/src/getLobbies.d.ts b/packages/transactions/src/getLobbies.d.ts new file mode 100644 index 000000000..be96f7a90 --- /dev/null +++ b/packages/transactions/src/getLobbies.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function getLobbies({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/getLobbies.ts b/packages/transactions/src/getLobbies.ts index bb5a3ff53..cd80d1f4e 100644 --- a/packages/transactions/src/getLobbies.ts +++ b/packages/transactions/src/getLobbies.ts @@ -1,6 +1,6 @@ import { LobbyInfo, LobbyMessage } from "./LobbyMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; import { EntryFeePurseMessage, PurseEntry } from "./EntryFeePurseMessage.js"; /** diff --git a/packages/transactions/src/internal.d.ts b/packages/transactions/src/internal.d.ts new file mode 100644 index 000000000..02c673233 --- /dev/null +++ b/packages/transactions/src/internal.d.ts @@ -0,0 +1,29 @@ +/// +import { ServerLogger, SerializedBuffer } from "../../shared"; +/** + * @param {object} args + * @param {string} args.connectionId + * @param {SerializedBuffer} args.message + * @param {ServerLogger} args.log + * @returns {Promise<{ + * connectionId: string, + * messages: SerializedBuffer[] + * }>} + */ +export declare function receiveTransactionsData({ + connectionId, + message, + log, +}: { + connectionId: string; + message: SerializedBuffer; + log: ServerLogger; +}): Promise<{ + connectionId: string; + messages: SerializedBuffer[]; +}>; +/** + * @param {Buffer} buffer + * @param {Buffer} buffer2 + */ +export declare function verifyLength(buffer: Buffer, buffer2: Buffer): void; diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index e7571d8a3..5afafa63a 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -23,7 +23,7 @@ import { SerializedBuffer, OldServerMessage, ServerMessage, -} from "@rustymotors/shared"; +} from "../../shared"; /** * diff --git a/packages/transactions/src/login.d.ts b/packages/transactions/src/login.d.ts new file mode 100644 index 000000000..043edf2bd --- /dev/null +++ b/packages/transactions/src/login.d.ts @@ -0,0 +1,15 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function login({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; +export declare function loginComplete({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/login.ts b/packages/transactions/src/login.ts index d4219a4c6..08b62a1ad 100644 --- a/packages/transactions/src/login.ts +++ b/packages/transactions/src/login.ts @@ -1,12 +1,12 @@ import { LoginCompleteMessage, TLoginMessage } from "./TLoginMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; import { buildVehiclePartTree, saveVehicle, saveVehiclePartTree, -} from "@rustymotors/database"; -import { TServerLogger, ServerMessageType } from "@rustymotors/shared"; +} from "../../database"; +import type { TServerLogger, ServerMessageType } from "../../shared"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/messageHandlers.d.ts b/packages/transactions/src/messageHandlers.d.ts new file mode 100644 index 000000000..7414456c0 --- /dev/null +++ b/packages/transactions/src/messageHandlers.d.ts @@ -0,0 +1,2 @@ +import type { MessageHandler } from "../types.js"; +export declare const messageHandlers: Map; diff --git a/packages/transactions/src/messageHandlers.ts b/packages/transactions/src/messageHandlers.ts index 25d97b7b2..1649a3078 100644 --- a/packages/transactions/src/messageHandlers.ts +++ b/packages/transactions/src/messageHandlers.ts @@ -16,7 +16,7 @@ import { _setOptions } from "./_setOptions.js"; import { _updatePlayerPhysical } from "./_updatePlayerPhysical.js"; import { _getCompleteVehicleInfo } from "./messageHandlers/_getCompleteVehicleInfo.js"; import { _updateCachedVehicle } from "./messageHandlers/_updateCachedVehicle.js"; -import { MessageHandler } from "../types.js"; +import type { MessageHandler } from "../types.js"; export const messageHandlers: Map = new Map([ [105, { name: "MC_LOGIN", handler: login, direction: "in" }], diff --git a/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.d.ts b/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.d.ts new file mode 100644 index 000000000..01a73482f --- /dev/null +++ b/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.d.ts @@ -0,0 +1,47 @@ +/// +import type { MessageHandlerArgs, MessageHandlerResult } from "../../types.js"; +export declare class VehicleStruct { + VehicleID: number; + SkinID: number; + Flags: number; + Delta: number; + CarClass: number; + Damage: Buffer; + serialize(): Buffer; + size(): number; + toString(): string; +} +export declare class PartStruct { + partId: number; + parentPartId: number | null; + brandedPartId: number; + repairCost: number; + junkyardValue: number; + wear: number; + arttachmentPoint: number; + damage: number; + serialize(): Buffer; + size(): number; + toString(): string; +} +export type DBPart = { + partId: number; + parentPartId: number | null; + brandedPartId: number; + percentDamage: number; + itemWear: number; + attachmentPointId: number; + ownerId: number; + partName: string; + repairCost: number; + scrapValue: number; +}; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _getCompleteVehicleInfo({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.spec.d.ts b/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.spec.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.ts b/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.ts index 1a04f9ee1..fcba087e4 100644 --- a/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.ts +++ b/packages/transactions/src/messageHandlers/_getCompleteVehicleInfo.ts @@ -1,13 +1,13 @@ import { GenericRequestMessage } from "../GenericRequestMessage.js"; -import { OldServerMessage, getServerLogger } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../../types.js"; +import { OldServerMessage, getServerLogger } from "../../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../../types.js"; import { CarInfoMessage } from "../messageStructs/CarInfoMessage.js"; import { getVehiclePartTree, - TPart, + type TPart, buildVehiclePartTreeFromDB, -} from "@rustymotors/database"; +} from "../../../database"; const log = getServerLogger(); @@ -136,7 +136,16 @@ class CarInfoStruct { } size() { - return 10 + this.vehicle.size() + this.noOfParts * this.parts[0].size(); + return ( + 10 + this.vehicle.size() + this.noOfParts * this.getFirstPartSize() + ); + } + + getFirstPartSize() { + if (typeof this.parts[0] === "undefined") { + return 0; + } + return this.parts[0].size(); } toString() { diff --git a/packages/transactions/src/messageHandlers/_updateCachedVehicle.d.ts b/packages/transactions/src/messageHandlers/_updateCachedVehicle.d.ts new file mode 100644 index 000000000..5c5bb4272 --- /dev/null +++ b/packages/transactions/src/messageHandlers/_updateCachedVehicle.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function _updateCachedVehicle({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/messageHandlers/_updateCachedVehicle.ts b/packages/transactions/src/messageHandlers/_updateCachedVehicle.ts index dd6315a95..d038cfba6 100644 --- a/packages/transactions/src/messageHandlers/_updateCachedVehicle.ts +++ b/packages/transactions/src/messageHandlers/_updateCachedVehicle.ts @@ -1,4 +1,4 @@ -import { MessageHandlerArgs, MessageHandlerResult } from "../../types.js"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/src/messageStructs/CarInfoMessage.d.ts b/packages/transactions/src/messageStructs/CarInfoMessage.d.ts new file mode 100644 index 000000000..1c0802c4e --- /dev/null +++ b/packages/transactions/src/messageStructs/CarInfoMessage.d.ts @@ -0,0 +1,20 @@ +/// +import { SerializedBuffer } from "../../shared"; +import { + PartStruct, + VehicleStruct, +} from "../messageHandlers/_getCompleteVehicleInfo.js"; +export declare class CarInfoMessage extends SerializedBuffer { + msgNo: number; + playerId: number; + private vehicle; + noOfParts: number; + private parts; + constructor(); + size(): number; + getFirstPartSize(): number; + serialize(): Buffer; + toString(): string; + setVehicle(vehicle: VehicleStruct): void; + setParts(parts: PartStruct[]): void; +} diff --git a/packages/transactions/src/messageStructs/CarInfoMessage.ts b/packages/transactions/src/messageStructs/CarInfoMessage.ts index f865d9e9f..1f8384483 100644 --- a/packages/transactions/src/messageStructs/CarInfoMessage.ts +++ b/packages/transactions/src/messageStructs/CarInfoMessage.ts @@ -1,5 +1,4 @@ -import { Vehicle } from "../../../nps/services/types.js"; -import { SerializedBuffer } from "@rustymotors/shared"; +import { SerializedBuffer } from "../../../shared"; import { PartStruct, VehicleStruct, @@ -27,10 +26,17 @@ export class CarInfoMessage extends SerializedBuffer { 4 + this.vehicle.size() + 2 + - this.parts.length * (this.parts[0].size() ?? 0) + this.parts.length * this.getFirstPartSize() ); } + getFirstPartSize() { + if (typeof this.parts[0] === "undefined") { + return 0; + } + return this.parts[0].size(); + } + override serialize(): Buffer { try { const buffer = Buffer.alloc(this.size()); diff --git a/packages/transactions/src/messageStructs/PlayerOptionsMessage.d.ts b/packages/transactions/src/messageStructs/PlayerOptionsMessage.d.ts new file mode 100644 index 000000000..7965d4490 --- /dev/null +++ b/packages/transactions/src/messageStructs/PlayerOptionsMessage.d.ts @@ -0,0 +1,25 @@ +/// +import { OldServerMessage } from "../../shared"; +export declare class CarNumberSet { + private cars; + private carMax; + constructor(maxCars: number); + private isUniqueValue; + getCarNumber(car: number): string; + setCarNumber(carNumber: number, car: string): void; + getCarCount(): number; + size(): number; + toBytes(): Buffer; + fromBytes(buffer: Buffer): void; + toString(): string; +} +export declare class PlayerOptionsMessage extends OldServerMessage { + private plateType; + private plateText; + private carInfoSettings; + private carNumbers; + constructor(); + size(): number; + deserialize(buffer: Buffer): void; + toString(): string; +} diff --git a/packages/transactions/src/messageStructs/PlayerOptionsMessage.ts b/packages/transactions/src/messageStructs/PlayerOptionsMessage.ts index 100b6589d..20a99e53e 100644 --- a/packages/transactions/src/messageStructs/PlayerOptionsMessage.ts +++ b/packages/transactions/src/messageStructs/PlayerOptionsMessage.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../../shared"; export class CarNumberSet { private cars: string[] = []; @@ -45,7 +45,7 @@ export class CarNumberSet { const buffer = Buffer.alloc(this.size()); let offset = 0; for (let i = 0; i < this.carMax; i++) { - buffer.write(this.cars[i], offset); + buffer.write(this.cars[i] ?? "", offset); offset = i * 3; } return buffer; diff --git a/packages/transactions/src/models/PartModel.d.ts b/packages/transactions/src/models/PartModel.d.ts new file mode 100644 index 000000000..200b139cf --- /dev/null +++ b/packages/transactions/src/models/PartModel.d.ts @@ -0,0 +1,34 @@ +/// +import type { DBModel } from "./index.js"; +export declare class PartModel implements DBModel { + private partId; + private parentPartId; + private brandedPartId; + private repairCost; + private junkPrice; + private wear; + private attachmentPoint; + private damage; + constructor(); + save(): Promise; + delete(): Promise; + size(): number; + toBytes(): Buffer; + toString(): string; + getPartId(): number; + getParentPartId(): number; + getBrandedPartId(): number; + getRepairCost(): number; + getJunkPrice(): number; + getWear(): number; + getAttachmentPoint(): number; + getDamage(): number; + setPartId(partId: number): void; + setParentPartId(parentPartId: number): void; + setBrandedPartId(brandedPartId: number): void; + setRepairCost(repairCost: number): void; + setJunkPrice(junkPrice: number): void; + setWear(wear: number): void; + setAttachmentPoint(attachmentPoint: number): void; + setDamage(damage: number): void; +} diff --git a/packages/transactions/src/models/PartModel.ts b/packages/transactions/src/models/PartModel.ts index 21d24914f..4cc24a612 100644 --- a/packages/transactions/src/models/PartModel.ts +++ b/packages/transactions/src/models/PartModel.ts @@ -1,4 +1,4 @@ -import { DBModel } from "./index.js"; +import type { DBModel } from "./index.js"; export class PartModel implements DBModel { private partId = 0; // 4 bytes diff --git a/packages/transactions/src/models/VehicleModel.d.ts b/packages/transactions/src/models/VehicleModel.d.ts new file mode 100644 index 000000000..51f9e5194 --- /dev/null +++ b/packages/transactions/src/models/VehicleModel.d.ts @@ -0,0 +1,25 @@ +import type { DBModel } from "./index.js"; +export declare class VehicleModel implements DBModel { + private vehicleId; + private skinId; + private flags; + private delta; + private carClass; + private damageLength; + private damage; + constructor(vehicleId: number); + save(): Promise; + delete(): Promise; + getVehicleId(): number; + getSkinId(): number; + getFlags(): number; + getDelta(): number; + getCarClass(): number; + getDamageLength(): number; + getDamage(): number; + setSkinId(skinId: number): void; + setFlags(flags: number): void; + setDelta(delta: number): void; + setCarClass(carClass: number): void; + setDamageLength(damageLength: number): void; +} diff --git a/packages/transactions/src/models/VehicleModel.ts b/packages/transactions/src/models/VehicleModel.ts index e3479c1d5..6daf4e1bc 100644 --- a/packages/transactions/src/models/VehicleModel.ts +++ b/packages/transactions/src/models/VehicleModel.ts @@ -1,4 +1,4 @@ -import { DBModel } from "./index.js"; +import type { DBModel } from "./index.js"; export class VehicleModel implements DBModel { private vehicleId = 0; // 4 bytes diff --git a/packages/transactions/src/models/index.d.ts b/packages/transactions/src/models/index.d.ts new file mode 100644 index 000000000..aff45c12d --- /dev/null +++ b/packages/transactions/src/models/index.d.ts @@ -0,0 +1,4 @@ +export interface DBModel { + save(): Promise; + delete(): Promise; +} diff --git a/packages/transactions/src/services/car.d.ts b/packages/transactions/src/services/car.d.ts new file mode 100644 index 000000000..03848e43a --- /dev/null +++ b/packages/transactions/src/services/car.d.ts @@ -0,0 +1,6 @@ +import { VehicleModel } from "../models/VehicleModel.js"; +export declare function getVehicle(vehicleId: number): VehicleModel | undefined; +export declare function createVehicle(): VehicleModel; +export declare function deleteVehicle(vehicleId: number): void; +export declare function clearVehicles(): void; +export declare function getVehicleCount(): number; diff --git a/packages/transactions/src/trackingPing.d.ts b/packages/transactions/src/trackingPing.d.ts new file mode 100644 index 000000000..6493a67f4 --- /dev/null +++ b/packages/transactions/src/trackingPing.d.ts @@ -0,0 +1,10 @@ +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +/** + * @param {MessageHandlerArgs} args + * @return {Promise} + */ +export declare function trackingPing({ + connectionId, + packet, + log, +}: MessageHandlerArgs): Promise; diff --git a/packages/transactions/src/trackingPing.ts b/packages/transactions/src/trackingPing.ts index 523a1f739..4d6248802 100644 --- a/packages/transactions/src/trackingPing.ts +++ b/packages/transactions/src/trackingPing.ts @@ -1,6 +1,6 @@ import { GenericReplyMessage } from "./GenericReplyMessage.js"; -import { OldServerMessage } from "@rustymotors/shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; +import { OldServerMessage } from "../../shared"; +import type { MessageHandlerArgs, MessageHandlerResult } from "../types.js"; /** * @param {MessageHandlerArgs} args diff --git a/packages/transactions/test/LobbyMessage.test.d.ts b/packages/transactions/test/LobbyMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/LobbyMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/OwnedVehiclesMessage.test.d.ts b/packages/transactions/test/OwnedVehiclesMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/OwnedVehiclesMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/PartsAssemblyMessage.test.d.ts b/packages/transactions/test/PartsAssemblyMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/PartsAssemblyMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/PlayerInfoMessage.test.d.ts b/packages/transactions/test/PlayerInfoMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/PlayerInfoMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/PlayerRacingHistoryMessage.test.d.ts b/packages/transactions/test/PlayerRacingHistoryMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/PlayerRacingHistoryMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/TClientConnectMessage.test.d.ts b/packages/transactions/test/TClientConnectMessage.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/TClientConnectMessage.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/_getPlayerRaceHistory.test.d.ts b/packages/transactions/test/_getPlayerRaceHistory.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/_getPlayerRaceHistory.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/_getPlayerRaceHistory.test.ts b/packages/transactions/test/_getPlayerRaceHistory.test.ts index 5cd5abf30..03c24e432 100644 --- a/packages/transactions/test/_getPlayerRaceHistory.test.ts +++ b/packages/transactions/test/_getPlayerRaceHistory.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from "vitest"; import { _getPlayerRaceHistory } from "../src/_getPlayerRaceHistory.js"; -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { mockLogger } from "../../../test/factoryMocks.js"; describe("_getPlayerRaceHistory", () => { diff --git a/packages/transactions/test/clientConnect.test.d.ts b/packages/transactions/test/clientConnect.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/clientConnect.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/clientConnect.test.ts b/packages/transactions/test/clientConnect.test.ts index a50bca5c2..2407a695c 100644 --- a/packages/transactions/test/clientConnect.test.ts +++ b/packages/transactions/test/clientConnect.test.ts @@ -1,7 +1,7 @@ import { clientConnect } from "../src/clientConnect.js"; import { describe, it, expect } from "vitest"; -import { updateSessionKey } from "@rustymotors/database"; +import { updateSessionKey } from "../../database"; import { TClientConnectMessage } from "../src/TClientConnectMessage.js"; import { mockLogger } from "../../../test/factoryMocks.js"; diff --git a/packages/transactions/test/getLobbies.test.d.ts b/packages/transactions/test/getLobbies.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/getLobbies.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/getLobbies.test.ts b/packages/transactions/test/getLobbies.test.ts index b77f25dde..4243da5d3 100644 --- a/packages/transactions/test/getLobbies.test.ts +++ b/packages/transactions/test/getLobbies.test.ts @@ -1,7 +1,8 @@ -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { getLobbies } from "../src/getLobbies.js"; import { describe, expect, it } from "vitest"; import { mockLogger } from "../../../test/factoryMocks.js"; +import { assert } from "console"; describe("getLobbies", () => { it("should return a promise", async () => { @@ -17,6 +18,10 @@ describe("getLobbies", () => { log, }); + if (result.messages[0] === undefined) { + throw new Error("Expected messages to be defined"); + } + const resultMessage = result.messages[0].serialize().toString("hex"); // assert diff --git a/packages/transactions/test/trackingPing.test.d.ts b/packages/transactions/test/trackingPing.test.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/packages/transactions/test/trackingPing.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/transactions/test/trackingPing.test.ts b/packages/transactions/test/trackingPing.test.ts index 67d053fb2..5053c1429 100644 --- a/packages/transactions/test/trackingPing.test.ts +++ b/packages/transactions/test/trackingPing.test.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "@rustymotors/shared"; +import { OldServerMessage } from "../../shared"; import { trackingPing } from "../src/trackingPing.js"; import { describe, test, expect } from "vitest"; import { mockLogger } from "../../../test/factoryMocks.js"; diff --git a/packages/transactions/types.d.ts b/packages/transactions/types.d.ts new file mode 100644 index 000000000..27465a8d2 --- /dev/null +++ b/packages/transactions/types.d.ts @@ -0,0 +1,20 @@ +import type { + OldServerMessage, + ServerMessage, + ServerMessageType, + TServerLogger, +} from "../../shared"; +export interface MessageHandlerArgs { + connectionId: string; + packet: ServerMessageType; + log: TServerLogger; +} +export interface MessageHandlerResult { + connectionId: string; + messages: OldServerMessage[] | ServerMessage[]; +} +export interface MessageHandler { + name: string; + direction: "in" | "out" | "both"; + handler: (args: MessageHandlerArgs) => Promise; +} diff --git a/packages/transactions/types.ts b/packages/transactions/types.ts index 9f4604e23..92f548cdd 100644 --- a/packages/transactions/types.ts +++ b/packages/transactions/types.ts @@ -14,12 +14,27 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { +// mcos is a game server, written from scratch, for an old game +// Copyright (C) <2017> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +import type { OldServerMessage, ServerMessage, ServerMessageType, TServerLogger, -} from "@rustymotors/shared"; +} from "../../shared"; export interface MessageHandlerArgs { connectionId: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bdb0527c..c194c13ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2879 +1,6322 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false importers: - - .: - dependencies: - '@rustymotors/database': - specifier: workspace:^ - version: link:packages/database - '@rustymotors/shared': - specifier: workspace:^ - version: link:packages/shared - '@rustymotors/shared-packets': - specifier: workspace:^ - version: link:packages/shared-packets - '@sentry/node': - specifier: ^7.102.0 - version: 7.108.0 - '@sentry/profiling-node': - specifier: ^7.104.0 - version: 7.108.0 - slonik: - specifier: '37' - version: 37.4.0(zod@3.22.4) - tsx: - specifier: ^4.7.1 - version: 4.7.1 - devDependencies: - '@slonik/migrator': - specifier: 0.12.0 - version: 0.12.0(@types/node@20.11.30)(slonik@37.4.0) - '@types/node': - specifier: 20.11.30 - version: 20.11.30 - '@vitest/coverage-v8': - specifier: 1.4.0 - version: 1.4.0(vitest@1.4.0) - eslint: - specifier: 8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: 9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: 5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) - prettier: - specifier: 3.2.5 - version: 3.2.5 - typescript: - specifier: 5.4.3 - version: 5.4.3 - vitest: - specifier: 1.4.0 - version: 1.4.0(@types/node@20.11.30) - - apps/main: - dependencies: - '@rustymotors/shared': - specifier: workspace:^ - version: link:../../packages/shared - - packages/cli: - dependencies: - '@rustymotors/shared': - specifier: workspace:* - version: link:../shared - - packages/database: - dependencies: - '@sentry/node': - specifier: ^7.102.0 - version: 7.108.0 - slonik: - specifier: ^37.2.0 - version: 37.4.0(zod@3.22.4) - zod: - specifier: ^3.22.4 - version: 3.22.4 - - packages/gateway: - dependencies: - '@fastify/sensible': - specifier: ^5.5.0 - version: 5.5.0 - '@rustymotors/shared': - specifier: workspace:^ - version: link:../shared - '@rustymotors/shared-packets': - specifier: workspace:^ - version: link:../shared-packets - '@sentry/node': - specifier: ^7.102.0 - version: 7.108.0 - fastify: - specifier: ^4.25.2 - version: 4.26.2 - - packages/interfaces: {} - - packages/lobby: - dependencies: - '@rustymotors/database': - specifier: workspace:^ - version: link:../database - - packages/login: {} - - packages/nps: - dependencies: - '@sentry/node': - specifier: ^7.102.0 - version: 7.108.0 - short-unique-id: - specifier: ^5.0.3 - version: 5.0.3 - - packages/patch: {} - - packages/persona: {} - - packages/shard: {} - - packages/shared: - dependencies: - pino: - specifier: ^8.18.0 - version: 8.19.0 - pino-pretty: - specifier: ^11.0.0 - version: 11.0.0 - - packages/shared-packets: {} - - packages/transactions: {} + .: + dependencies: + "@fastify/sensible": + specifier: ^5.5.0 + version: 5.5.0 + "@rustymotors/database": + specifier: workspace:^ + version: link:packages/database + "@rustymotors/shared": + specifier: workspace:^ + version: link:packages/shared + "@rustymotors/shared-packets": + specifier: workspace:^ + version: link:packages/shared-packets + "@sentry/esbuild-plugin": + specifier: ^2.16.0 + version: 2.16.0 + fastify: + specifier: ^4.25.2 + version: 4.26.2 + pino: + specifier: ^8.18.0 + version: 8.19.0 + pino-pretty: + specifier: ^11.0.0 + version: 11.0.0 + short-unique-id: + specifier: ^5.0.3 + version: 5.0.3 + slonik: + specifier: "37" + version: 37.3.1(zod@3.22.4) + tsx: + specifier: ^4.7.1 + version: 4.7.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 + devDependencies: + "@sentry/node": + specifier: ^7.108.0 + version: 7.108.0 + "@sentry/profiling-node": + specifier: ^7.108.0 + version: 7.108.0 + "@slonik/migrator": + specifier: 0.12.0 + version: 0.12.0(@types/node@20.11.30)(slonik@37.3.1) + "@types/node": + specifier: 20.11.30 + version: 20.11.30 + "@vitest/coverage-v8": + specifier: 1.4.0 + version: 1.4.0(vitest@1.4.0) + esbuild: + specifier: ^0.20.2 + version: 0.20.2 + eslint: + specifier: 8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: 5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + prettier: + specifier: 3.2.5 + version: 3.2.5 + typescript: + specifier: 5.4.3 + version: 5.4.3 + vitest: + specifier: 1.4.0 + version: 1.4.0(@types/node@20.11.30) + + apps/main: + dependencies: + "@rustymotors/shared": + specifier: workspace:^ + version: link:../../packages/shared + + packages/cli: + dependencies: + "@rustymotors/shared": + specifier: workspace:* + version: link:../shared + + packages/database: + dependencies: + "@sentry/node": + specifier: ^7.102.0 + version: 7.107.0 + slonik: + specifier: ^37.2.0 + version: 37.3.1(zod@3.22.4) + zod: + specifier: ^3.22.4 + version: 3.22.4 + + packages/gateway: + dependencies: + "@fastify/sensible": + specifier: ^5.5.0 + version: 5.5.0 + "@rustymotors/shared": + specifier: workspace:^ + version: link:../shared + "@rustymotors/shared-packets": + specifier: workspace:^ + version: link:../shared-packets + "@sentry/node": + specifier: ^7.102.0 + version: 7.107.0 + fastify: + specifier: ^4.25.2 + version: 4.26.2 + + packages/interfaces: {} + + packages/lobby: + dependencies: + "@rustymotors/database": + specifier: workspace:^ + version: link:../database + + packages/login: {} + + packages/nps: + dependencies: + "@sentry/node": + specifier: ^7.102.0 + version: 7.107.0 + short-unique-id: + specifier: ^5.0.3 + version: 5.0.3 + + packages/patch: {} + + packages/persona: {} + + packages/shard: {} + + packages/shared: + dependencies: + pino: + specifier: ^8.18.0 + version: 8.19.0 + pino-pretty: + specifier: ^11.0.0 + version: 11.0.0 + + packages/shared-packets: {} + + packages/transactions: {} packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /@ampproject/remapping@2.3.0: + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + + /@babel/code-frame@7.24.2: + resolution: + { + integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/highlight": 7.24.2 + picocolors: 1.0.0 + dev: false + + /@babel/compat-data@7.24.1: + resolution: + { + integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/core@7.24.3: + resolution: + { + integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@ampproject/remapping": 2.3.0 + "@babel/code-frame": 7.24.2 + "@babel/generator": 7.24.1 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.24.3) + "@babel/helpers": 7.24.1 + "@babel/parser": 7.24.1 + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.1 + "@babel/types": 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.24.1: + resolution: + { + integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.24.0 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + jsesc: 2.5.2 + dev: false + + /@babel/helper-compilation-targets@7.23.6: + resolution: + { + integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/compat-data": 7.24.1 + "@babel/helper-validator-option": 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.20: + resolution: + { + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/helper-function-name@7.23.0: + resolution: + { + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": 7.24.0 + "@babel/types": 7.24.0 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.24.0 + dev: false + + /@babel/helper-module-imports@7.24.3: + resolution: + { + integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.24.0 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + resolution: + { + integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.24.3 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-module-imports": 7.24.3 + "@babel/helper-simple-access": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + "@babel/helper-validator-identifier": 7.22.20 + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: + { + integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.24.0 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: + { + integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.24.0 + dev: false + + /@babel/helper-string-parser@7.23.4: + resolution: + { + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, + } + engines: { node: ">=6.9.0" } + + /@babel/helper-validator-identifier@7.22.20: + resolution: + { + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + } + engines: { node: ">=6.9.0" } + + /@babel/helper-validator-option@7.23.5: + resolution: + { + integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/helpers@7.24.1: + resolution: + { + integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.1 + "@babel/types": 7.24.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/highlight@7.24.2: + resolution: + { + integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-validator-identifier": 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: false + + /@babel/parser@7.24.0: + resolution: + { + integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==, + } + engines: { node: ">=6.0.0" } + hasBin: true + dependencies: + "@babel/types": 7.24.0 + dev: true + + /@babel/parser@7.24.1: + resolution: + { + integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==, + } + engines: { node: ">=6.0.0" } + hasBin: true + dependencies: + "@babel/types": 7.24.0 + dev: false + + /@babel/template@7.24.0: + resolution: + { + integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/parser": 7.24.1 + "@babel/types": 7.24.0 + dev: false + + /@babel/traverse@7.24.1: + resolution: + { + integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/generator": 7.24.1 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-hoist-variables": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + "@babel/parser": 7.24.1 + "@babel/types": 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.24.0: + resolution: + { + integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": 7.23.4 + "@babel/helper-validator-identifier": 7.22.20 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } + dev: true + + /@esbuild/aix-ppc64@0.19.12: + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: + { + integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: + { + integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: + { + integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: + { + integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: + { + integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: + { + integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: + { + integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: + { + integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: + { + integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: + { + integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: + { + integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: + { + integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: + { + integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: + { + integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: + { + integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: + { + integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: + { + integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: + { + integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: + { + integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: + { + integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: + { + integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: + { + integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: + { + integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: + { + integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@fastify/ajv-compiler@3.5.0: + resolution: + { + integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==, + } + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-uri: 2.3.0 + dev: false + + /@fastify/error@3.4.1: + resolution: + { + integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==, + } + dev: false + + /@fastify/fast-json-stringify-compiler@4.3.0: + resolution: + { + integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==, + } + dependencies: + fast-json-stringify: 5.12.0 + dev: false + + /@fastify/merge-json-schemas@0.1.1: + resolution: + { + integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==, + } + dependencies: + fast-deep-equal: 3.1.3 + dev: false + + /@fastify/sensible@5.5.0: + resolution: + { + integrity: sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==, + } + dependencies: + "@lukeed/ms": 2.0.2 + fast-deep-equal: 3.1.3 + fastify-plugin: 4.5.1 + forwarded: 0.2.0 + http-errors: 2.0.0 + type-is: 1.6.18 + vary: 1.1.2 + dev: false + + /@humanwhocodes/config-array@0.11.14: + resolution: + { + integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: + { + integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, + } + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: ">=8" } + dev: true + + /@jest/schemas@29.6.3: + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@sinclair/typebox": 0.27.8 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + /@jridgewell/set-array@1.2.1: + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + /@jridgewell/trace-mapping@0.3.25: + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + dependencies: + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 + + /@lukeed/ms@2.0.2: + resolution: + { + integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==, + } + engines: { node: ">=8" } + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.17.1 + dev: true + + /@pkgr/core@0.1.1: + resolution: + { + integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + dev: true + + /@rollup/rollup-android-arm-eabi@4.12.0: + resolution: + { + integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==, + } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.12.0: + resolution: + { + integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==, + } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.12.0: + resolution: + { + integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.12.0: + resolution: + { + integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.12.0: + resolution: + { + integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==, + } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.12.0: + resolution: + { + integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.12.0: + resolution: + { + integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.12.0: + resolution: + { + integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==, + } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.12.0: + resolution: + { + integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.12.0: + resolution: + { + integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.12.0: + resolution: + { + integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==, + } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.12.0: + resolution: + { + integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==, + } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.12.0: + resolution: + { + integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/node-core-library@4.0.2(@types/node@20.11.30): + resolution: + { + integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==, + } + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + dependencies: + "@types/node": 20.11.30 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + + /@rushstack/terminal@0.10.0(@types/node@20.11.30): + resolution: + { + integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==, + } + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + dependencies: + "@rushstack/node-core-library": 4.0.2(@types/node@20.11.30) + "@types/node": 20.11.30 + supports-color: 8.1.1 + dev: true + + /@rushstack/ts-command-line@4.19.0(@types/node@20.11.30): + resolution: + { + integrity: sha512-0sIHWOFGLFb6tC1zk2R0aM79ic3CF0XGzVBvhf6ytMyjDwt03DVb1qe5/5NQ0FGcvB5YyQ2WVfGsnxG6SANvHA==, + } + dependencies: + "@rushstack/terminal": 0.10.0(@types/node@20.11.30) + "@types/argparse": 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - "@types/node" + dev: true + + /@sentry-internal/tracing@7.107.0: + resolution: + { + integrity: sha512-le9wM8+OHBbq7m/8P7JUJ1UhSPIty+Z/HmRXc5Z64ODZcOwFV6TmDpYx729IXDdz36XUKmeI+BeM7yQdTTZPfQ==, + } + engines: { node: ">=8" } + dependencies: + "@sentry/core": 7.107.0 + "@sentry/types": 7.107.0 + "@sentry/utils": 7.107.0 + dev: false + + /@sentry-internal/tracing@7.108.0: + resolution: + { + integrity: sha512-zuK5XsTsb+U+hgn3SPetYDAogrXsM16U/LLoMW7+TlC6UjlHGYQvmX3o+M2vntejoU1QZS8m1bCAZSMWEypAEw==, + } + engines: { node: ">=8" } + dependencies: + "@sentry/core": 7.108.0 + "@sentry/types": 7.108.0 + "@sentry/utils": 7.108.0 + dev: true + + /@sentry/babel-plugin-component-annotate@2.16.0: + resolution: + { + integrity: sha512-+uy1qPkA5MSNgJ0L9ur/vNTydfdHwHnBX2RQ+0thsvkqf90fU788YjkkXwUiBBNuqNyI69JiOW6frixAWy7oUg==, + } + engines: { node: ">= 14" } + dev: false + + /@sentry/bundler-plugin-core@2.16.0: + resolution: + { + integrity: sha512-dhgIZsIR3L9KnE2OO5JJm6hPtStAjEPYKQsZzxRr69uVhd9xAvfXeXr0afKVNVEcIDksas6yMgHqwQ2wOXFIAg==, + } + engines: { node: ">= 14" } + dependencies: + "@babel/core": 7.24.3 + "@sentry/babel-plugin-component-annotate": 2.16.0 + "@sentry/cli": 2.30.2 + dotenv: 16.4.5 + find-up: 5.0.0 + glob: 9.3.5 + magic-string: 0.27.0 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/cli-darwin@2.30.2: + resolution: + { + integrity: sha512-lZkKXMt0HUAwLQuPpi/DM3CsdCCp+6B2cdur+8fAq7uARXTOsTKVDxv9pkuJHCgHUnguh8ittP5GMr0baTxmMg==, + } + engines: { node: ">=10" } + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli-linux-arm64@2.30.2: + resolution: + { + integrity: sha512-IWassuXggNhHOPCNrORNmd5SrAx5rU4XDlgOWBJr/ez7DvlPrr9EhV1xsdht6K4mPXhCGJq3rtRdCoWGJQW6Uw==, + } + engines: { node: ">=10" } + cpu: [arm64] + os: [linux, freebsd] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli-linux-arm@2.30.2: + resolution: + { + integrity: sha512-H7hqiLpEL7w/EHdhuUGatwg9O080mdujq4/zS96buKIHXxZE6KqMXGtMVIAvTl1+z6BlBEnfvZGI19MPw3t/7w==, + } + engines: { node: ">=10" } + cpu: [arm] + os: [linux, freebsd] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli-linux-i686@2.30.2: + resolution: + { + integrity: sha512-gZIq131M4TJTG1lX9uvpoaGWaEXCEfdDXrXu/z/YZmAKBcThpMYChodXmm8FB6X4xb0TPXzIFqdzlLdglFK46g==, + } + engines: { node: ">=10" } + cpu: [x86, ia32] + os: [linux, freebsd] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli-linux-x64@2.30.2: + resolution: + { + integrity: sha512-NmTAIl7aW9OHxwB4149sBfvCbTyK9T/CvBX38keaD2yIThet9gZ4koP49hBDxYF99aQX3E+LIAqWwnkV9W72Sw==, + } + engines: { node: ">=10" } + cpu: [x64] + os: [linux, freebsd] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli-win32-i686@2.30.2: + resolution: + { + integrity: sha512-SBR/Q3T6o+7uHwHNdjcG9GA3R++9w8oi778b95GuOC3dh0WOU6hXaKwQWe95ZcuSd2rKpouH7dhMjqqNM4HxOA==, + } + engines: { node: ">=10" } + cpu: [x86, ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli-win32-x64@2.30.2: + resolution: + { + integrity: sha512-gF9wSZxzXFgakkC+uKVLAAYlbYj13e1gTsNm3gm+ODfpV+rbHwvbKoLfNsbVCFVCEZxIV2rXEP5WmTr0kiMvWQ==, + } + engines: { node: ">=10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@sentry/cli@2.30.2: + resolution: + { + integrity: sha512-jQ/RBJ3bZ4PFbfOsGq8EykygHHmXXPw+i6jqsnQfAPIeZoX+DsqpAZbYubQEZKekmQ8EVGFxGHzUVkd6hLVMbA==, + } + engines: { node: ">= 10" } + hasBin: true + requiresBuild: true + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + "@sentry/cli-darwin": 2.30.2 + "@sentry/cli-linux-arm": 2.30.2 + "@sentry/cli-linux-arm64": 2.30.2 + "@sentry/cli-linux-i686": 2.30.2 + "@sentry/cli-linux-x64": 2.30.2 + "@sentry/cli-win32-i686": 2.30.2 + "@sentry/cli-win32-x64": 2.30.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/core@7.107.0: + resolution: + { + integrity: sha512-C7ogye6+KPyBi8NVL0P8Rxx3Ur7Td8ufnjxosVy678lqY+dcYPk/HONROrzUFYW5fMKWL4/KYnwP+x9uHnkDmw==, + } + engines: { node: ">=8" } + dependencies: + "@sentry/types": 7.107.0 + "@sentry/utils": 7.107.0 + dev: false + + /@sentry/core@7.108.0: + resolution: + { + integrity: sha512-I/VNZCFgLASxHZaD0EtxZRM34WG9w2gozqgrKGNMzAymwmQ3K9g/1qmBy4e6iS3YRptb7J5UhQkZQHrcwBbjWQ==, + } + engines: { node: ">=8" } + dependencies: + "@sentry/types": 7.108.0 + "@sentry/utils": 7.108.0 + dev: true + + /@sentry/esbuild-plugin@2.16.0: + resolution: + { + integrity: sha512-bpKLDh4FFFo2Py2KFYevBt2zl80vkDnNs5/WPRJQAqFLYa9dE4YeG8JG6hTVT9TWWp/cXt7PP0LirrRivOuUAQ==, + } + engines: { node: ">= 14" } + dependencies: + "@sentry/bundler-plugin-core": 2.16.0 + unplugin: 1.0.1 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/node@7.107.0: + resolution: + { + integrity: sha512-UZXkG7uThT2YyPW8AOSKRXp1LbVcBHufa4r1XAwBukA2FKO6HHJPjMUgY6DYVQ6k+BmA56CNfVjYrdLbyjBYYA==, + } + engines: { node: ">=8" } + dependencies: + "@sentry-internal/tracing": 7.107.0 + "@sentry/core": 7.107.0 + "@sentry/types": 7.107.0 + "@sentry/utils": 7.107.0 + dev: false + + /@sentry/node@7.108.0: + resolution: + { + integrity: sha512-pMxc9txnDDkU4Z8k2Uw/DPSLPehNtWV3mjJ3+my0AMORGYrXLkJI93tddlE5z/7k+GEJdj1HsOLgxUN0OU+HGA==, + } + engines: { node: ">=8" } + dependencies: + "@sentry-internal/tracing": 7.108.0 + "@sentry/core": 7.108.0 + "@sentry/types": 7.108.0 + "@sentry/utils": 7.108.0 + dev: true + + /@sentry/profiling-node@7.108.0: + resolution: + { + integrity: sha512-P0yD4h8pACgSlD74q/QrMLyhQYs6CR1cTB8VVFsOPuymwUTaS+QTGOqIwQVEXAL9Bit5ds0ZbrZnJTP8GHOETg==, + } + engines: { node: ">=8.0.0" } + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.2 + node-abi: 3.56.0 + dev: true + + /@sentry/types@7.107.0: + resolution: + { + integrity: sha512-H7qcPjPSUWHE/Zf5bR1EE24G0pGVuJgrSx8Tvvl5nKEepswMYlbXHRVSDN0gTk/E5Z7cqf+hUBOpkQgZyps77w==, + } + engines: { node: ">=8" } + dev: false + + /@sentry/types@7.108.0: + resolution: + { + integrity: sha512-bKtHITmBN3kqtqE5eVvL8mY8znM05vEodENwRpcm6TSrrBjC2RnwNWVwGstYDdHpNfFuKwC8mLY9bgMJcENo8g==, + } + engines: { node: ">=8" } + dev: true + + /@sentry/utils@7.107.0: + resolution: + { + integrity: sha512-C6PbN5gHh73MRHohnReeQ60N8rrLYa9LciHue3Ru2290eSThg4CzsPnx4SzkGpkSeVlhhptKtKZ+hp/ha3iVuw==, + } + engines: { node: ">=8" } + dependencies: + "@sentry/types": 7.107.0 + dev: false + + /@sentry/utils@7.108.0: + resolution: + { + integrity: sha512-a45yEFD5qtgZaIFRAcFkG8C8lnDzn6t4LfLXuV4OafGAy/3ZAN3XN8wDnrruHkiUezSSANGsLg3bXaLW/JLvJw==, + } + engines: { node: ">=8" } + dependencies: + "@sentry/types": 7.108.0 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } + dev: true + + /@slonik/migrator@0.12.0(@types/node@20.11.30)(slonik@37.3.1): + resolution: + { + integrity: sha512-2kAXCO/iW9/VOYlfl8Jza4fQpi5Q8+JUyB38YFUxPiWNc+6o41GGND2aIpnyr6EPFNRXdg5x+Fu8+SMyMvMXpQ==, + } + peerDependencies: + slonik: 27 - 29 + dependencies: + "@rushstack/ts-command-line": 4.19.0(@types/node@20.11.30) + slonik: 37.3.1(zod@3.22.4) + umzug: 3.7.0(@types/node@20.11.30) + transitivePeerDependencies: + - "@types/node" + dev: true + + /@types/argparse@1.0.38: + resolution: + { + integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==, + } + dev: true + + /@types/estree@1.0.5: + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + } + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } + dev: true + + /@types/node@20.11.30: + resolution: + { + integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==, + } + dependencies: + undici-types: 5.26.5 + + /@types/pg@8.11.2: + resolution: + { + integrity: sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw==, + } + dependencies: + "@types/node": 20.11.30 + pg-protocol: 1.6.0 + pg-types: 4.0.2 + + /@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + dev: true + + /@vitest/coverage-v8@1.4.0(vitest@1.4.0): + resolution: + { + integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==, + } + peerDependencies: + vitest: 1.4.0 + dependencies: + "@ampproject/remapping": 2.3.0 + "@bcoe/v8-coverage": 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.7 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.4.0(@types/node@20.11.30) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@1.4.0: + resolution: + { + integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==, + } + dependencies: + "@vitest/spy": 1.4.0 + "@vitest/utils": 1.4.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.4.0: + resolution: + { + integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==, + } + dependencies: + "@vitest/utils": 1.4.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.4.0: + resolution: + { + integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==, + } + dependencies: + magic-string: 0.30.7 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.4.0: + resolution: + { + integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==, + } + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.4.0: + resolution: + { + integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==, + } + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: ">=6.5" } + dependencies: + event-target-shim: 5.0.1 + dev: false + + /abstract-logging@2.0.1: + resolution: + { + integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==, + } + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: + { + integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.11.3: + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: ">= 6.0.0" } + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: + { + integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + } + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + dev: true + + /ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: ">=10" } + dev: true + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /archy@1.0.0: + resolution: + { + integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==, + } + dev: false + + /argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: + { + integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: + { + integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, + } + engines: { node: ">= 0.4" } + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.2 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /assertion-error@1.1.0: + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + } + dev: true + + /atomic-sleep@1.0.0: + resolution: + { + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, + } + engines: { node: ">=8.0.0" } + dev: false + + /available-typed-arrays@1.0.7: + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /avvio@8.3.0: + resolution: + { + integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==, + } + dependencies: + "@fastify/error": 3.4.1 + archy: 1.0.0 + debug: 4.3.4 + fastq: 1.17.1 + transitivePeerDependencies: + - supports-color + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: false + + /binary-extensions@2.3.0: + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } + dev: false + + /boolean@3.2.0: + resolution: + { + integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==, + } + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.23.0: + resolution: + { + integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.715 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: false + + /buffer-writer@2.0.0: + resolution: + { + integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==, + } + engines: { node: ">=4" } + + /buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /cac@6.7.14: + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } + dev: true + + /call-bind@1.0.7: + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: ">= 0.4" } + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + dev: true + + /caniuse-lite@1.0.30001600: + resolution: + { + integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==, + } + dev: false + + /chai@4.4.1: + resolution: + { + integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==, + } + engines: { node: ">=4" } + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.3: + resolution: + { + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, + } + dependencies: + get-func-name: 2.0.2 + dev: true + + /chokidar@3.6.0: + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + dev: true + + /colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + requiresBuild: true + dev: true + optional: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + dev: true + + /convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + /cookie@0.6.0: + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } + dev: false + + /cross-spawn@6.0.5: + resolution: + { + integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, + } + engines: { node: ">=4.8" } + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /data-view-buffer@1.0.1: + resolution: + { + integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: + { + integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: + { + integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /dateformat@4.6.3: + resolution: + { + integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, + } + dev: false + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-eql@4.1.3: + resolution: + { + integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, + } + engines: { node: ">=6" } + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + dev: true + + /define-data-property@1.1.4: + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: true + + /diff-sequences@29.6.3: + resolution: + { + integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + dev: true + + /dotenv@16.4.5: + resolution: + { + integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==, + } + engines: { node: ">=12" } + dev: false + + /electron-to-chromium@1.4.715: + resolution: + { + integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==, + } + dev: false + + /emittery@0.13.1: + resolution: + { + integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, + } + engines: { node: ">=12" } + dev: true + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: false + + /error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.2: + resolution: + { + integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==, + } + engines: { node: ">= 0.4" } + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } + dev: true + + /es-object-atoms@1.0.0: + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: ">= 0.4" } + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: + { + integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es6-error@4.1.1: + resolution: + { + integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==, + } + + /esbuild@0.19.12: + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 + + /esbuild@0.20.2: + resolution: + { + integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/aix-ppc64": 0.20.2 + "@esbuild/android-arm": 0.20.2 + "@esbuild/android-arm64": 0.20.2 + "@esbuild/android-x64": 0.20.2 + "@esbuild/darwin-arm64": 0.20.2 + "@esbuild/darwin-x64": 0.20.2 + "@esbuild/freebsd-arm64": 0.20.2 + "@esbuild/freebsd-x64": 0.20.2 + "@esbuild/linux-arm": 0.20.2 + "@esbuild/linux-arm64": 0.20.2 + "@esbuild/linux-ia32": 0.20.2 + "@esbuild/linux-loong64": 0.20.2 + "@esbuild/linux-mips64el": 0.20.2 + "@esbuild/linux-ppc64": 0.20.2 + "@esbuild/linux-riscv64": 0.20.2 + "@esbuild/linux-s390x": 0.20.2 + "@esbuild/linux-x64": 0.20.2 + "@esbuild/netbsd-x64": 0.20.2 + "@esbuild/openbsd-x64": 0.20.2 + "@esbuild/sunos-x64": 0.20.2 + "@esbuild/win32-arm64": 0.20.2 + "@esbuild/win32-ia32": 0.20.2 + "@esbuild/win32-x64": 0.20.2 + dev: true + + /escalade@3.1.2: + resolution: + { + integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + } + engines: { node: ">=6" } + dev: false + + /escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: + { + integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, + } + hasBin: true + peerDependencies: + eslint: ">=7.0.0" + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): + resolution: + { + integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /eslint@8.57.0: + resolution: + { + integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.4 + "@eslint/js": 8.57.0 + "@humanwhocodes/config-array": 0.11.14 + "@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.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + dev: true + + /estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + dependencies: + "@types/estree": 1.0.5 + dev: true + + /esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /event-target-shim@5.0.1: + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: ">=6" } + dev: false + + /events@3.3.0: + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: ">=0.8.x" } + dev: false + + /execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /fast-content-type-parse@1.1.0: + resolution: + { + integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==, + } + dev: false + + /fast-copy@3.0.1: + resolution: + { + integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==, + } + dev: false + + /fast-decode-uri-component@1.0.1: + resolution: + { + integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==, + } + dev: false + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-diff@1.3.0: + resolution: + { + integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, + } + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + dev: true + + /fast-json-stringify@5.12.0: + resolution: + { + integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==, + } + dependencies: + "@fastify/merge-json-schemas": 0.1.1 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-deep-equal: 3.1.3 + fast-uri: 2.3.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.3.1 + dev: false + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + dev: true + + /fast-printf@1.6.9: + resolution: + { + integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==, + } + engines: { node: ">=10.0" } + dependencies: + boolean: 3.2.0 + + /fast-querystring@1.1.2: + resolution: + { + integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==, + } + dependencies: + fast-decode-uri-component: 1.0.1 + dev: false + + /fast-redact@3.3.0: + resolution: + { + integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==, + } + engines: { node: ">=6" } + dev: false + + /fast-safe-stringify@2.1.1: + resolution: + { + integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, + } + dev: false + + /fast-uri@2.3.0: + resolution: + { + integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==, + } + dev: false + + /fastify-plugin@4.5.1: + resolution: + { + integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==, + } + dev: false + + /fastify@4.26.2: + resolution: + { + integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==, + } + dependencies: + "@fastify/ajv-compiler": 3.5.0 + "@fastify/error": 3.4.1 + "@fastify/fast-json-stringify-compiler": 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.3.0 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.12.0 + find-my-way: 8.1.0 + light-my-request: 5.11.1 + pino: 8.19.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.3.1 + secure-json-parse: 2.7.0 + semver: 7.6.0 + toad-cache: 3.7.0 + transitivePeerDependencies: + - supports-color + dev: false + + /fastq@1.17.1: + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-my-way@8.1.0: + resolution: + { + integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==, + } + engines: { node: ">=14" } + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 2.0.0 + dev: false + + /find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /flat-cache@3.2.0: + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: + { + integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, + } + dev: true + + /for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + dependencies: + is-callable: 1.2.7 + dev: true + + /forwarded@0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } + dev: false + + /fs-extra@7.0.1: + resolution: + { + integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, + } + engines: { node: ">=6 <7 || >=8" } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + dev: true + + /function.prototype.name@1.1.6: + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.2 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + dev: true + + /gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + dev: false + + /get-func-name@2.0.2: + resolution: + { + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, + } + dev: true + + /get-intrinsic@1.2.4: + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: ">= 0.4" } + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + dev: true + + /get-stack-trace@3.1.1: + resolution: + { + integrity: sha512-E1rM+umbm9MlMp6zNSap+UI8VVWWmAoUxiAHp1Ron1FV2dM99mgMAHS1tGAGO/ceBjgOXz24GC47aLeNN1llrA==, + } + engines: { node: ">=18.0" } + dependencies: + stacktrace-parser: 0.1.10 + + /get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } + dev: true + + /get-symbol-description@1.0.2: + resolution: + { + integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-tsconfig@4.7.2: + resolution: + { + integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==, + } + dependencies: + resolve-pkg-maps: 1.0.0 + dev: false + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /glob@9.3.5: + resolution: + { + integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: false + + /globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + dev: false + + /globals@13.24.0: + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: + { + integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, + } + engines: { node: ">= 0.4" } + dependencies: + define-properties: 1.2.1 + dev: true + + /gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + dev: true + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + dev: true + + /has-bigints@1.0.2: + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } + dev: true + + /has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + dev: true + + /has-property-descriptors@1.0.2: + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: + { + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + } + engines: { node: ">= 0.4" } + dev: true + + /has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } + dev: true + + /has-tostringtag@1.0.2: + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + dev: true + + /hasown@2.0.1: + resolution: + { + integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==, + } + engines: { node: ">= 0.4" } + dependencies: + function-bind: 1.1.2 + dev: true + + /hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } + dependencies: + function-bind: 1.1.2 + dev: true + + /help-me@5.0.0: + resolution: + { + integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==, + } + dev: false + + /hosted-git-info@2.8.9: + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } + dev: true + + /html-escaper@2.0.2: + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } + dev: true + + /http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /https-proxy-agent@5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: ">= 6" } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: false + + /ignore@5.3.1: + resolution: + { + integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, + } + engines: { node: ">= 4" } + dev: true + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: + { + integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, + } + engines: { node: ">=8" } + dev: true + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + dev: true + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /internal-slot@1.0.7: + resolution: + { + integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, + } + engines: { node: ">= 0.4" } + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } + dev: false + + /is-array-buffer@3.0.4: + resolution: + { + integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + dev: true + + /is-bigint@1.0.4: + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.3.0 + dev: false + + /is-boolean-object@1.1.2: + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } + dev: true + + /is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + dependencies: + hasown: 2.0.1 + dev: true + + /is-data-view@1.0.1: + resolution: + { + integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, + } + engines: { node: ">= 0.4" } + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-negative-zero@2.0.3: + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } + dev: true + + /is-number-object@1.0.7: + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + dev: false + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + dev: true + + /is-regex@1.1.4: + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: + { + integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /is-string@1.0.7: + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.13: + resolution: + { + integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, + } + engines: { node: ">= 0.4" } + dependencies: + which-typed-array: 1.1.15 + dev: true + + /is-weakref@1.0.2: + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } + dependencies: + call-bind: 1.0.7 + dev: true + + /isarray@2.0.5: + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /iso8601-duration@1.3.0: + resolution: + { + integrity: sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ==, + } + + /istanbul-lib-coverage@3.2.2: + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: ">=8" } + dev: true + + /istanbul-lib-report@3.0.1: + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: ">=10" } + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@5.0.4: + resolution: + { + integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==, + } + engines: { node: ">=10" } + dependencies: + "@jridgewell/trace-mapping": 0.3.25 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: + { + integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, + } + engines: { node: ">=8" } + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jju@1.4.0: + resolution: + { + integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==, + } + dev: true + + /joycon@3.1.1: + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: ">=10" } + dev: false + + /js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + dev: false + + /js-tokens@8.0.3: + resolution: + { + integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==, + } + dev: true + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + dev: true + + /json-parse-better-errors@1.0.2: + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + dev: true + + /json-schema-ref-resolver@1.0.1: + resolution: + { + integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==, + } + dependencies: + fast-deep-equal: 3.1.3 + dev: false + + /json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + dev: true + + /json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + dev: true + + /json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + dev: false + + /jsonc-parser@3.2.1: + resolution: + { + integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==, + } + dev: true + + /jsonfile@4.0.0: + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + dev: true + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /light-my-request@5.11.1: + resolution: + { + integrity: sha512-KXAh2m6VRlkWCk2KfmHE7tLBXKh30JE0tXUJY4dNxje4oLmPKUqlUfImiEQZLphx+Z9KTQcVv4DjGnJxkVOIbA==, + } + dependencies: + cookie: 0.6.0 + process-warning: 2.3.2 + set-cookie-parser: 2.6.0 + dev: false + + /load-json-file@4.0.0: + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: ">=4" } + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /local-pkg@0.5.0: + resolution: + { + integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==, + } + engines: { node: ">=14" } + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + dev: true + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.get@4.4.2: + resolution: + { + integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, + } + dev: true + + /lodash.isequal@4.5.0: + resolution: + { + integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, + } + dev: true + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + dev: true + + /loupe@2.3.7: + resolution: + { + integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, + } + dependencies: + get-func-name: 2.0.2 + dev: true + + /lru-cache@10.2.0: + resolution: + { + integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==, + } + engines: { node: 14 || >=16.14 } + dev: false + + /lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + dependencies: + yallist: 3.1.1 + dev: false + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + + /magic-string@0.27.0: + resolution: + { + integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + dev: false + + /magic-string@0.30.7: + resolution: + { + integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + dev: true + + /magicast@0.3.3: + resolution: + { + integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==, + } + dependencies: + "@babel/parser": 7.24.0 + "@babel/types": 7.24.0 + source-map-js: 1.0.2 + dev: true + + /make-dir@4.0.0: + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.6.0 + dev: true + + /media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } + dev: false + + /memorystream@0.3.1: + resolution: + { + integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, + } + engines: { node: ">= 0.10.0" } + dev: true + + /merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: true + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + dev: true + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: + { + integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: false + + /minipass@4.2.8: + resolution: + { + integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, + } + engines: { node: ">=8" } + dev: false + + /minipass@7.0.4: + resolution: + { + integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + dev: false + + /mlly@1.6.1: + resolution: + { + integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==, + } + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.4.0 + dev: true + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + dev: true + + /nice-try@1.0.5: + resolution: + { + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, + } + dev: true + + /node-abi@3.56.0: + resolution: + { + integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.6.0 + dev: true + + /node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } + dev: false + + /normalize-package-data@2.5.0: + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /npm-run-all@4.1.5: + resolution: + { + integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==, + } + engines: { node: ">= 4" } + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.6 + dev: true + + /npm-run-path@5.3.0: + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + path-key: 4.0.0 + dev: true + + /object-inspect@1.13.1: + resolution: + { + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, + } + dev: true + + /object-keys@1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } + dev: true + + /object.assign@4.1.5: + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /obuf@1.1.2: + resolution: + { + integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==, + } + + /on-exit-leak-free@2.1.2: + resolution: + { + integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==, + } + engines: { node: ">=14.0.0" } + dev: false + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-limit@5.0.0: + resolution: + { + integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==, + } + engines: { node: ">=18" } + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /packet-reader@1.0.0: + resolution: + { + integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==, + } + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@4.0.0: + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: ">=4" } + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + dev: true + + /path-key@2.0.1: + resolution: + { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: ">=4" } + dev: true + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + dev: true + + /path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + dev: true + + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: true + + /path-scurry@1.10.1: + resolution: + { + integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: false + + /path-type@3.0.0: + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: ">=4" } + dependencies: + pify: 3.0.0 + dev: true + + /pathe@1.1.2: + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } + dev: true + + /pathval@1.1.1: + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + } + dev: true + + /pg-cloudflare@1.1.1: + resolution: + { + integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==, + } + requiresBuild: true + optional: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.0 - dev: true - - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@fastify/ajv-compiler@3.5.0: - resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - fast-uri: 2.3.0 - dev: false - - /@fastify/error@3.4.1: - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} - dev: false - - /@fastify/fast-json-stringify-compiler@4.3.0: - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} - dependencies: - fast-json-stringify: 5.12.0 - dev: false - - /@fastify/merge-json-schemas@0.1.1: - resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} - dependencies: - fast-deep-equal: 3.1.3 - dev: false - - /@fastify/sensible@5.5.0: - resolution: {integrity: sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==} - dependencies: - '@lukeed/ms': 2.0.2 - fast-deep-equal: 3.1.3 - fastify-plugin: 4.5.1 - forwarded: 0.2.0 - http-errors: 2.0.0 - type-is: 1.6.18 - vary: 1.1.2 - dev: false - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@lukeed/ms@2.0.2: - resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} - engines: {node: '>=8'} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true - - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rushstack/node-core-library@4.0.2(@types/node@20.11.30): - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@types/node': 20.11.30 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - - /@rushstack/terminal@0.10.0(@types/node@20.11.30): - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.11.30) - '@types/node': 20.11.30 - supports-color: 8.1.1 - dev: true - - /@rushstack/ts-command-line@4.19.0(@types/node@20.11.30): - resolution: {integrity: sha512-0sIHWOFGLFb6tC1zk2R0aM79ic3CF0XGzVBvhf6ytMyjDwt03DVb1qe5/5NQ0FGcvB5YyQ2WVfGsnxG6SANvHA==} - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.11.30) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - dev: true - - /@sentry-internal/tracing@7.108.0: - resolution: {integrity: sha512-zuK5XsTsb+U+hgn3SPetYDAogrXsM16U/LLoMW7+TlC6UjlHGYQvmX3o+M2vntejoU1QZS8m1bCAZSMWEypAEw==} - engines: {node: '>=8'} - dependencies: - '@sentry/core': 7.108.0 - '@sentry/types': 7.108.0 - '@sentry/utils': 7.108.0 - dev: false - - /@sentry/core@7.108.0: - resolution: {integrity: sha512-I/VNZCFgLASxHZaD0EtxZRM34WG9w2gozqgrKGNMzAymwmQ3K9g/1qmBy4e6iS3YRptb7J5UhQkZQHrcwBbjWQ==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.108.0 - '@sentry/utils': 7.108.0 - dev: false - - /@sentry/node@7.108.0: - resolution: {integrity: sha512-pMxc9txnDDkU4Z8k2Uw/DPSLPehNtWV3mjJ3+my0AMORGYrXLkJI93tddlE5z/7k+GEJdj1HsOLgxUN0OU+HGA==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/tracing': 7.108.0 - '@sentry/core': 7.108.0 - '@sentry/types': 7.108.0 - '@sentry/utils': 7.108.0 - dev: false - - /@sentry/profiling-node@7.108.0: - resolution: {integrity: sha512-P0yD4h8pACgSlD74q/QrMLyhQYs6CR1cTB8VVFsOPuymwUTaS+QTGOqIwQVEXAL9Bit5ds0ZbrZnJTP8GHOETg==} - engines: {node: '>=8.0.0'} - hasBin: true - requiresBuild: true - dependencies: - detect-libc: 2.0.3 - node-abi: 3.56.0 - dev: false - - /@sentry/types@7.108.0: - resolution: {integrity: sha512-bKtHITmBN3kqtqE5eVvL8mY8znM05vEodENwRpcm6TSrrBjC2RnwNWVwGstYDdHpNfFuKwC8mLY9bgMJcENo8g==} - engines: {node: '>=8'} - dev: false - - /@sentry/utils@7.108.0: - resolution: {integrity: sha512-a45yEFD5qtgZaIFRAcFkG8C8lnDzn6t4LfLXuV4OafGAy/3ZAN3XN8wDnrruHkiUezSSANGsLg3bXaLW/JLvJw==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.108.0 - dev: false - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@slonik/migrator@0.12.0(@types/node@20.11.30)(slonik@37.4.0): - resolution: {integrity: sha512-2kAXCO/iW9/VOYlfl8Jza4fQpi5Q8+JUyB38YFUxPiWNc+6o41GGND2aIpnyr6EPFNRXdg5x+Fu8+SMyMvMXpQ==} - peerDependencies: - slonik: 27 - 29 - dependencies: - '@rushstack/ts-command-line': 4.19.0(@types/node@20.11.30) - slonik: 37.4.0(zod@3.22.4) - umzug: 3.7.0(@types/node@20.11.30) - transitivePeerDependencies: - - '@types/node' - dev: true - - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/node@20.11.30: - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} - dependencies: - undici-types: 5.26.5 - - /@types/pg@8.11.4: - resolution: {integrity: sha512-yw3Bwbda6vO+NvI1Ue/YKOwtl31AYvvd/e73O3V4ZkNzuGpTDndLSyc0dQRB2xrQqDePd20pEGIfqSp/GH3pRw==} - dependencies: - '@types/node': 20.11.30 - pg-protocol: 1.6.0 - pg-types: 4.0.2 - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@vitest/coverage-v8@1.4.0(vitest@1.4.0): - resolution: {integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==} - peerDependencies: - vitest: 1.4.0 - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 - istanbul-reports: 3.1.7 - magic-string: 0.30.7 - magicast: 0.3.3 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - vitest: 1.4.0(@types/node@20.11.30) - transitivePeerDependencies: - - supports-color - dev: true - - /@vitest/expect@1.4.0: - resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} - dependencies: - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - chai: 4.4.1 - dev: true - - /@vitest/runner@1.4.0: - resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} - dependencies: - '@vitest/utils': 1.4.0 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true - - /@vitest/snapshot@1.4.0: - resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} - dependencies: - magic-string: 0.30.7 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.4.0: - resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} - dependencies: - tinyspy: 2.2.1 - dev: true - - /@vitest/utils@1.4.0: - resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - - /abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - dev: false - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: false - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: false - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false - - /avvio@8.3.0: - resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} - dependencies: - '@fastify/error': 3.4.1 - archy: 1.0.0 - debug: 4.3.4 - fastq: 1.17.1 - transitivePeerDependencies: - - supports-color - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - requiresBuild: true - dev: true - optional: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false - - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - dev: false - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.57.0 - dev: true - - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) - prettier: 3.2.5 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@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.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - dev: false - - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: false - - /fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-json-stringify@5.12.0: - resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} - dependencies: - '@fastify/merge-json-schemas': 0.1.1 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - fast-deep-equal: 3.1.3 - fast-uri: 2.3.0 - json-schema-ref-resolver: 1.0.1 - rfdc: 1.3.1 - dev: false - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-printf@1.6.9: - resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} - engines: {node: '>=10.0'} - dependencies: - boolean: 3.2.0 - - /fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - dependencies: - fast-decode-uri-component: 1.0.1 - dev: false - - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false - - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: false - - /fast-uri@2.3.0: - resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} - dev: false - - /fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - dev: false - - /fastify@4.26.2: - resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} - dependencies: - '@fastify/ajv-compiler': 3.5.0 - '@fastify/error': 3.4.1 - '@fastify/fast-json-stringify-compiler': 4.3.0 - abstract-logging: 2.0.1 - avvio: 8.3.0 - fast-content-type-parse: 1.1.0 - fast-json-stringify: 5.12.0 - find-my-way: 8.1.0 - light-my-request: 5.11.1 - pino: 8.19.0 - process-warning: 3.0.0 - proxy-addr: 2.0.7 - rfdc: 1.3.1 - secure-json-parse: 2.7.0 - semver: 7.6.0 - toad-cache: 3.7.0 - transitivePeerDependencies: - - supports-color - dev: false - - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - - /find-my-way@8.1.0: - resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} - engines: {node: '>=14'} - dependencies: - fast-deep-equal: 3.1.3 - fast-querystring: 1.1.2 - safe-regex2: 2.0.0 - dev: false - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true - - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: false - - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-stack-trace@3.1.1: - resolution: {integrity: sha512-E1rM+umbm9MlMp6zNSap+UI8VVWWmAoUxiAHp1Ron1FV2dM99mgMAHS1tGAGO/ceBjgOXz24GC47aLeNN1llrA==} - engines: {node: '>=18.0'} - dependencies: - stacktrace-parser: 0.1.10 - - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: false - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - dev: false - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: false - - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: false - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.1 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /iso8601-duration@1.3.0: - resolution: {integrity: sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ==} - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} - engines: {node: '>=10'} - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true - - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false - - /js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} - dependencies: - fast-deep-equal: 3.1.3 - dev: false - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /light-my-request@5.11.1: - resolution: {integrity: sha512-KXAh2m6VRlkWCk2KfmHE7tLBXKh30JE0tXUJY4dNxje4oLmPKUqlUfImiEQZLphx+Z9KTQcVv4DjGnJxkVOIbA==} - dependencies: - cookie: 0.6.0 - process-warning: 2.3.2 - set-cookie-parser: 2.6.0 - dev: false - - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true - - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /magicast@0.3.3: - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} - dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - source-map-js: 1.0.2 - dev: true - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.6.0 - dev: true - - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: false - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /node-abi@3.56.0: - resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} - engines: {node: '>=10'} - dependencies: - semver: 7.6.0 - dev: false - - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - requiresBuild: true - optional: true - - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - - /pg-cursor@2.10.3(pg@8.11.3): - resolution: {integrity: sha512-rDyBVoqPVnx/PTmnwQAYgusSeAKlTL++gmpf5klVK+mYMFEqsOc6VHHZnPKc/4lOvr4r6fiMuoxSFuBF1dx4FQ==} - peerDependencies: - pg: ^8 - dependencies: - pg: 8.11.3 - - /pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - /pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} - - /pg-pool@3.6.1(pg@8.11.3): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} - peerDependencies: - pg: '>=8.0' - dependencies: - pg: 8.11.3 - - /pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - - /pg-query-stream@4.5.3(pg@8.11.3): - resolution: {integrity: sha512-ufa94r/lHJdjAm3+zPZEO0gXAmCb4tZPaOt7O76mjcxdL/HxwTuryy76km+u0odBBgtfdKFYq/9XGfiYeQF0yA==} - peerDependencies: - pg: ^8 - dependencies: - pg: 8.11.3 - pg-cursor: 2.10.3(pg@8.11.3) - - /pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - - /pg-types@4.0.2: - resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} - engines: {node: '>=10'} - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: 3.0.2 - postgres-bytea: 3.0.0 - postgres-date: 2.1.0 - postgres-interval: 3.0.0 - postgres-range: 1.1.4 - - /pg@8.11.3: - resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} - engines: {node: '>= 8.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.11.3) - pg-protocol: 1.6.0 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.1.1 - - /pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - dependencies: - split2: 4.2.0 - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} - dependencies: - readable-stream: 4.5.2 - split2: 4.2.0 - dev: false - - /pino-pretty@11.0.0: - resolution: {integrity: sha512-YFJZqw59mHIY72wBnBs7XhLGG6qpJMa4pEQTRgEPEbjIYbng2LXEZZF1DoyDg9CfejEy8uZCyzpcBXXG0oOCwQ==} - hasBin: true - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 5.0.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 - pump: 3.0.0 - readable-stream: 4.5.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.8.0 - strip-json-comments: 3.1.1 - dev: false - - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false - - /pino@8.19.0: - resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 3.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.0 - thread-stream: 2.4.1 - dev: false - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 - dev: true - - /pony-cause@2.1.10: - resolution: {integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==} - engines: {node: '>=12.0.0'} - dev: true - - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - - /postgres-array@3.0.2: - resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} - engines: {node: '>=12'} - - /postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - - /postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} - dependencies: - obuf: 1.1.2 - - /postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - - /postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} - - /postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - dependencies: - xtend: 4.0.2 - - /postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} - - /postgres-interval@4.0.2: - resolution: {integrity: sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==} - engines: {node: '>=12'} - - /postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.3.0 - dev: true - - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /process-warning@2.3.2: - resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} - dev: false - - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: false - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - dev: false - - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: false - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /roarr@7.21.1: - resolution: {integrity: sha512-3niqt5bXFY1InKU8HKWqqYTYjtrBaxBMnXELXCXUYgtNYGUtZM5rB46HIC430AyacL95iEniGf7RgqsesykLmQ==} - engines: {node: '>=18.0'} - dependencies: - fast-printf: 1.6.9 - safe-stable-stringify: 2.4.3 - semver-compare: 1.0.0 - - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 - fsevents: 2.3.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safe-regex2@2.0.0: - resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} - dependencies: - ret: 0.2.2 - dev: false - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: false - - /semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} - dependencies: - type-fest: 0.20.2 - - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: false - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /short-unique-id@5.0.3: - resolution: {integrity: sha512-yhniEILouC0s4lpH0h7rJsfylZdca10W9mDJRAFh3EpcSUanCHGb0R7kcFOIUCZYSAPo0PUD5ZxWQdW0T4xaug==} - hasBin: true - dev: false - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - - /slonik@37.4.0(zod@3.22.4): - resolution: {integrity: sha512-W9GPnc4M5+JLvrl4aMx2qkpIQrHLo6vAmCc2UeTD5Szl2uBA2ChZo3njdygK1511wrlSSDnOySY+jlLNAfpIvA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3 - dependencies: - '@types/pg': 8.11.4 - es6-error: 4.1.1 - get-stack-trace: 3.1.1 - iso8601-duration: 1.3.0 - pg: 8.11.3 - pg-protocol: 1.6.0 - pg-query-stream: 4.5.3(pg@8.11.3) - pg-types: 4.0.2 - postgres-array: 3.0.2 - postgres-interval: 4.0.2 - roarr: 7.21.1 - safe-stable-stringify: 2.4.3 - serialize-error: 8.1.0 - zod: 3.22.4 - transitivePeerDependencies: - - pg-native - - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} - dependencies: - atomic-sleep: 1.0.0 - dev: false - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} - dependencies: - type-fest: 0.7.1 - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false - - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true - - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} - dependencies: - js-tokens: 8.0.3 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} - dependencies: - real-require: 0.2.0 - dev: false - - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true - - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - dev: false - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /tsx@4.7.1: - resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - - /type-fest@4.10.3: - resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} - engines: {node: '>=16'} - dev: true - - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: false - - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - dev: true - - /umzug@3.7.0(@types/node@20.11.30): - resolution: {integrity: sha512-r/L2Zlilgv3SKhmP2nkA9x2Xi1PKtu2K34/i/s7AYJ2mLjEO+IxETJAK7CKf6l3QOvoy5/ChykeX9qt6ykRz6Q==} - engines: {node: '>=12'} - dependencies: - '@rushstack/ts-command-line': 4.19.0(@types/node@20.11.30) - emittery: 0.13.1 - glob: 8.1.0 - pony-cause: 2.1.10 - type-fest: 4.10.3 - transitivePeerDependencies: - - '@types/node' - dev: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true - - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: false - - /vite-node@1.4.0(@types/node@20.11.30): - resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.4(@types/node@20.11.30) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@5.1.4(@types/node@20.11.30): - resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.11.30 - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vitest@1.4.0(@types/node@20.11.30): - resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.4.0 - '@vitest/ui': 1.4.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@types/node': 20.11.30 - '@vitest/expect': 1.4.0 - '@vitest/runner': 1.4.0 - '@vitest/snapshot': 1.4.0 - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.7 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.1.4(@types/node@20.11.30) - vite-node: 1.4.0(@types/node@20.11.30) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.11.0 - optionalDependencies: - commander: 9.5.0 - dev: true - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /pg-connection-string@2.6.2: + resolution: + { + integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==, + } + + /pg-cursor@2.10.3(pg@8.11.3): + resolution: + { + integrity: sha512-rDyBVoqPVnx/PTmnwQAYgusSeAKlTL++gmpf5klVK+mYMFEqsOc6VHHZnPKc/4lOvr4r6fiMuoxSFuBF1dx4FQ==, + } + peerDependencies: + pg: ^8 + dependencies: + pg: 8.11.3 + + /pg-int8@1.0.1: + resolution: + { + integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==, + } + engines: { node: ">=4.0.0" } + + /pg-numeric@1.0.2: + resolution: + { + integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==, + } + engines: { node: ">=4" } + + /pg-pool@3.6.1(pg@8.11.3): + resolution: + { + integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==, + } + peerDependencies: + pg: ">=8.0" + dependencies: + pg: 8.11.3 + + /pg-protocol@1.6.0: + resolution: + { + integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==, + } + + /pg-query-stream@4.5.3(pg@8.11.3): + resolution: + { + integrity: sha512-ufa94r/lHJdjAm3+zPZEO0gXAmCb4tZPaOt7O76mjcxdL/HxwTuryy76km+u0odBBgtfdKFYq/9XGfiYeQF0yA==, + } + peerDependencies: + pg: ^8 + dependencies: + pg: 8.11.3 + pg-cursor: 2.10.3(pg@8.11.3) + + /pg-types@2.2.0: + resolution: + { + integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==, + } + engines: { node: ">=4" } + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + /pg-types@4.0.2: + resolution: + { + integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==, + } + engines: { node: ">=10" } + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + /pg@8.11.3: + resolution: + { + integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==, + } + engines: { node: ">= 8.0.0" } + peerDependencies: + pg-native: ">=3.0.1" + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.6.2 + pg-pool: 3.6.1(pg@8.11.3) + pg-protocol: 1.6.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + /pgpass@1.0.5: + resolution: + { + integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==, + } + dependencies: + split2: 4.2.0 + + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + dev: false + + /pidtree@0.3.1: + resolution: + { + integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: true + + /pify@3.0.0: + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: ">=4" } + dev: true + + /pino-abstract-transport@1.1.0: + resolution: + { + integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==, + } + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + dev: false + + /pino-pretty@11.0.0: + resolution: + { + integrity: sha512-YFJZqw59mHIY72wBnBs7XhLGG6qpJMa4pEQTRgEPEbjIYbng2LXEZZF1DoyDg9CfejEy8uZCyzpcBXXG0oOCwQ==, + } + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.1 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.8.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: + { + integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==, + } + dev: false + + /pino@8.19.0: + resolution: + { + integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==, + } + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.0 + thread-stream: 2.4.1 + dev: false + + /pkg-types@1.0.3: + resolution: + { + integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, + } + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + dev: true + + /pony-cause@2.1.10: + resolution: + { + integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==, + } + engines: { node: ">=12.0.0" } + dev: true + + /possible-typed-array-names@1.0.0: + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: ">= 0.4" } + dev: true + + /postcss@8.4.35: + resolution: + { + integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==, + } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /postgres-array@2.0.0: + resolution: + { + integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==, + } + engines: { node: ">=4" } + + /postgres-array@3.0.2: + resolution: + { + integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==, + } + engines: { node: ">=12" } + + /postgres-bytea@1.0.0: + resolution: + { + integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==, + } + engines: { node: ">=0.10.0" } + + /postgres-bytea@3.0.0: + resolution: + { + integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==, + } + engines: { node: ">= 6" } + dependencies: + obuf: 1.1.2 + + /postgres-date@1.0.7: + resolution: + { + integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==, + } + engines: { node: ">=0.10.0" } + + /postgres-date@2.1.0: + resolution: + { + integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==, + } + engines: { node: ">=12" } + + /postgres-interval@1.2.0: + resolution: + { + integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + xtend: 4.0.2 + + /postgres-interval@3.0.0: + resolution: + { + integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==, + } + engines: { node: ">=12" } + + /postgres-interval@4.0.2: + resolution: + { + integrity: sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==, + } + engines: { node: ">=12" } + + /postgres-range@1.1.4: + resolution: + { + integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==, + } + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.2.5: + resolution: + { + integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /pretty-format@29.7.0: + resolution: + { + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/schemas": 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /process-warning@2.3.2: + resolution: + { + integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==, + } + dev: false + + /process-warning@3.0.0: + resolution: + { + integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==, + } + dev: false + + /process@0.11.10: + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: ">= 0.6.0" } + dev: false + + /progress@2.0.3: + resolution: + { + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, + } + engines: { node: ">=0.4.0" } + dev: false + + /proxy-addr@2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + dev: false + + /pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + dev: true + + /quick-format-unescaped@4.0.4: + resolution: + { + integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, + } + dev: false + + /react-is@18.2.0: + resolution: + { + integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, + } + dev: true + + /read-pkg@3.0.0: + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: ">=4" } + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /readable-stream@4.5.2: + resolution: + { + integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: false + + /real-require@0.2.0: + resolution: + { + integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, + } + engines: { node: ">= 12.13.0" } + dev: false + + /regexp.prototype.flags@1.5.2: + resolution: + { + integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + dev: false + + /resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /ret@0.2.2: + resolution: + { + integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==, + } + engines: { node: ">=4" } + dev: false + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rfdc@1.3.1: + resolution: + { + integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==, + } + dev: false + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /roarr@7.21.1: + resolution: + { + integrity: sha512-3niqt5bXFY1InKU8HKWqqYTYjtrBaxBMnXELXCXUYgtNYGUtZM5rB46HIC430AyacL95iEniGf7RgqsesykLmQ==, + } + engines: { node: ">=18.0" } + dependencies: + fast-printf: 1.6.9 + safe-stable-stringify: 2.4.3 + semver-compare: 1.0.0 + + /rollup@4.12.0: + resolution: + { + integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + dependencies: + "@types/estree": 1.0.5 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.12.0 + "@rollup/rollup-android-arm64": 4.12.0 + "@rollup/rollup-darwin-arm64": 4.12.0 + "@rollup/rollup-darwin-x64": 4.12.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.12.0 + "@rollup/rollup-linux-arm64-gnu": 4.12.0 + "@rollup/rollup-linux-arm64-musl": 4.12.0 + "@rollup/rollup-linux-riscv64-gnu": 4.12.0 + "@rollup/rollup-linux-x64-gnu": 4.12.0 + "@rollup/rollup-linux-x64-musl": 4.12.0 + "@rollup/rollup-win32-arm64-msvc": 4.12.0 + "@rollup/rollup-win32-ia32-msvc": 4.12.0 + "@rollup/rollup-win32-x64-msvc": 4.12.0 + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.1.2: + resolution: + { + integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, + } + engines: { node: ">=0.4" } + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /safe-regex-test@1.0.3: + resolution: + { + integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safe-regex2@2.0.0: + resolution: + { + integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==, + } + dependencies: + ret: 0.2.2 + dev: false + + /safe-stable-stringify@2.4.3: + resolution: + { + integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==, + } + engines: { node: ">=10" } + + /secure-json-parse@2.7.0: + resolution: + { + integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, + } + dev: false + + /semver-compare@1.0.0: + resolution: + { + integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==, + } + + /semver@5.7.2: + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + dev: true + + /semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + dev: false + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.0: + resolution: + { + integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /serialize-error@8.1.0: + resolution: + { + integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==, + } + engines: { node: ">=10" } + dependencies: + type-fest: 0.20.2 + + /set-cookie-parser@2.6.0: + resolution: + { + integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==, + } + dev: false + + /set-function-length@1.2.2: + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + dev: false + + /shebang-command@1.2.0: + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: ">=0.10.0" } + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + dev: true + + /shell-quote@1.8.1: + resolution: + { + integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + } + dev: true + + /short-unique-id@5.0.3: + resolution: + { + integrity: sha512-yhniEILouC0s4lpH0h7rJsfylZdca10W9mDJRAFh3EpcSUanCHGb0R7kcFOIUCZYSAPo0PUD5ZxWQdW0T4xaug==, + } + hasBin: true + dev: false + + /side-channel@1.0.6: + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + dev: true + + /signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + dev: true + + /slonik@37.3.1(zod@3.22.4): + resolution: + { + integrity: sha512-vidC0OleHqIrFt5gGWgwy4CUhE+dSo71/661g2MyQFNpT/ZyiBZ1BscGK8gLlw4K8xYTo4SL+POBBLp+X5wYsg==, + } + engines: { node: ">=18" } + peerDependencies: + zod: ^3 + dependencies: + "@types/pg": 8.11.2 + es6-error: 4.1.1 + get-stack-trace: 3.1.1 + iso8601-duration: 1.3.0 + pg: 8.11.3 + pg-protocol: 1.6.0 + pg-query-stream: 4.5.3(pg@8.11.3) + pg-types: 4.0.2 + postgres-array: 3.0.2 + postgres-interval: 4.0.2 + roarr: 7.21.1 + safe-stable-stringify: 2.4.3 + serialize-error: 8.1.0 + zod: 3.22.4 + transitivePeerDependencies: + - pg-native + + /sonic-boom@3.8.0: + resolution: + { + integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==, + } + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /source-map-js@1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + dev: true + + /spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-exceptions@2.5.0: + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } + dev: true + + /spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-license-ids@3.0.17: + resolution: + { + integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==, + } + dev: true + + /split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: ">= 10.x" } + + /sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + dev: true + + /stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + dev: true + + /stacktrace-parser@0.1.10: + resolution: + { + integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==, + } + engines: { node: ">=6" } + dependencies: + type-fest: 0.7.1 + + /statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /std-env@3.7.0: + resolution: + { + integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==, + } + dev: true + + /string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: ">=0.6.19" } + dev: true + + /string.prototype.padend@3.1.6: + resolution: + { + integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trim@1.2.9: + resolution: + { + integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: + { + integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, + } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + dev: true + + /strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + dev: true + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + /strip-literal@2.0.0: + resolution: + { + integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==, + } + dependencies: + js-tokens: 8.0.3 + dev: true + + /supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: ">=10" } + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + dev: true + + /synckit@0.8.8: + resolution: + { + integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + dependencies: + "@pkgr/core": 0.1.1 + tslib: 2.6.2 + dev: true + + /test-exclude@6.0.0: + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: ">=8" } + dependencies: + "@istanbuljs/schema": 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + dev: true + + /thread-stream@2.4.1: + resolution: + { + integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==, + } + dependencies: + real-require: 0.2.0 + dev: false + + /tinybench@2.6.0: + resolution: + { + integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==, + } + dev: true + + /tinypool@0.8.2: + resolution: + { + integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==, + } + engines: { node: ">=14.0.0" } + dev: true + + /tinyspy@2.2.1: + resolution: + { + integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==, + } + engines: { node: ">=14.0.0" } + dev: true + + /to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + dev: false + + /toad-cache@3.7.0: + resolution: + { + integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==, + } + engines: { node: ">=12" } + dev: false + + /toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } + dev: false + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + dev: true + + /tsx@4.7.1: + resolution: + { + integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==, + } + engines: { node: ">=18.0.0" } + hasBin: true + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: ">=4" } + dev: true + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type-fest@0.7.1: + resolution: + { + integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==, + } + engines: { node: ">=8" } + + /type-fest@4.10.3: + resolution: + { + integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==, + } + engines: { node: ">=16" } + dev: true + + /type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typed-array-buffer@1.0.2: + resolution: + { + integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: + { + integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: + { + integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: + { + integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /typescript@5.4.3: + resolution: + { + integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==, + } + engines: { node: ">=14.17" } + hasBin: true + dev: true + + /ufo@1.4.0: + resolution: + { + integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==, + } + dev: true + + /umzug@3.7.0(@types/node@20.11.30): + resolution: + { + integrity: sha512-r/L2Zlilgv3SKhmP2nkA9x2Xi1PKtu2K34/i/s7AYJ2mLjEO+IxETJAK7CKf6l3QOvoy5/ChykeX9qt6ykRz6Q==, + } + engines: { node: ">=12" } + dependencies: + "@rushstack/ts-command-line": 4.19.0(@types/node@20.11.30) + emittery: 0.13.1 + glob: 8.1.0 + pony-cause: 2.1.10 + type-fest: 4.10.3 + transitivePeerDependencies: + - "@types/node" + dev: true + + /unbox-primitive@1.0.2: + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + /universalify@0.1.2: + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: ">= 4.0.0" } + dev: true + + /unplugin@1.0.1: + resolution: + { + integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==, + } + dependencies: + acorn: 8.11.3 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.1 + + /uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true + dev: false + + /v8-to-istanbul@9.2.0: + resolution: + { + integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==, + } + engines: { node: ">=10.12.0" } + dependencies: + "@jridgewell/trace-mapping": 0.3.25 + "@types/istanbul-lib-coverage": 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validator@13.11.0: + resolution: + { + integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==, + } + engines: { node: ">= 0.10" } + dev: true + + /vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } + dev: false + + /vite-node@1.4.0(@types/node@20.11.30): + resolution: + { + integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.1.4(@types/node@20.11.30) + transitivePeerDependencies: + - "@types/node" + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.1.4(@types/node@20.11.30): + resolution: + { + integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + "@types/node": 20.11.30 + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.4.0(@types/node@20.11.30): + resolution: + { + integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 1.4.0 + "@vitest/ui": 1.4.0 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + "@types/node": 20.11.30 + "@vitest/expect": 1.4.0 + "@vitest/runner": 1.4.0 + "@vitest/snapshot": 1.4.0 + "@vitest/spy": 1.4.0 + "@vitest/utils": 1.4.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.7 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.4(@types/node@20.11.30) + vite-node: 1.4.0(@types/node@20.11.30) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + dev: false + + /webpack-sources@3.2.3: + resolution: + { + integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, + } + engines: { node: ">=10.13.0" } + dev: false + + /webpack-virtual-modules@0.5.0: + resolution: + { + integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==, + } + dev: false + + /whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array@1.1.15: + resolution: + { + integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /why-is-node-running@2.2.2: + resolution: + { + integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==, + } + engines: { node: ">=8" } + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } + + /yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + dev: false + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: ">=12.20" } + dev: true + + /z-schema@5.0.5: + resolution: + { + integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==, + } + engines: { node: ">=8.0.0" } + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 + dev: true + + /zod@3.22.4: + resolution: + { + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, + } diff --git a/test/factoryMocks.d.ts b/test/factoryMocks.d.ts new file mode 100644 index 000000000..a4db3db66 --- /dev/null +++ b/test/factoryMocks.d.ts @@ -0,0 +1,6 @@ +import type { DatabaseManager } from "../packages/interfaces/index.js"; +export declare function mockDatabaseManager(): DatabaseManager; +/** @type TServerLogger */ +export declare function mockLogger(): any; +/** @type ServerMessageType */ +export declare function mockServerMessageType(): any; diff --git a/test/factoryMocks.ts b/test/factoryMocks.ts index 43650a363..69c2abe05 100644 --- a/test/factoryMocks.ts +++ b/test/factoryMocks.ts @@ -1,5 +1,5 @@ import { expect, it, vi } from "vitest"; -import { DatabaseManager } from "../packages/interfaces/index.js"; +import type { DatabaseManager } from "../packages/interfaces/index.js"; import { verifyLegacyCipherSupport } from "../packages/gateway/src/encryption.js"; export function mockDatabaseManager(): DatabaseManager { diff --git a/tsconfig.json b/tsconfig.json index 31d9c81ae..657436df7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,27 +1,18 @@ { "compilerOptions": { - "incremental": true, - "target": "es2022", - "module": "NodeNext", - "noImplicitOverride": true, - "declaration": true, - "declarationMap": true, - "outDir": "./dist", "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "target": "ES2022", + "verbatimModuleSyntax": true, + "resolveJsonModule": true, + "moduleDetection": "force", "strict": true, - "skipLibCheck": true + "noUncheckedIndexedAccess": true, + "moduleResolution": "Bundler", + "module": "ES2022", + "lib": ["ES2022"], + "declaration": true, + "emitDeclarationOnly": true }, - "include": [ - "src", - "test", - "packages", - "thebeast", - "lib", - "vite.config.ts", - "server.ts", - "migrate.ts", - "test", - "apps/main/server.ts" - ] + "include": ["apps/**/*", "packages/**/*"] }