diff --git a/instrument.mjs b/instrument.js similarity index 100% rename from instrument.mjs rename to instrument.js diff --git a/package.json b/package.json index 8dad6b7..c3d63f2 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,10 @@ "type": "module", "private": true, "scripts": { + "build": "tsc -b --verbose", + "clean": "rm -rf dist", "lint": "eslint .", - "start": "node --import 'data:text/javascript,import { register } from \"node:module\"; import { pathToFileURL } from \"node:url\"; register(\"@opentelemetry/instrumentation/hook.mjs\", pathToFileURL(\"./\"));' --import ./instrument.mjs server.js", + "start": "node --openssl-legacy-provider --import 'data:text/javascript,import { register } from \"node:module\"; import { pathToFileURL } from \"node:url\"; register(\"@opentelemetry/instrumentation/hook.mjs\", pathToFileURL(\"./\"));' --import ./instrument.js server.js", "test": "vitest run" }, "keywords": [], @@ -15,10 +17,12 @@ "license": "LGPL-3.0-or-later", "devDependencies": { "@eslint/js": "^9.3.0", + "@types/express": "^4.17.21", "@types/node": "^20.12.12", "@vitest/coverage-v8": "^1.6.0", "eslint": "^9.3.0", "globals": "^15.3.0", + "typescript": "^5.4.5", "vitest": "^1.6.0" }, "packageManager": "pnpm@9.1.4+sha256.30a1801ac4e723779efed13a21f4c39f9eb6c9fbb4ced101bce06b422593d7c9", @@ -27,6 +31,7 @@ "@sentry/node": "^8.7.0", "@sentry/profiling-node": "^8.7.0", "express": "^4.19.2", - "obsidian-main": "link:packages/main" + "obsidian-main": "link:packages/main", + "tsx": "^4.11.0" } } diff --git a/packages/main/jsconfig.json b/packages/main/jsconfig.json deleted file mode 100644 index dc20f02..0000000 --- a/packages/main/jsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "NodeNext", - "moduleResolution": "NodeNext", - "target": "ES2020", - "checkJs": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strict": true - }, - "exclude": ["node_modules", "**/node_modules/*"] -} diff --git a/packages/main/src/MainLoop.d.ts b/packages/main/src/MainLoop.d.ts new file mode 100644 index 0000000..de6f75f --- /dev/null +++ b/packages/main/src/MainLoop.d.ts @@ -0,0 +1,40 @@ +/// +import { KeypressEvent, TTask } from "./types.js"; +export declare class MainLoop { + /** @type {NodeJS.Timeout | undefined} */ + _timer: NodeJS.Timeout | undefined; + /** @type {Array} */ + _startTasks: Array; + /** @type {Array} */ + _stopTasks: Array; + /** @type {Array} */ + _loopTasks: Array; + /** + * + * @param {import("obsidian-main").KeypressEvent} key + */ + handleKeypressEvent(key: KeypressEvent): void; + /** + * + * @param {"start" | "loop" | "stop"} type + * @param {import("obsidian-main").Task} task + */ + addTask(type: "start" | "loop" | "stop", task: TTask): void; + /** + * @param {Array} tasks + */ + _callTasks(tasks: Array): Promise; + /** + * Starts the main loop. + * + */ + start(): Promise; + /** + * Stops the main loop. + */ + stop(): Promise; + /** + * Body of the main loop. + */ + loop(): Promise; +} diff --git a/packages/main/src/MainLoop.js b/packages/main/src/MainLoop.js index 4613939..9900380 100644 --- a/packages/main/src/MainLoop.js +++ b/packages/main/src/MainLoop.js @@ -1,109 +1,98 @@ // obsidian-spoon is a game server // Copyright (C) 2024 Molly Crendraven - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - import { emitKeypressEvents } from "node:readline"; import { _atExit } from "obsidian-main"; - export class MainLoop { - /** @type {NodeJS.Timeout | undefined} */ - _timer = undefined; - - /** @type {Array} */ - _startTasks = []; - - /** @type {Array} */ - _stopTasks = []; - - /** @type {Array} */ - _loopTasks = []; - - /** - * - * @param {import("obsidian-main").KeypressEvent} key - */ - handleKeypressEvent(key) { - const keyString = key.sequence; - - if (keyString === "x") { - this.stop(); + /** @type {NodeJS.Timeout | undefined} */ + _timer = undefined; + /** @type {Array} */ + _startTasks = []; + /** @type {Array} */ + _stopTasks = []; + /** @type {Array} */ + _loopTasks = []; + /** + * + * @param {import("obsidian-main").KeypressEvent} key + */ + handleKeypressEvent(key) { + const keyString = key.sequence; + if (keyString === "x") { + this.stop(); + } } - } - /** - * - * @param {"start" | "loop" | "stop"} type - * @param {import("obsidian-main").Task} task - */ - addTask(type, task) { - if (type === "start") { - this._startTasks.push(task); - } else if (type === "stop") { - this._stopTasks.push(task); - } else if (type === "loop") { - this._loopTasks.push(task); + /** + * + * @param {"start" | "loop" | "stop"} type + * @param {import("obsidian-main").Task} task + */ + addTask(type, task) { + if (type === "start") { + this._startTasks.push(task); + } + else if (type === "stop") { + this._stopTasks.push(task); + } + else if (type === "loop") { + this._loopTasks.push(task); + } } - } - - /** - * @param {Array} tasks - */ - async _callTasks(tasks) { - tasks.forEach(async (task) => { - await task(); - }); - } - - /** - * Starts the main loop. - * - */ - async start() { - this.timer = setTimeout(this.loop.bind(this), 1000); - if (process.stdin.isTTY !== true) { - return; + /** + * @param {Array} tasks + */ + async _callTasks(tasks) { + tasks.forEach(async (task) => { + await task(); + }); } - emitKeypressEvents(process.stdin); - process.stdin.setRawMode(true); - process.stdin.resume(); - console.log("Press X to exit"); - process.stdin.on("keypress", (str, key) => { - if (key !== undefined) { - this.handleKeypressEvent(key); - } - }); - await this._callTasks(this._startTasks); - } - - /** - * Stops the main loop. - */ - async stop() { - if (this.timer !== undefined) { - clearInterval(this.timer); - process.stdin.setRawMode(false); - console.log("Exiting..."); - await this._callTasks(this._stopTasks); - _atExit(); + /** + * Starts the main loop. + * + */ + async start() { + this._timer = setTimeout(this.loop.bind(this), 1000); + if (process.stdin.isTTY !== true) { + return; + } + emitKeypressEvents(process.stdin); + process.stdin.setRawMode(true); + process.stdin.resume(); + console.log("Press X to exit"); + process.stdin.on("keypress", (str, key) => { + if (key !== undefined) { + this.handleKeypressEvent(key); + } + }); + await this._callTasks(this._startTasks); + } + /** + * Stops the main loop. + */ + async stop() { + if (this._timer !== undefined) { + clearInterval(this._timer); + process.stdin.setRawMode(false); + console.log("Exiting..."); + await this._callTasks(this._stopTasks); + _atExit(); + } + } + /** + * Body of the main loop. + */ + async loop() { + await this._callTasks(this._loopTasks); + this._timer = setTimeout(this.loop.bind(this), 1000); } - } - - /** - * Body of the main loop. - */ - async loop() { - await this._callTasks(this._loopTasks); - this.timer = setTimeout(this.loop.bind(this), 1000); - } } +//# sourceMappingURL=MainLoop.js.map \ No newline at end of file diff --git a/packages/main/src/MainLoop.js.map b/packages/main/src/MainLoop.js.map new file mode 100644 index 0000000..3a95548 --- /dev/null +++ b/packages/main/src/MainLoop.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MainLoop.js","sourceRoot":"","sources":["MainLoop.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,sCAAsC;AAEtC,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AAEtC,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAE/C,oEAAoE;AACpE,yEAAyE;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,OAAO,QAAQ;IACnB,yCAAyC;IACzC,MAAM,GAA+B,SAAS,CAAC;IAE/C,kDAAkD;IAClD,WAAW,GAAiB,EAAE,CAAC;IAE/B,kDAAkD;IAClD,UAAU,GAAiB,EAAE,CAAC;IAE9B,kDAAkD;IAClD,UAAU,GAAiB,EAAE,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,GAAkB;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE/B,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IACD;;;;OAIG;IACH,OAAO,CAAC,IAA+B,EAAE,IAAW;QAClD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAAmB;QAClC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/MainLoop.ts b/packages/main/src/MainLoop.ts new file mode 100644 index 0000000..44764eb --- /dev/null +++ b/packages/main/src/MainLoop.ts @@ -0,0 +1,110 @@ +// obsidian-spoon is a game server +// Copyright (C) 2024 Molly Crendraven + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import { emitKeypressEvents } from "node:readline"; +import { _atExit } from "obsidian-main"; +import { KeypressEvent, TTask } from "./types.js"; + +export class MainLoop { + /** @type {NodeJS.Timeout | undefined} */ + _timer: NodeJS.Timeout | undefined = undefined; + + /** @type {Array} */ + _startTasks: Array = []; + + /** @type {Array} */ + _stopTasks: Array = []; + + /** @type {Array} */ + _loopTasks: Array = []; + + /** + * + * @param {import("obsidian-main").KeypressEvent} key + */ + handleKeypressEvent(key: KeypressEvent) { + const keyString = key.sequence; + + if (keyString === "x") { + this.stop(); + } + } + /** + * + * @param {"start" | "loop" | "stop"} type + * @param {import("obsidian-main").Task} task + */ + addTask(type: "start" | "loop" | "stop", task: TTask) { + if (type === "start") { + this._startTasks.push(task); + } else if (type === "stop") { + this._stopTasks.push(task); + } else if (type === "loop") { + this._loopTasks.push(task); + } + } + + /** + * @param {Array} tasks + */ + async _callTasks(tasks: Array) { + tasks.forEach(async (task) => { + await task(); + }); + } + + /** + * Starts the main loop. + * + */ + async start() { + this._timer = setTimeout(this.loop.bind(this), 1000); + if (process.stdin.isTTY !== true) { + return; + } + emitKeypressEvents(process.stdin); + process.stdin.setRawMode(true); + process.stdin.resume(); + console.log("Press X to exit"); + process.stdin.on("keypress", (str, key) => { + if (key !== undefined) { + this.handleKeypressEvent(key); + } + }); + await this._callTasks(this._startTasks); + } + + /** + * Stops the main loop. + */ + async stop() { + if (this._timer !== undefined) { + clearInterval(this._timer); + process.stdin.setRawMode(false); + console.log("Exiting..."); + await this._callTasks(this._stopTasks); + _atExit(); + } + } + + /** + * Body of the main loop. + */ + async loop() { + await this._callTasks(this._loopTasks); + this._timer = setTimeout(this.loop.bind(this), 1000); + } +} diff --git a/packages/main/src/NPSMessage.d.ts b/packages/main/src/NPSMessage.d.ts new file mode 100644 index 0000000..e2e2979 --- /dev/null +++ b/packages/main/src/NPSMessage.d.ts @@ -0,0 +1,28 @@ +/// +import { NPSMessageHeader } from "./NPSMessageHeader.js"; +import { NPSMessagePayload } from "./NPSMessagePayload.js"; +/** + * Class representing an NPS message. + * + * @property {NPSMessageHeader} _header + * @property {NPSMessagePayload} data + */ +export declare class NPSMessage { + _header: NPSMessageHeader; + data: NPSMessagePayload; + constructor(); + /** + * + * @param {Buffer} data + * @returns {NPSMessage} + */ + static parse(data: Buffer): NPSMessage; + /** + * @returns Buffer + */ + toBuffer(): Buffer; + /** + * @returns string + */ + toString(): string; +} diff --git a/packages/main/src/NPSMessage.js b/packages/main/src/NPSMessage.js index d33aa89..393f433 100644 --- a/packages/main/src/NPSMessage.js +++ b/packages/main/src/NPSMessage.js @@ -1,6 +1,5 @@ import { NPSMessageHeader } from "./NPSMessageHeader.js"; import { NPSMessagePayload } from "./NPSMessagePayload.js"; - /** * Class representing an NPS message. * @@ -8,44 +7,38 @@ import { NPSMessagePayload } from "./NPSMessagePayload.js"; * @property {NPSMessagePayload} data */ export class NPSMessage { - constructor() { - this._header = new NPSMessageHeader(); - this.data = new NPSMessagePayload(); - } - /** - * - * @param {Buffer} data - * @returns {NPSMessage} - */ - static parse(data) { - const self = new NPSMessage(); - if (data.length < 8) { - throw new Error(`Invalid message length: ${data.length}`); + _header; + data; + constructor() { + this._header = new NPSMessageHeader(); + this.data = new NPSMessagePayload(); + } + /** + * + * @param {Buffer} data + * @returns {NPSMessage} + */ + static parse(data) { + const self = new NPSMessage(); + if (data.length < 8) { + throw new Error(`Invalid message length: ${data.length}`); + } + self._header = NPSMessageHeader.parse(data); + const expectedLength = self._header.messageLength - self._header.dataOffset; + self.data = NPSMessagePayload.parse(data.subarray(self._header.dataOffset), expectedLength); + return self; + } + /** + * @returns Buffer + */ + toBuffer() { + return Buffer.concat([this._header.toBuffer(), this.data.toBuffer()]); + } + /** + * @returns string + */ + toString() { + return `${this._header.toString()}, Data: ${this.data.toString()}`; } - - self._header = NPSMessageHeader.parse(data); - - const expectedLength = self._header.messageLength - self._header.dataOffset; - - self.data = NPSMessagePayload.parse( - data.subarray(self._header.dataOffset), - expectedLength, - ); - - return self; - } - - /** - * @returns Buffer - */ - toBuffer() { - return Buffer.concat([this._header.toBuffer(), this.data.toBuffer()]); - } - - /** - * @returns string - */ - toString() { - return `${this._header.toString()}, Data: ${this.data.toString()}`; - } } +//# sourceMappingURL=NPSMessage.js.map \ No newline at end of file diff --git a/packages/main/src/NPSMessage.js.map b/packages/main/src/NPSMessage.js.map new file mode 100644 index 0000000..9bec180 --- /dev/null +++ b/packages/main/src/NPSMessage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NPSMessage.js","sourceRoot":"","sources":["NPSMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACrB,OAAO,CAAmB;IAC1B,IAAI,CAAoB;IACxB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACtC,CAAC;IACD;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAE5E,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,KAAK,CACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EACtC,cAAc,CACf,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACrE,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/NPSMessage.ts b/packages/main/src/NPSMessage.ts new file mode 100644 index 0000000..627d8fe --- /dev/null +++ b/packages/main/src/NPSMessage.ts @@ -0,0 +1,53 @@ +import { NPSMessageHeader } from "./NPSMessageHeader.js"; +import { NPSMessagePayload } from "./NPSMessagePayload.js"; + +/** + * Class representing an NPS message. + * + * @property {NPSMessageHeader} _header + * @property {NPSMessagePayload} data + */ +export class NPSMessage { + _header: NPSMessageHeader; + data: NPSMessagePayload; + constructor() { + this._header = new NPSMessageHeader(); + this.data = new NPSMessagePayload(); + } + /** + * + * @param {Buffer} data + * @returns {NPSMessage} + */ + static parse(data: Buffer) { + const self = new NPSMessage(); + if (data.length < 8) { + throw new Error(`Invalid message length: ${data.length}`); + } + + self._header = NPSMessageHeader.parse(data); + + const expectedLength = self._header.messageLength - self._header.dataOffset; + + self.data = NPSMessagePayload.parse( + data.subarray(self._header.dataOffset), + expectedLength, + ); + + return self; + } + + /** + * @returns Buffer + */ + toBuffer() { + return Buffer.concat([this._header.toBuffer(), this.data.toBuffer()]); + } + + /** + * @returns string + */ + toString() { + return `${this._header.toString()}, Data: ${this.data.toString()}`; + } +} diff --git a/packages/main/src/NPSMessageHeader.d.ts b/packages/main/src/NPSMessageHeader.d.ts new file mode 100644 index 0000000..3d8520d --- /dev/null +++ b/packages/main/src/NPSMessageHeader.d.ts @@ -0,0 +1,31 @@ +/// +/** + * Class representing an NPS message header. + */ +export declare class NPSMessageHeader { + _dataStart: number; + messageId: number; + messageLength: number; + version: number; + constructor(); + /** + * + * @param {Buffer} data + * @returns NPSMessageHeader + */ + static parse(data: Buffer): NPSMessageHeader; + get dataOffset(): number; + /** + * @private + * @returns Buffer + */ + _writeExtraData(): Buffer; + /** + * @returns Buffer + */ + toBuffer(): Buffer; + /** + * @returns string + */ + toString(): string; +} diff --git a/packages/main/src/NPSMessageHeader.js b/packages/main/src/NPSMessageHeader.js index 41f7b01..f43f2f9 100644 --- a/packages/main/src/NPSMessageHeader.js +++ b/packages/main/src/NPSMessageHeader.js @@ -2,71 +2,68 @@ * Class representing an NPS message header. */ export class NPSMessageHeader { - constructor() { - this._dataStart = -1; - this.messageId = -1; - this.messageLength = -1; - this.version = -1; - } - - /** - * - * @param {Buffer} data - * @returns NPSMessageHeader - */ - static parse(data) { - const self = new NPSMessageHeader(); - if (data.length < 6) { - throw new Error("Invalid header length"); + _dataStart; + messageId; + messageLength; + version; + constructor() { + this._dataStart = -1; + this.messageId = -1; + this.messageLength = -1; + this.version = -1; } - self.messageId = data.readUInt16BE(0); - self.messageLength = data.readUInt16BE(2); - - self.version = data.readUInt16BE(4); - - if (self.version === 257) { - self._dataStart = 12; - } else { - self._dataStart = 6; + /** + * + * @param {Buffer} data + * @returns NPSMessageHeader + */ + static parse(data) { + const self = new NPSMessageHeader(); + if (data.length < 6) { + throw new Error("Invalid header length"); + } + self.messageId = data.readUInt16BE(0); + self.messageLength = data.readUInt16BE(2); + self.version = data.readUInt16BE(4); + if (self.version === 257) { + self._dataStart = 12; + } + else { + self._dataStart = 6; + } + return self; } - - return self; - } - - get dataOffset() { - return this._dataStart; - } - - /** - * @private - * @returns Buffer - */ - _writeExtraData() { - const buffer = Buffer.alloc(6); - buffer.writeUInt16BE(0, 0); - buffer.writeUInt32BE(this.messageLength, 2); - return buffer; - } - - /** - * @returns Buffer - */ - toBuffer() { - const buffer = Buffer.alloc(6); - buffer.writeUInt16BE(this.messageId, 0); - buffer.writeUInt16BE(this.messageLength, 2); - buffer.writeUInt16BE(this.version, 4); - - if (this.version === 257) { - return Buffer.concat([buffer, this._writeExtraData()]); + get dataOffset() { + return this._dataStart; + } + /** + * @private + * @returns Buffer + */ + _writeExtraData() { + const buffer = Buffer.alloc(6); + buffer.writeUInt16BE(0, 0); + buffer.writeUInt32BE(this.messageLength, 2); + return buffer; + } + /** + * @returns Buffer + */ + toBuffer() { + const buffer = Buffer.alloc(6); + buffer.writeUInt16BE(this.messageId, 0); + buffer.writeUInt16BE(this.messageLength, 2); + buffer.writeUInt16BE(this.version, 4); + if (this.version === 257) { + return Buffer.concat([buffer, this._writeExtraData()]); + } + return buffer; + } + /** + * @returns string + */ + toString() { + return `ID: ${this.messageId}, Length: ${this.messageLength}, Version: ${this.version}`; } - return buffer; - } - - /** - * @returns string - */ - toString() { - return `ID: ${this.messageId}, Length: ${this.messageLength}, Version: ${this.version}`; - } } +//# sourceMappingURL=NPSMessageHeader.js.map \ No newline at end of file diff --git a/packages/main/src/NPSMessageHeader.js.map b/packages/main/src/NPSMessageHeader.js.map new file mode 100644 index 0000000..45d2be7 --- /dev/null +++ b/packages/main/src/NPSMessageHeader.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NPSMessageHeader.js","sourceRoot":"","sources":["NPSMessageHeader.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,aAAa,CAAS;IACtB,OAAO,CAAS;IAChB;QACE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,OAAO,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1F,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/NPSMessageHeader.ts b/packages/main/src/NPSMessageHeader.ts new file mode 100644 index 0000000..8552bd0 --- /dev/null +++ b/packages/main/src/NPSMessageHeader.ts @@ -0,0 +1,76 @@ +/** + * Class representing an NPS message header. + */ +export class NPSMessageHeader { + _dataStart: number; + messageId: number; + messageLength: number; + version: number; + constructor() { + this._dataStart = -1; + this.messageId = -1; + this.messageLength = -1; + this.version = -1; + } + + /** + * + * @param {Buffer} data + * @returns NPSMessageHeader + */ + static parse(data: Buffer) { + const self = new NPSMessageHeader(); + if (data.length < 6) { + throw new Error("Invalid header length"); + } + self.messageId = data.readUInt16BE(0); + self.messageLength = data.readUInt16BE(2); + + self.version = data.readUInt16BE(4); + + if (self.version === 257) { + self._dataStart = 12; + } else { + self._dataStart = 6; + } + + return self; + } + + get dataOffset() { + return this._dataStart; + } + + /** + * @private + * @returns Buffer + */ + _writeExtraData() { + const buffer = Buffer.alloc(6); + buffer.writeUInt16BE(0, 0); + buffer.writeUInt32BE(this.messageLength, 2); + return buffer; + } + + /** + * @returns Buffer + */ + toBuffer() { + const buffer = Buffer.alloc(6); + buffer.writeUInt16BE(this.messageId, 0); + buffer.writeUInt16BE(this.messageLength, 2); + buffer.writeUInt16BE(this.version, 4); + + if (this.version === 257) { + return Buffer.concat([buffer, this._writeExtraData()]); + } + return buffer; + } + + /** + * @returns string + */ + toString() { + return `ID: ${this.messageId}, Length: ${this.messageLength}, Version: ${this.version}`; + } +} diff --git a/packages/main/src/NPSMessagePayload.d.ts b/packages/main/src/NPSMessagePayload.d.ts new file mode 100644 index 0000000..7e2a865 --- /dev/null +++ b/packages/main/src/NPSMessagePayload.d.ts @@ -0,0 +1,48 @@ +/** + * To be used as a base class for NPS message payloads. + * + * @implements {INPSPayload} + * @class + * @property {Buffer} data + * + * @example + * class MyPayload extends NPSMessagePayload { + * constructor() { + * super(); + * this.myProperty = 0; + * } + * + * static parse(data) { + * this.myProperty = data.readUInt32LE(0); + * } + * + * toBuffer() { + * const buffer = Buffer.alloc(4); + * buffer.writeUInt32LE(this.myProperty, 0); + * return buffer; + * } + * + * toString() { + * return `MyPayload: ${this.myProperty}`; + * } + * } + */ +/// +export declare class NPSMessagePayload { + data: Buffer; + constructor(); + /** + * + * @param {Buffer} data + * @returns NPSMessagePayload + */ + static parse(data: Buffer, len?: number): NPSMessagePayload; + /** + * @returns Buffer + */ + toBuffer(): Buffer; + /** + * @returns string + */ + toString(): string; +} diff --git a/packages/main/src/NPSMessagePayload.js b/packages/main/src/NPSMessagePayload.js index 7e4fdcb..81efd9b 100644 --- a/packages/main/src/NPSMessagePayload.js +++ b/packages/main/src/NPSMessagePayload.js @@ -1,33 +1,3 @@ -/** - * @interface INPSPayload - */ -/** - * @interface INPSPayload - * @static parse - * @property {Buffer} data - */ -export class INPSPayload { - constructor() { - this.data = Buffer.alloc(0); - this.toBuffer = function () { - // Intentionally empty to be overridden by subclasses - }; - this.toString = function () { - // Intentionally empty to be overridden by subclasses - }; - } - - /** - * @param {Buffer} data - * @returns INPSPayload - */ - static parse(data) { - const self = new NPSMessagePayload(); - self.data = data; - return self; - } -} - /** * To be used as a base class for NPS message payloads. * @@ -57,39 +27,35 @@ export class INPSPayload { * } * } */ - export class NPSMessagePayload { - constructor() { - this.data = Buffer.alloc(0); - } - - /** - * - * @param {Buffer} data - * @returns NPSMessagePayload - */ - static parse(data, len = data.length) { - if (data.length !== len) { - throw new Error( - `Invalid payload length: ${data.length}, expected: ${len}`, - ); + data; + constructor() { + this.data = Buffer.alloc(0); + } + /** + * + * @param {Buffer} data + * @returns NPSMessagePayload + */ + static parse(data, len = data.length) { + if (data.length !== len) { + throw new Error(`Invalid payload length: ${data.length}, expected: ${len}`); + } + const self = new NPSMessagePayload(); + self.data = data; + return self; + } + /** + * @returns Buffer + */ + toBuffer() { + return this.data; + } + /** + * @returns string + */ + toString() { + return this.data.toString("hex"); } - const self = new NPSMessagePayload(); - self.data = data; - return self; - } - - /** - * @returns Buffer - */ - toBuffer() { - return this.data; - } - - /** - * @returns string - */ - toString() { - return this.data.toString("hex"); - } } +//# sourceMappingURL=NPSMessagePayload.js.map \ No newline at end of file diff --git a/packages/main/src/NPSMessagePayload.js.map b/packages/main/src/NPSMessagePayload.js.map new file mode 100644 index 0000000..e216420 --- /dev/null +++ b/packages/main/src/NPSMessagePayload.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NPSMessagePayload.js","sourceRoot":"","sources":["NPSMessagePayload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,OAAO,iBAAiB;IAC5B,IAAI,CAAS;IACb;QACE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,CAAC,MAAM,eAAe,GAAG,EAAE,CAC3D,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/NPSMessagePayload.ts b/packages/main/src/NPSMessagePayload.ts new file mode 100644 index 0000000..b8bd9aa --- /dev/null +++ b/packages/main/src/NPSMessagePayload.ts @@ -0,0 +1,66 @@ +/** + * To be used as a base class for NPS message payloads. + * + * @implements {INPSPayload} + * @class + * @property {Buffer} data + * + * @example + * class MyPayload extends NPSMessagePayload { + * constructor() { + * super(); + * this.myProperty = 0; + * } + * + * static parse(data) { + * this.myProperty = data.readUInt32LE(0); + * } + * + * toBuffer() { + * const buffer = Buffer.alloc(4); + * buffer.writeUInt32LE(this.myProperty, 0); + * return buffer; + * } + * + * toString() { + * return `MyPayload: ${this.myProperty}`; + * } + * } + */ + +export class NPSMessagePayload { + data: Buffer; + constructor() { + this.data = Buffer.alloc(0); + } + + /** + * + * @param {Buffer} data + * @returns NPSMessagePayload + */ + static parse(data: Buffer, len = data.length) { + if (data.length !== len) { + throw new Error( + `Invalid payload length: ${data.length}, expected: ${len}` + ); + } + const self = new NPSMessagePayload(); + self.data = data; + return self; + } + + /** + * @returns Buffer + */ + toBuffer() { + return this.data; + } + + /** + * @returns string + */ + toString() { + return this.data.toString("hex"); + } +} diff --git a/packages/main/src/NPSUserLoginPayload.d.ts b/packages/main/src/NPSUserLoginPayload.d.ts new file mode 100644 index 0000000..bf555c6 --- /dev/null +++ b/packages/main/src/NPSUserLoginPayload.d.ts @@ -0,0 +1,33 @@ +/// +import { NPSMessagePayload } from "./NPSMessagePayload.js"; +import { INPSPayload } from "./types.js"; +/** + * @typedef INPSPayload + * @type {import("./NPSMessagePayload.js").INPSPayload} + */ +/** + * @implements {INPSPayload} + * @extends {NPSMessagePayload} + * Payload for the NPSUserLogin message. + */ +export declare class NPSUserLoginPayload extends NPSMessagePayload implements INPSPayload { + ticket: string; + sessionKey: string; + gameId: string; + constructor(); + /** + * + * @param {number} len + * @param {Buffer} data + * @returns {NPSUserLoginPayload} + */ + static parse(data: Buffer, len?: number): NPSUserLoginPayload; + /** + * @returns {Buffer} + */ + toBuffer(): Buffer; + /** + * @returns {string} + */ + toString(): string; +} diff --git a/packages/main/src/NPSUserLoginPayload.js b/packages/main/src/NPSUserLoginPayload.js index 3b99c89..f8cdb1a 100644 --- a/packages/main/src/NPSUserLoginPayload.js +++ b/packages/main/src/NPSUserLoginPayload.js @@ -1,73 +1,69 @@ import { NPSMessagePayload } from "./NPSMessagePayload.js"; - /** * @typedef INPSPayload * @type {import("./NPSMessagePayload.js").INPSPayload} */ - /** * @implements {INPSPayload} * @extends {NPSMessagePayload} * Payload for the NPSUserLogin message. */ export class NPSUserLoginPayload extends NPSMessagePayload { - constructor() { - super(); - this.data = Buffer.alloc(0); - this.ticket = ""; - this.sessionKey = ""; - this.gameId = ""; - } - - /** - * - * @param {number} len - * @param {Buffer} data - * @returns {NPSUserLoginPayload} - */ - static parse(data, len = data.length) { - if (data.length !== len) { - throw new Error( - `Invalid payload length: ${data.length}, expected: ${len}`, - ); + ticket; + sessionKey; + gameId; + constructor() { + super(); + this.data = Buffer.alloc(0); + this.ticket = ""; + this.sessionKey = ""; + this.gameId = ""; } - - const self = new NPSUserLoginPayload(); - try { - let offset = 0; - let nextLen = data.readUInt16BE(0); - self.ticket = data.toString("utf8", 2, nextLen + 2); - offset = nextLen + 2; - offset += 2; // Skip one empty word - nextLen = data.readUInt16BE(offset); - self.sessionKey = data.toString("hex", offset + 2, offset + 2 + nextLen); - offset += nextLen + 2; - nextLen = data.readUInt16BE(offset); - self.gameId = data - .subarray(offset + 2, offset + 2 + nextLen) - .toString("utf8"); - } catch (error) { - if (!(error instanceof Error)) { - throw new Error(`Error parsing payload: ${error}`); - } - console.error(`Error parsing payload: ${error.message}`); - throw new Error(`Error parsing payload: ${error.message}`); + /** + * + * @param {number} len + * @param {Buffer} data + * @returns {NPSUserLoginPayload} + */ + static parse(data, len = data.length) { + if (data.length !== len) { + throw new Error(`Invalid payload length: ${data.length}, expected: ${len}`); + } + const self = new NPSUserLoginPayload(); + try { + let offset = 0; + let nextLen = data.readUInt16BE(0); + self.ticket = data.toString("utf8", 2, nextLen + 2); + offset = nextLen + 2; + offset += 2; // Skip one empty word + nextLen = data.readUInt16BE(offset); + self.sessionKey = data.toString("hex", offset + 2, offset + 2 + nextLen); + offset += nextLen + 2; + nextLen = data.readUInt16BE(offset); + self.gameId = data + .subarray(offset + 2, offset + 2 + nextLen) + .toString("utf8"); + } + catch (error) { + if (!(error instanceof Error)) { + throw new Error(`Error parsing payload: ${error}`); + } + console.error(`Error parsing payload: ${error.message}`); + throw new Error(`Error parsing payload: ${error.message}`); + } + return self; + } + /** + * @returns {Buffer} + */ + toBuffer() { + throw new Error("Method not implemented."); + } + /** + * @returns {string} + */ + toString() { + return `Ticket: ${this.ticket}, SessionKey: ${this.sessionKey}, GameId: ${this.gameId}`; } - - return self; - } - - /** - * @returns {Buffer} - */ - toBuffer() { - throw new Error("Method not implemented."); - } - - /** - * @returns {string} - */ - toString() { - return `Ticket: ${this.ticket}, SessionKey: ${this.sessionKey}, GameId: ${this.gameId}`; - } } +//# sourceMappingURL=NPSUserLoginPayload.js.map \ No newline at end of file diff --git a/packages/main/src/NPSUserLoginPayload.js.map b/packages/main/src/NPSUserLoginPayload.js.map new file mode 100644 index 0000000..1deca5f --- /dev/null +++ b/packages/main/src/NPSUserLoginPayload.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NPSUserLoginPayload.js","sourceRoot":"","sources":["NPSUserLoginPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,OAAO,mBACX,SAAQ,iBAAiB;IAGzB,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,MAAM,CAAS;IAEf;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,CAAC,MAAM,eAAe,GAAG,EAAE,CAC3D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YACpD,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;YACrB,MAAM,IAAI,CAAC,CAAC,CAAC,sBAAsB;YACnC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACzE,MAAM,IAAI,OAAO,GAAG,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI;iBACf,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;iBAC1C,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,WAAW,IAAI,CAAC,MAAM,iBAAiB,IAAI,CAAC,UAAU,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1F,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/NPSUserLoginPayload.ts b/packages/main/src/NPSUserLoginPayload.ts new file mode 100644 index 0000000..2367481 --- /dev/null +++ b/packages/main/src/NPSUserLoginPayload.ts @@ -0,0 +1,81 @@ +import { NPSMessagePayload } from "./NPSMessagePayload.js"; +import { INPSPayload } from "./types.js"; + +/** + * @typedef INPSPayload + * @type {import("./NPSMessagePayload.js").INPSPayload} + */ + +/** + * @implements {INPSPayload} + * @extends {NPSMessagePayload} + * Payload for the NPSUserLogin message. + */ +export class NPSUserLoginPayload + extends NPSMessagePayload + implements INPSPayload +{ + ticket: string; + sessionKey: string; + gameId: string; + + constructor() { + super(); + this.data = Buffer.alloc(0); + this.ticket = ""; + this.sessionKey = ""; + this.gameId = ""; + } + + /** + * + * @param {number} len + * @param {Buffer} data + * @returns {NPSUserLoginPayload} + */ + static parse(data: Buffer, len = data.length) { + if (data.length !== len) { + throw new Error( + `Invalid payload length: ${data.length}, expected: ${len}` + ); + } + + const self = new NPSUserLoginPayload(); + try { + let offset = 0; + let nextLen = data.readUInt16BE(0); + self.ticket = data.toString("utf8", 2, nextLen + 2); + offset = nextLen + 2; + offset += 2; // Skip one empty word + nextLen = data.readUInt16BE(offset); + self.sessionKey = data.toString("hex", offset + 2, offset + 2 + nextLen); + offset += nextLen + 2; + nextLen = data.readUInt16BE(offset); + self.gameId = data + .subarray(offset + 2, offset + 2 + nextLen) + .toString("utf8"); + } catch (error) { + if (!(error instanceof Error)) { + throw new Error(`Error parsing payload: ${error}`); + } + console.error(`Error parsing payload: ${error.message}`); + throw new Error(`Error parsing payload: ${error.message}`); + } + + return self; + } + + /** + * @returns {Buffer} + */ + toBuffer(): Buffer { + throw new Error("Method not implemented."); + } + + /** + * @returns {string} + */ + toString() { + return `Ticket: ${this.ticket}, SessionKey: ${this.sessionKey}, GameId: ${this.gameId}`; + } +} diff --git a/packages/main/src/ShardService.d.ts b/packages/main/src/ShardService.d.ts new file mode 100644 index 0000000..f9fecd3 --- /dev/null +++ b/packages/main/src/ShardService.d.ts @@ -0,0 +1,15 @@ +export declare class ShardService { + /** + * + * @param {number} id + * @param {string} name + * @param {string} description + * @param {string} ip + * @param {string} serverGroupName + */ + addShard(id: number, name: string, description: string, ip: string, serverGroupName: string): void; + /** + * @returns {string} + */ + getShardList(): string; +} diff --git a/packages/main/src/ShardService.js b/packages/main/src/ShardService.js index fc9b6f6..83c8cb1 100644 --- a/packages/main/src/ShardService.js +++ b/packages/main/src/ShardService.js @@ -1,122 +1,112 @@ /** @type {Map} */ const shards = new Map(); - class ShardEntry { - /** - * @param {object} values - * @param {number} values.id - * @param {string} values.name - * @param {string} values.description - * @param {string} values.loginServerIP - * @param {number} [values.loginServerPort] - * @param {string} values.lobbyServerIP - * @param {number} [values.lobbyServerPort] - * @param {string} values.mcotsServerIP - * @param {number} [values.statusId] - * @param {string} [values.statusReason] - * @param {string} values.serverGroupName - * @param {number} [values.population] - * @param {number} [values.maxPersonasPerUser] - * @param {string} values.diagServerIP - * @param {number} [values.diagServerPort] - */ - constructor({ - id, - name, - description, - loginServerIP, - loginServerPort = 8226, - lobbyServerIP, - lobbyServerPort = 7003, - mcotsServerIP, - statusId = 0, - statusReason = "", - serverGroupName: serverGroupsName, - population = 0, - maxPersonasPerUser = 1, - diagServerIP, - diagServerPort = 80, - }) { - this.id = id; - this.name = name; - this.description = description; - this.loginServerIP = loginServerIP; - this.loginServerPort = loginServerPort; - this.lobbyServerIP = lobbyServerIP; - this.lobbyServerPort = lobbyServerPort; - this.mcotsServerIP = mcotsServerIP; - this.statusId = statusId; - this.statusReason = statusReason; - this.serverGroupName = serverGroupsName; - this.population = population; - this.maxPersonasPerUser = maxPersonasPerUser; - this.diagServerIP = diagServerIP; - this.diagServerPort = diagServerPort; - } - - /** - * - * @param {number} population - */ - setPopulation(population) { - this.population = population; - } - - /** - * @returns {string} - */ - formatForWeb() { - return ( - `[${this.name}]\n` + - `\tDescription=${this.id}\n` + - `\tShardId=${this.id}\n` + - `\tLoginServerIP=${this.loginServerIP}\n` + - `\tLoginServerPort=${this.loginServerPort}\n` + - `\tLobbyServerIP=${this.lobbyServerIP}\n` + - `\tLobbyServerPort=${this.lobbyServerPort}\n` + - `\tMCOTSServerIP=${this.mcotsServerIP}\n` + - `\tStatusId=${this.statusId}\n` + - `\tStatus_Reason=${this.statusReason}\n` + - `\tServerGroup_Name=${this.serverGroupName}\n` + - `\tPopulation=${this.population}\n` + - `\tMaxPersonasPerUser=${this.maxPersonasPerUser}\n` + - `\tDiagnosticServerHost=${this.diagServerIP}\n` + - `\tDiagnosticServerPort=${this.diagServerPort}\n` - ); - } + id; + name; + description; + loginServerIP; + loginServerPort; + lobbyServerIP; + lobbyServerPort; + mcotsServerIP; + statusId; + statusReason; + serverGroupName; + population; + maxPersonasPerUser; + diagServerIP; + diagServerPort; + /** + * @param {object} values + * @param {number} values.id + * @param {string} values.name + * @param {string} values.description + * @param {string} values.loginServerIP + * @param {number} [values.loginServerPort] + * @param {string} values.lobbyServerIP + * @param {number} [values.lobbyServerPort] + * @param {string} values.mcotsServerIP + * @param {number} [values.statusId] + * @param {string} [values.statusReason] + * @param {string} values.serverGroupName + * @param {number} [values.population] + * @param {number} [values.maxPersonasPerUser] + * @param {string} values.diagServerIP + * @param {number} [values.diagServerPort] + */ + constructor({ id, name, description, loginServerIP, loginServerPort = 8226, lobbyServerIP, lobbyServerPort = 7003, mcotsServerIP, statusId = 0, statusReason = "", serverGroupName: serverGroupsName, population = 0, maxPersonasPerUser = 1, diagServerIP, diagServerPort = 80, }) { + this.id = id; + this.name = name; + this.description = description; + this.loginServerIP = loginServerIP; + this.loginServerPort = loginServerPort; + this.lobbyServerIP = lobbyServerIP; + this.lobbyServerPort = lobbyServerPort; + this.mcotsServerIP = mcotsServerIP; + this.statusId = statusId; + this.statusReason = statusReason; + this.serverGroupName = serverGroupsName; + this.population = population; + this.maxPersonasPerUser = maxPersonasPerUser; + this.diagServerIP = diagServerIP; + this.diagServerPort = diagServerPort; + } + /** + * + * @param {number} population + */ + setPopulation(population) { + this.population = population; + } + /** + * @returns {string} + */ + formatForWeb() { + return (`[${this.name}]\n` + + `\tDescription=${this.id}\n` + + `\tShardId=${this.id}\n` + + `\tLoginServerIP=${this.loginServerIP}\n` + + `\tLoginServerPort=${this.loginServerPort}\n` + + `\tLobbyServerIP=${this.lobbyServerIP}\n` + + `\tLobbyServerPort=${this.lobbyServerPort}\n` + + `\tMCOTSServerIP=${this.mcotsServerIP}\n` + + `\tStatusId=${this.statusId}\n` + + `\tStatus_Reason=${this.statusReason}\n` + + `\tServerGroup_Name=${this.serverGroupName}\n` + + `\tPopulation=${this.population}\n` + + `\tMaxPersonasPerUser=${this.maxPersonasPerUser}\n` + + `\tDiagnosticServerHost=${this.diagServerIP}\n` + + `\tDiagnosticServerPort=${this.diagServerPort}\n`); + } } - export class ShardService { - /** - * - * @param {number} id - * @param {string} name - * @param {string} description - * @param {string} ip - * @param {string} serverGroupName - */ - addShard(id, name, description, ip, serverGroupName) { - shards.set( - id, - new ShardEntry({ - id, - name, - description, - loginServerIP: ip, - lobbyServerIP: ip, - serverGroupName, - mcotsServerIP: ip, - diagServerIP: ip, - }), - ); - } - - /** - * @returns {string} - */ - getShardList() { - return Array.from(shards.values()) - .map((entry) => entry.formatForWeb()) - .join("\n\n"); - } + /** + * + * @param {number} id + * @param {string} name + * @param {string} description + * @param {string} ip + * @param {string} serverGroupName + */ + addShard(id, name, description, ip, serverGroupName) { + shards.set(id, new ShardEntry({ + id, + name, + description, + loginServerIP: ip, + lobbyServerIP: ip, + serverGroupName, + mcotsServerIP: ip, + diagServerIP: ip, + })); + } + /** + * @returns {string} + */ + getShardList() { + return Array.from(shards.values()) + .map((entry) => entry.formatForWeb()) + .join("\n\n"); + } } +//# sourceMappingURL=ShardService.js.map \ No newline at end of file diff --git a/packages/main/src/ShardService.js.map b/packages/main/src/ShardService.js.map new file mode 100644 index 0000000..d79dca7 --- /dev/null +++ b/packages/main/src/ShardService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ShardService.js","sourceRoot":"","sources":["ShardService.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,MAAM,GAA6B,IAAI,GAAG,EAAE,CAAC;AAEnD,MAAM,UAAU;IACd,EAAE,CAAS;IACX,IAAI,CAAS;IACb,WAAW,CAAS;IACpB,aAAa,CAAS;IACtB,eAAe,CAAS;IACxB,aAAa,CAAS;IACtB,eAAe,CAAS;IACxB,aAAa,CAAS;IACtB,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,eAAe,CAAS;IACxB,UAAU,CAAS;IACnB,kBAAkB,CAAS;IAC3B,YAAY,CAAS;IACrB,cAAc,CAAS;IACvB;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,EACV,EAAE,EACF,IAAI,EACJ,WAAW,EACX,aAAa,EACb,eAAe,GAAG,IAAI,EACtB,aAAa,EACb,eAAe,GAAG,IAAI,EACtB,aAAa,EACb,QAAQ,GAAG,CAAC,EACZ,YAAY,GAAG,EAAE,EACjB,eAAe,EAAE,gBAAgB,EACjC,UAAU,GAAG,CAAC,EACd,kBAAkB,GAAG,CAAC,EACtB,YAAY,EACZ,cAAc,GAAG,EAAE,GAC6T;QAChV,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,gBAAgB,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CACL,IAAI,IAAI,CAAC,IAAI,KAAK;YAClB,iBAAiB,IAAI,CAAC,EAAE,IAAI;YAC5B,aAAa,IAAI,CAAC,EAAE,IAAI;YACxB,mBAAmB,IAAI,CAAC,aAAa,IAAI;YACzC,qBAAqB,IAAI,CAAC,eAAe,IAAI;YAC7C,mBAAmB,IAAI,CAAC,aAAa,IAAI;YACzC,qBAAqB,IAAI,CAAC,eAAe,IAAI;YAC7C,mBAAmB,IAAI,CAAC,aAAa,IAAI;YACzC,cAAc,IAAI,CAAC,QAAQ,IAAI;YAC/B,mBAAmB,IAAI,CAAC,YAAY,IAAI;YACxC,sBAAsB,IAAI,CAAC,eAAe,IAAI;YAC9C,gBAAgB,IAAI,CAAC,UAAU,IAAI;YACnC,wBAAwB,IAAI,CAAC,kBAAkB,IAAI;YACnD,0BAA0B,IAAI,CAAC,YAAY,IAAI;YAC/C,0BAA0B,IAAI,CAAC,cAAc,IAAI,CAClD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACvB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAU,EAAE,IAAY,EAAE,WAAmB,EAAE,EAAU,EAAE,eAAuB;QACzF,MAAM,CAAC,GAAG,CACR,EAAE,EACF,IAAI,UAAU,CAAC;YACb,EAAE;YACF,IAAI;YACJ,WAAW;YACX,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE;YACjB,eAAe;YACf,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;SACjB,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;aACpC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/ShardService.ts b/packages/main/src/ShardService.ts new file mode 100644 index 0000000..bf80eb7 --- /dev/null +++ b/packages/main/src/ShardService.ts @@ -0,0 +1,139 @@ +import { IShardEntry } from "./types.js"; + +/** @type {Map} */ +const shards: Map = new Map(); + +class ShardEntry { + id: number; + name: string; + description: string; + loginServerIP: string; + loginServerPort: number; + lobbyServerIP: string; + lobbyServerPort: number; + mcotsServerIP: string; + statusId: number; + statusReason: string; + serverGroupName: string; + population: number; + maxPersonasPerUser: number; + diagServerIP: string; + diagServerPort: number; + /** + * @param {object} values + * @param {number} values.id + * @param {string} values.name + * @param {string} values.description + * @param {string} values.loginServerIP + * @param {number} [values.loginServerPort] + * @param {string} values.lobbyServerIP + * @param {number} [values.lobbyServerPort] + * @param {string} values.mcotsServerIP + * @param {number} [values.statusId] + * @param {string} [values.statusReason] + * @param {string} values.serverGroupName + * @param {number} [values.population] + * @param {number} [values.maxPersonasPerUser] + * @param {string} values.diagServerIP + * @param {number} [values.diagServerPort] + */ + constructor({ + id, + name, + description, + loginServerIP, + loginServerPort = 8226, + lobbyServerIP, + lobbyServerPort = 7003, + mcotsServerIP, + statusId = 0, + statusReason = "", + serverGroupName: serverGroupsName, + population = 0, + maxPersonasPerUser = 1, + diagServerIP, + diagServerPort = 80, + }: { id: number; name: string; description: string; loginServerIP: string; loginServerPort?: number; lobbyServerIP: string; lobbyServerPort?: number; mcotsServerIP: string; statusId?: number; statusReason?: string; serverGroupName: string; population?: number; maxPersonasPerUser?: number; diagServerIP: string; diagServerPort?: number; }) { + this.id = id; + this.name = name; + this.description = description; + this.loginServerIP = loginServerIP; + this.loginServerPort = loginServerPort; + this.lobbyServerIP = lobbyServerIP; + this.lobbyServerPort = lobbyServerPort; + this.mcotsServerIP = mcotsServerIP; + this.statusId = statusId; + this.statusReason = statusReason; + this.serverGroupName = serverGroupsName; + this.population = population; + this.maxPersonasPerUser = maxPersonasPerUser; + this.diagServerIP = diagServerIP; + this.diagServerPort = diagServerPort; + } + + /** + * + * @param {number} population + */ + setPopulation(population: number) { + this.population = population; + } + + /** + * @returns {string} + */ + formatForWeb(): string { + return ( + `[${this.name}]\n` + + `\tDescription=${this.id}\n` + + `\tShardId=${this.id}\n` + + `\tLoginServerIP=${this.loginServerIP}\n` + + `\tLoginServerPort=${this.loginServerPort}\n` + + `\tLobbyServerIP=${this.lobbyServerIP}\n` + + `\tLobbyServerPort=${this.lobbyServerPort}\n` + + `\tMCOTSServerIP=${this.mcotsServerIP}\n` + + `\tStatusId=${this.statusId}\n` + + `\tStatus_Reason=${this.statusReason}\n` + + `\tServerGroup_Name=${this.serverGroupName}\n` + + `\tPopulation=${this.population}\n` + + `\tMaxPersonasPerUser=${this.maxPersonasPerUser}\n` + + `\tDiagnosticServerHost=${this.diagServerIP}\n` + + `\tDiagnosticServerPort=${this.diagServerPort}\n` + ); + } +} + +export class ShardService { + /** + * + * @param {number} id + * @param {string} name + * @param {string} description + * @param {string} ip + * @param {string} serverGroupName + */ + addShard(id: number, name: string, description: string, ip: string, serverGroupName: string) { + shards.set( + id, + new ShardEntry({ + id, + name, + description, + loginServerIP: ip, + lobbyServerIP: ip, + serverGroupName, + mcotsServerIP: ip, + diagServerIP: ip, + }), + ); + } + + /** + * @returns {string} + */ + getShardList(): string { + return Array.from(shards.values()) + .map((entry) => entry.formatForWeb()) + .join("\n\n"); + } +} diff --git a/packages/main/src/TCPServer.d.ts b/packages/main/src/TCPServer.d.ts new file mode 100644 index 0000000..fe7f6d6 --- /dev/null +++ b/packages/main/src/TCPServer.d.ts @@ -0,0 +1,25 @@ +/// +import net from "node:net"; +import { TErrorHandler } from "./types.js"; +export declare class TCPServer { + port: any; + server: net.Server; + /** + * + * @param {number} port + * @param {function(net.Server): void} onListening + * @param {function(net.Socket): void} onConnection + * @param {errorHandler} onServerError + */ + constructor(port: number, onListening: (arg0: net.Server) => void, onConnection: (arg0: net.Socket) => void, onServerError: TErrorHandler); + /** + * Start the server listening on the configured port. + */ + listen(): void; + /** + * + * @param {errorHandler} onError + * @returns {Promise} + */ + close(onError: TErrorHandler): Promise; +} diff --git a/packages/main/src/TCPServer.js b/packages/main/src/TCPServer.js index 4511309..430b213 100644 --- a/packages/main/src/TCPServer.js +++ b/packages/main/src/TCPServer.js @@ -1,62 +1,55 @@ // obsidian-spoon is a game server // Copyright (C) 2024 Molly Crendraven - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - import net from "node:net"; - -/** @typedef errorHandler - * @type {function(Error): void} - */ export class TCPServer { - /** - * - * @param {number} port - * @param {function(net.Server): void} onListening - * @param {function(net.Socket): void} onConnection - * @param {errorHandler} onServerError - */ - constructor(port, onListening, onConnection, onServerError) { - this.port = port; - this.server = net.createServer(onConnection); - this.server.on("error", onServerError); - this.server.on("listening", () => { - onListening(this.server); - }); - } - - /** - * Start the server listening on the configured port. - */ - listen() { - this.server.listen(this.port); - } - - /** - * - * @param {errorHandler} onError - * @returns {Promise} - */ - async close(onError) { - return new Promise((resolve, reject) => { - this.server.close((err) => { - if (err) { - onError(err); - reject(err); - } - resolve(); - }); - }); - } + port; + server; + /** + * + * @param {number} port + * @param {function(net.Server): void} onListening + * @param {function(net.Socket): void} onConnection + * @param {errorHandler} onServerError + */ + constructor(port, onListening, onConnection, onServerError) { + this.port = port; + this.server = net.createServer(onConnection); + this.server.on("error", onServerError); + this.server.on("listening", () => { + onListening(this.server); + }); + } + /** + * Start the server listening on the configured port. + */ + listen() { + this.server.listen(this.port); + } + /** + * + * @param {errorHandler} onError + * @returns {Promise} + */ + async close(onError) { + return new Promise((resolve, reject) => { + this.server.close((err) => { + if (err) { + onError(err); + reject(err); + } + resolve(); + }); + }); + } } +//# sourceMappingURL=TCPServer.js.map \ No newline at end of file diff --git a/packages/main/src/TCPServer.js.map b/packages/main/src/TCPServer.js.map new file mode 100644 index 0000000..b419d72 --- /dev/null +++ b/packages/main/src/TCPServer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TCPServer.js","sourceRoot":"","sources":["TCPServer.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,sCAAsC;AAEtC,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AAEtC,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAE/C,oEAAoE;AACpE,yEAAyE;AAEzE,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,MAAM,OAAO,SAAS;IACpB,IAAI,CAAM;IACV,MAAM,CAAa;IACnB;;;;;;OAMG;IACH,YACE,IAAY,EACZ,WAAuC,EACvC,YAAwC,EACxC,aAA4B;QAE5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YAC/B,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAsB;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,GAAG,CAAC,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/TCPServer.ts b/packages/main/src/TCPServer.ts new file mode 100644 index 0000000..d0adba1 --- /dev/null +++ b/packages/main/src/TCPServer.ts @@ -0,0 +1,67 @@ +// obsidian-spoon is a game server +// Copyright (C) 2024 Molly Crendraven + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import net from "node:net"; +import { TErrorHandler } from "./types.js"; + +export class TCPServer { + port: any; + server: net.Server; + /** + * + * @param {number} port + * @param {function(net.Server): void} onListening + * @param {function(net.Socket): void} onConnection + * @param {errorHandler} onServerError + */ + constructor( + port: number, + onListening: (arg0: net.Server) => void, + onConnection: (arg0: net.Socket) => void, + onServerError: TErrorHandler + ) { + this.port = port; + this.server = net.createServer(onConnection); + this.server.on("error", onServerError); + this.server.on("listening", () => { + onListening(this.server); + }); + } + + /** + * Start the server listening on the configured port. + */ + listen() { + this.server.listen(this.port); + } + + /** + * + * @param {errorHandler} onError + * @returns {Promise} + */ + async close(onError: TErrorHandler): Promise { + return new Promise((resolve, reject) => { + this.server.close((err) => { + if (err) { + onError(err); + reject(err); + } + resolve(); + }); + }); + } +} diff --git a/packages/main/src/UserLoginService.d.ts b/packages/main/src/UserLoginService.d.ts new file mode 100644 index 0000000..d1afebc --- /dev/null +++ b/packages/main/src/UserLoginService.d.ts @@ -0,0 +1,36 @@ +export declare class UserLoginService { + /** + * Returns the customer ID if the user is valid, otherwise -1. + * + * @param {string} username + * @param {string} password + * @returns {number} + */ + checkUser(username: string, password: string): number; + /** + * Creates a token for the given customer ID. + * + * @param {number} customerId + * @returns {string} + */ + createToken(customerId: number): `${string}-${string}-${string}-${string}-${string}`; + /** + * Checks if the token is valid and returns the customer ID. + * If the token is invalid, returns -1. + * + * @param {string} token + * @returns {number} + */ + checkToken(token: string): any; + /** + * Deletes the token. + * + * @param {string} token + */ + deleteToken(token: string): void; + /** + * Deletes all tokens. + * @returns {Promise} + */ + deleteAllTokens(): Promise; +} diff --git a/packages/main/src/UserLoginService.js b/packages/main/src/UserLoginService.js index cd88efe..1dfdaef 100644 --- a/packages/main/src/UserLoginService.js +++ b/packages/main/src/UserLoginService.js @@ -2,65 +2,58 @@ const users = [{ username: "admin", password: "admin", customerId: 1 }]; /** @type {Map} */ const tokens = new Map(); - export class UserLoginService { - /** - * Returns the customer ID if the user is valid, otherwise -1. - * - * @param {string} username - * @param {string} password - * @returns {number} - */ - checkUser(username, password) { - const user = users.find( - (user) => user.username === username && user.password === password, - ); - - return user ? user.customerId : -1; - } - - /** - * Creates a token for the given customer ID. - * - * @param {number} customerId - * @returns {string} - */ - createToken(customerId) { - const token = crypto.randomUUID(); - tokens.set(token, customerId); - return token; - } - - /** - * Checks if the token is valid and returns the customer ID. - * If the token is invalid, returns -1. - * - * @param {string} token - * @returns {number} - */ - checkToken(token) { - const customerId = tokens.get(token); - return customerId ?? -1; - } - - /** - * Deletes the token. - * - * @param {string} token - */ - deleteToken(token) { - tokens.delete(token); - } - - /** - * Deletes all tokens. - * @returns {Promise} - */ - async deleteAllTokens() { - return new Promise((resolve) => { - tokens.clear(); - console.log("All tokens deleted"); - resolve(); - }); - } + /** + * Returns the customer ID if the user is valid, otherwise -1. + * + * @param {string} username + * @param {string} password + * @returns {number} + */ + checkUser(username, password) { + const user = users.find((user) => user.username === username && user.password === password); + return user ? user.customerId : -1; + } + /** + * Creates a token for the given customer ID. + * + * @param {number} customerId + * @returns {string} + */ + createToken(customerId) { + const token = crypto.randomUUID(); + tokens.set(token, customerId); + return token; + } + /** + * Checks if the token is valid and returns the customer ID. + * If the token is invalid, returns -1. + * + * @param {string} token + * @returns {number} + */ + checkToken(token) { + const customerId = tokens.get(token); + return customerId ?? -1; + } + /** + * Deletes the token. + * + * @param {string} token + */ + deleteToken(token) { + tokens.delete(token); + } + /** + * Deletes all tokens. + * @returns {Promise} + */ + async deleteAllTokens() { + return new Promise((resolve) => { + tokens.clear(); + console.log("All tokens deleted"); + resolve(); + }); + } } +//# sourceMappingURL=UserLoginService.js.map \ No newline at end of file diff --git a/packages/main/src/UserLoginService.js.map b/packages/main/src/UserLoginService.js.map new file mode 100644 index 0000000..682e529 --- /dev/null +++ b/packages/main/src/UserLoginService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"UserLoginService.js","sourceRoot":"","sources":["UserLoginService.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AACxE,kCAAkC;AAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;AAEzB,MAAM,OAAO,gBAAgB;IAC3B;;;;;;OAMG;IACH,SAAS,CAAC,QAAgB,EAAE,QAAgB;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CACnE,CAAC;QAEF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,UAAkB;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,KAAa;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,UAAU,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAAa;QACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/UserLoginService.ts b/packages/main/src/UserLoginService.ts new file mode 100644 index 0000000..8dbb645 --- /dev/null +++ b/packages/main/src/UserLoginService.ts @@ -0,0 +1,66 @@ +/** @type {Array<{username: string, password: string, customerId: number}>} */ +const users = [{ username: "admin", password: "admin", customerId: 1 }]; +/** @type {Map} */ +const tokens = new Map(); + +export class UserLoginService { + /** + * Returns the customer ID if the user is valid, otherwise -1. + * + * @param {string} username + * @param {string} password + * @returns {number} + */ + checkUser(username: string, password: string) { + const user = users.find( + (user) => user.username === username && user.password === password, + ); + + return user ? user.customerId : -1; + } + + /** + * Creates a token for the given customer ID. + * + * @param {number} customerId + * @returns {string} + */ + createToken(customerId: number) { + const token = crypto.randomUUID(); + tokens.set(token, customerId); + return token; + } + + /** + * Checks if the token is valid and returns the customer ID. + * If the token is invalid, returns -1. + * + * @param {string} token + * @returns {number} + */ + checkToken(token: string) { + const customerId = tokens.get(token); + return customerId ?? -1; + } + + /** + * Deletes the token. + * + * @param {string} token + */ + deleteToken(token: string) { + tokens.delete(token); + } + + /** + * Deletes all tokens. + * @returns {Promise} + */ + async deleteAllTokens(): Promise { + return new Promise((resolve) => { + tokens.clear(); + console.log("All tokens deleted"); + resolve(); + }); + } +} diff --git a/packages/main/src/WebServer.d.ts b/packages/main/src/WebServer.d.ts new file mode 100644 index 0000000..4a839e0 --- /dev/null +++ b/packages/main/src/WebServer.d.ts @@ -0,0 +1,31 @@ +/// +import http from "node:http"; +import { TErrorHandler } from "./types.js"; +/** @typedef connectionHandler + * @type {function(NodeJS.Socket): void} + */ +/** @typedef errorHandler + * @type {function(Error): void} + */ +export declare class WebServer { + port: number; + server: http.Server; + /** + * + * @param {number} port + * @param {function(http.Server): void} onListening + * @param {function(http.IncomingMessage, http.ServerResponse): void} onConnection + * @param {errorHandler} onServerError + */ + constructor(port: number, onListening: (arg0: http.Server) => void, onConnection: (arg0: http.IncomingMessage, arg1: http.ServerResponse) => void, onServerError: TErrorHandler); + /** + * Start the server listening on the configured port. + */ + listen(): void; + /** + * + * @param {errorHandler} onError + * @returns {Promise} + */ + close(onError: TErrorHandler): Promise; +} diff --git a/packages/main/src/WebServer.js b/packages/main/src/WebServer.js index 2e0886a..c00d1d6 100644 --- a/packages/main/src/WebServer.js +++ b/packages/main/src/WebServer.js @@ -1,73 +1,67 @@ // obsidian-spoon is a game server // Copyright (C) 2024 Molly Crendraven - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - import * as Sentry from "@sentry/node"; - import http from "node:http"; import express from "express"; - /** @typedef connectionHandler * @type {function(NodeJS.Socket): void} */ /** @typedef errorHandler * @type {function(Error): void} */ - export class WebServer { - /** - * - * @param {number} port - * @param {function(http.Server): void} onListening - * @param {function(http.IncomingMessage, http.ServerResponse): void} onConnection - * @param {errorHandler} onServerError - */ - constructor(port, onListening, onConnection, onServerError) { - this.port = port; - const app = express(); - Sentry.setupExpressErrorHandler(app); - app.use(onConnection); - /** @type {http.Server} */ - this.server = http.createServer(app); - this.server.on("error", onServerError); - this.server.on("listening", () => { - onListening(this.server); - }); - } - - /** - * Start the server listening on the configured port. - */ - listen() { - this.server.listen(this.port); - } - - /** - * - * @param {errorHandler} onError - * @returns {Promise} - */ - async close(onError) { - return new Promise((resolve, reject) => { - this.server.close((err) => { - if (err) { - onError(err); - reject(err); - } - resolve(); - }); - }); - } + port; + server; + /** + * + * @param {number} port + * @param {function(http.Server): void} onListening + * @param {function(http.IncomingMessage, http.ServerResponse): void} onConnection + * @param {errorHandler} onServerError + */ + constructor(port, onListening, onConnection, onServerError) { + this.port = port; + const app = express(); + Sentry.setupExpressErrorHandler(app); + app.use(onConnection); + /** @type {http.Server} */ + this.server = http.createServer(app); + this.server.on("error", onServerError); + this.server.on("listening", () => { + onListening(this.server); + }); + } + /** + * Start the server listening on the configured port. + */ + listen() { + this.server.listen(this.port); + } + /** + * + * @param {errorHandler} onError + * @returns {Promise} + */ + async close(onError) { + return new Promise((resolve, reject) => { + this.server.close((err) => { + if (err) { + onError(err); + reject(err); + } + resolve(); + }); + }); + } } +//# sourceMappingURL=WebServer.js.map \ No newline at end of file diff --git a/packages/main/src/WebServer.js.map b/packages/main/src/WebServer.js.map new file mode 100644 index 0000000..9bc6857 --- /dev/null +++ b/packages/main/src/WebServer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WebServer.js","sourceRoot":"","sources":["WebServer.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,sCAAsC;AAEtC,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AAEtC,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAE/C,oEAAoE;AACpE,yEAAyE;AAEzE,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B;;GAEG;AACH;;GAEG;AAEH,MAAM,OAAO,SAAS;IACpB,IAAI,CAAS;IACb,MAAM,CAAuE;IAC7E;;;;;;OAMG;IACH,YACE,IAAY,EACZ,WAAwC,EACxC,YAGS,EACT,aAA4B;QAE5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtB,0BAA0B;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YAC/B,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAsB;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,GAAG,CAAC,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"} \ No newline at end of file diff --git a/packages/main/src/WebServer.ts b/packages/main/src/WebServer.ts new file mode 100644 index 0000000..b3e5d83 --- /dev/null +++ b/packages/main/src/WebServer.ts @@ -0,0 +1,84 @@ +// obsidian-spoon is a game server +// Copyright (C) 2024 Molly Crendraven + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import * as Sentry from "@sentry/node"; + +import http from "node:http"; +import express from "express"; +import { TErrorHandler } from "./types.js"; + +/** @typedef connectionHandler + * @type {function(NodeJS.Socket): void} + */ +/** @typedef errorHandler + * @type {function(Error): void} + */ + +export class WebServer { + port: number; + server: http.Server; + /** + * + * @param {number} port + * @param {function(http.Server): void} onListening + * @param {function(http.IncomingMessage, http.ServerResponse): void} onConnection + * @param {errorHandler} onServerError + */ + constructor( + port: number, + onListening: (arg0: http.Server) => void, + onConnection: ( + arg0: http.IncomingMessage, + arg1: http.ServerResponse + ) => void, + onServerError: TErrorHandler + ) { + this.port = port; + const app = express(); + Sentry.setupExpressErrorHandler(app); + app.use(onConnection); + /** @type {http.Server} */ + this.server = http.createServer(app); + this.server.on("error", onServerError); + this.server.on("listening", () => { + onListening(this.server); + }); + } + + /** + * Start the server listening on the configured port. + */ + listen() { + this.server.listen(this.port); + } + + /** + * + * @param {errorHandler} onError + * @returns {Promise} + */ + async close(onError: TErrorHandler): Promise { + return new Promise((resolve, reject) => { + this.server.close((err) => { + if (err) { + onError(err); + reject(err); + } + resolve(); + }); + }); + } +} diff --git a/packages/main/src/handleUserLogin.d.ts b/packages/main/src/handleUserLogin.d.ts new file mode 100644 index 0000000..d4456df --- /dev/null +++ b/packages/main/src/handleUserLogin.d.ts @@ -0,0 +1,8 @@ +import { NPSUserLoginPayload } from "./NPSUserLoginPayload.js"; +import { TClientCallback } from "./types.js"; +/** + * + * @param {import("./NPSUserLoginPayload.js").NPSUserLoginPayload} payload + * @param {TClientCallback} clientCallback + */ +export declare function handleUserLogin(payload: NPSUserLoginPayload, clientCallback: TClientCallback): void; diff --git a/packages/main/src/handleUserLogin.js b/packages/main/src/handleUserLogin.js new file mode 100644 index 0000000..0516592 --- /dev/null +++ b/packages/main/src/handleUserLogin.js @@ -0,0 +1,10 @@ +/** + * + * @param {import("./NPSUserLoginPayload.js").NPSUserLoginPayload} payload + * @param {TClientCallback} clientCallback + */ +export function handleUserLogin(payload, clientCallback) { + const userLoginPayload = payload; + console.log(`User login: ${userLoginPayload.toString()}`); +} +//# sourceMappingURL=handleUserLogin.js.map \ No newline at end of file diff --git a/packages/main/src/handleUserLogin.js.map b/packages/main/src/handleUserLogin.js.map new file mode 100644 index 0000000..152be12 --- /dev/null +++ b/packages/main/src/handleUserLogin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"handleUserLogin.js","sourceRoot":"","sources":["handleUserLogin.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAA4B,EAAE,cAA+B;IAC3F,MAAM,gBAAgB,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC"} \ No newline at end of file diff --git a/packages/main/src/handleUserLogin.ts b/packages/main/src/handleUserLogin.ts new file mode 100644 index 0000000..f2ceb84 --- /dev/null +++ b/packages/main/src/handleUserLogin.ts @@ -0,0 +1,12 @@ +import { NPSUserLoginPayload } from "./NPSUserLoginPayload.js"; +import { TClientCallback } from "./types.js"; + +/** + * + * @param {import("./NPSUserLoginPayload.js").NPSUserLoginPayload} payload + * @param {TClientCallback} clientCallback + */ +export function handleUserLogin(payload: NPSUserLoginPayload, clientCallback: TClientCallback) { + const userLoginPayload = payload; + console.log(`User login: ${userLoginPayload.toString()}`); +} diff --git a/packages/main/src/index.d.ts b/packages/main/src/index.d.ts index 9d0deb8..d807c68 100644 --- a/packages/main/src/index.d.ts +++ b/packages/main/src/index.d.ts @@ -1,19 +1,12 @@ -declare module "obsidian-main" { - export default function main(): void; - - export interface KeypressEvent { - sequence: string; - name: string; - ctrl: boolean; - meta: boolean; - shift: boolean; - } - - export type Task = () => Promise | void | any; - - export interface IShardEntry { - formatForWeb(): string; - } - - export function _atExit(exitCode = 0): void; -} +/** + * + * @param {Error} err + */ +declare function onServerError(err: Error): void; +/** + * + * @param {number} exitCode + */ +declare function _atExit(exitCode?: number): Promise; +declare function main(): void; +export { main, _atExit, onServerError }; diff --git a/packages/main/src/index.js b/packages/main/src/index.js index 91c5b1d..26d753e 100644 --- a/packages/main/src/index.js +++ b/packages/main/src/index.js @@ -1,19 +1,15 @@ // probable-spoon is a game server // Copyright (C) 2024 Molly Crendraven - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - import { MainLoop } from "./MainLoop.js"; import { ShardService } from "./ShardService.js"; import { TCPServer } from "./TCPServer.js"; @@ -21,152 +17,108 @@ import { UserLoginService } from "./UserLoginService.js"; import { WebServer } from "./WebServer.js"; import { onNPSData } from "./nps.js"; import { onWebRequest } from "./web.js"; -import crypto from "node:crypto"; +import * as crypto from "node:crypto"; import * as Sentry from "@sentry/node"; - /** * @param {import("node:net").Socket} socket - * @param {(port:number, data: Buffer, sendToClient: (data: Buffer) => void) => void} onData + * @param {TOnDataHandler} onData */ function onSocketConnection(socket, onData) { - console.log("Connection established"); - - const connectionId = crypto.randomUUID(); - - Sentry.setTag("connection_id", connectionId); - - /** - * Callback for sending data to the client. - * @param {Buffer} data - */ - const sendToClient = (data) => { - socket.write(data); - }; - - socket.on("data", (data) => { - onData(socket.localPort ?? -1, data, sendToClient); - }); + console.log("Connection established"); + const connectionId = crypto.randomUUID(); + Sentry.setTag("connection_id", connectionId); + /** + * Callback for sending data to the client. + * @param {Buffer} data + */ + const sendToClient = (data) => { + socket.write(data); + }; + socket.on("data", (data) => { + onData(socket.localPort ?? -1, data, sendToClient); + }); } - /** * * @param {Error} err */ -export function onServerError(err) { - console.error(`Server error: ${err.message}`); +function onServerError(err) { + console.error(`Server error: ${err.message}`); } - /** * * @param {Error | undefined} err */ -function onClose(err = undefined) { - if (err) { - console.error(`Server close error: ${err.message}`); - } - console.log("Server closed"); +function onClose(err) { + if (err) { + console.error(`Server close error: ${err.message}`); + } + console.log("Server closed"); } - /** * * @param {import("net").Server} s * @returns string */ function getPort(s) { - const address = s.address(); - if (address === null || typeof address === "string") { - return String(address); - } - return String(address.port); + const address = s.address(); + if (address === null || typeof address === "string") { + return String(address); + } + return String(address.port); } - /** * @param {import("node:http").Server} s */ function onWebListening(s) { - const port = getPort(s); - console.log(`Web server listening on port ${port}`); - s.on("close", () => { - console.log(`Server on port ${port} closed`); - }); + const port = getPort(s); + console.log(`Web server listening on port ${port}`); + s.on("close", () => { + console.log(`Server on port ${port} closed`); + }); } - /** * @param {import("net").Server} s */ function onSocketListening(s) { - const port = getPort(s); - - console.log(`Server listening on port ${port}`); - s.on("close", () => { - console.log(`Server on port ${port} closed`); - }); - s.on("error", (/** @type {Error} */ err) => { - console.error(`Server on port ${port} errored: ${err.message}`); - }); + const port = getPort(s); + console.log(`Server listening on port ${port}`); + s.on("close", () => { + console.log(`Server on port ${port} closed`); + }); + s.on("error", (err) => { + console.error(`Server on port ${port} errored: ${err.message}`); + }); } - /** * * @param {number} exitCode */ -export async function _atExit(exitCode = 0) { - console.log("Goodbye, world!"); - process.exit(exitCode); +async function _atExit(exitCode = 0) { + console.log("Goodbye, world!"); + process.exit(exitCode); } - // === MAIN === - -export default function main() { - process.on("exit", (/** @type {number} **/ code) => { - console.log(`Server exited with code ${code}`); - }); - - console.log("Starting obsidian..."); - const authServer = new WebServer( - 3000, - onWebListening, - onWebRequest, - onServerError, - ); - const loginServer = new TCPServer( - 8226, - onSocketListening, - (socket) => onSocketConnection(socket, onNPSData), - onServerError, - ); - const personaServer = new TCPServer( - 8228, - onSocketListening, - (socket) => onSocketConnection(socket, onNPSData), - onServerError, - ); - - const shardService = new ShardService(); - shardService.addShard( - 1, - "Rusty Motors", - "A test shard", - "10.10.5.20", - "Group - 1", - ); - - const userLoginService = new UserLoginService(); - - const mainLoop = new MainLoop(); - mainLoop.addTask("start", authServer.listen.bind(authServer)); - mainLoop.addTask("start", loginServer.listen.bind(loginServer)); - mainLoop.addTask("start", personaServer.listen.bind(personaServer)); - mainLoop.addTask("stop", authServer.close.bind(authServer, onClose)); - mainLoop.addTask("stop", loginServer.close.bind(loginServer, onServerError)); - mainLoop.addTask( - "stop", - personaServer.close.bind(personaServer, onServerError), - ); - mainLoop.addTask( - "stop", - userLoginService.deleteAllTokens.bind(userLoginService), - ); - - mainLoop.start(); +function main() { + process.on("exit", (/** @type {number} **/ code) => { + console.log(`Server exited with code ${code}`); + }); + console.log("Starting obsidian..."); + const authServer = new WebServer(3000, onWebListening, onWebRequest, onServerError); + const loginServer = new TCPServer(8226, onSocketListening, (socket) => onSocketConnection(socket, onNPSData), onServerError); + const personaServer = new TCPServer(8228, onSocketListening, (socket) => onSocketConnection(socket, onNPSData), onServerError); + const shardService = new ShardService(); + shardService.addShard(1, "Rusty Motors", "A test shard", "10.10.5.20", "Group - 1"); + const userLoginService = new UserLoginService(); + const mainLoop = new MainLoop(); + mainLoop.addTask("start", authServer.listen.bind(authServer)); + mainLoop.addTask("start", loginServer.listen.bind(loginServer)); + mainLoop.addTask("start", personaServer.listen.bind(personaServer)); + mainLoop.addTask("stop", authServer.close.bind(authServer, onClose)); + mainLoop.addTask("stop", loginServer.close.bind(loginServer, onServerError)); + mainLoop.addTask("stop", personaServer.close.bind(personaServer, onServerError)); + mainLoop.addTask("stop", userLoginService.deleteAllTokens.bind(userLoginService)); + mainLoop.start(); } +export { main, _atExit, onServerError }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/main/src/index.js.map b/packages/main/src/index.js.map new file mode 100644 index 0000000..8afb864 --- /dev/null +++ b/packages/main/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,sCAAsC;AAEtC,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AAEtC,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAE/C,oEAAoE;AACpE,yEAAyE;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAUvC;;;GAGG;AACH,SAAS,kBAAkB,CAAC,MAAkB,EAAE,MAAsB;IACpE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEzC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAE7C;;;OAGG;IACH,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;QACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAU;IAC/B,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,CAAa;IAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,CAAc;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,CAAa;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QAC3B,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,OAAO,CAAC,QAAQ,GAAG,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,eAAe;AAEf,SAAS,IAAI;IACX,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,SAAS,CAC9B,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,aAAa,CACd,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,SAAS,CAC/B,IAAI,EACJ,iBAAiB,EACjB,CAAC,MAAkB,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,EAC7D,aAAa,CACd,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,SAAS,CACjC,IAAI,EACJ,iBAAiB,EACjB,CAAC,MAAkB,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,EAC7D,aAAa,CACd,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,YAAY,CAAC,QAAQ,CACnB,CAAC,EACD,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,CACZ,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,OAAO,CACd,MAAM,EACN,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CACvD,CAAC;IACF,QAAQ,CAAC,OAAO,CACd,MAAM,EACN,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CACxD,CAAC;IAEF,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC"} \ No newline at end of file diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts new file mode 100644 index 0000000..e8bf0fa --- /dev/null +++ b/packages/main/src/index.ts @@ -0,0 +1,182 @@ +// probable-spoon is a game server +// Copyright (C) 2024 Molly Crendraven + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import { MainLoop } from "./MainLoop.js"; +import { ShardService } from "./ShardService.js"; +import { TCPServer } from "./TCPServer.js"; +import { UserLoginService } from "./UserLoginService.js"; +import { WebServer } from "./WebServer.js"; +import { onNPSData } from "./nps.js"; +import { onWebRequest } from "./web.js"; +import * as crypto from "node:crypto"; +import * as Sentry from "@sentry/node"; +import * as net from "node:net"; +import * as http from "node:http"; + +type TOnDataHandler = ( + port: number, + data: Buffer, + sendToClient: (data: Buffer) => void +) => void; + +/** + * @param {import("node:net").Socket} socket + * @param {TOnDataHandler} onData + */ +function onSocketConnection(socket: net.Socket, onData: TOnDataHandler) { + console.log("Connection established"); + + const connectionId = crypto.randomUUID(); + + Sentry.setTag("connection_id", connectionId); + + /** + * Callback for sending data to the client. + * @param {Buffer} data + */ + const sendToClient = (data: Buffer) => { + socket.write(data); + }; + + socket.on("data", (data) => { + onData(socket.localPort ?? -1, data, sendToClient); + }); +} + +/** + * + * @param {Error} err + */ +function onServerError(err: Error) { + console.error(`Server error: ${err.message}`); +} + +/** + * + * @param {Error | undefined} err + */ +function onClose(err?: Error) { + if (err) { + console.error(`Server close error: ${err.message}`); + } + console.log("Server closed"); +} + +/** + * + * @param {import("net").Server} s + * @returns string + */ +function getPort(s: net.Server) { + const address = s.address(); + if (address === null || typeof address === "string") { + return String(address); + } + return String(address.port); +} + +/** + * @param {import("node:http").Server} s + */ +function onWebListening(s: http.Server) { + const port = getPort(s); + console.log(`Web server listening on port ${port}`); + s.on("close", () => { + console.log(`Server on port ${port} closed`); + }); +} + +/** + * @param {import("net").Server} s + */ +function onSocketListening(s: net.Server) { + const port = getPort(s); + + console.log(`Server listening on port ${port}`); + s.on("close", () => { + console.log(`Server on port ${port} closed`); + }); + s.on("error", (err: Error) => { + console.error(`Server on port ${port} errored: ${err.message}`); + }); +} + +/** + * + * @param {number} exitCode + */ +async function _atExit(exitCode = 0) { + console.log("Goodbye, world!"); + process.exit(exitCode); +} + +// === MAIN === + +function main() { + process.on("exit", (/** @type {number} **/ code) => { + console.log(`Server exited with code ${code}`); + }); + + console.log("Starting obsidian..."); + const authServer = new WebServer( + 3000, + onWebListening, + onWebRequest, + onServerError + ); + const loginServer = new TCPServer( + 8226, + onSocketListening, + (socket: net.Socket) => onSocketConnection(socket, onNPSData), + onServerError + ); + const personaServer = new TCPServer( + 8228, + onSocketListening, + (socket: net.Socket) => onSocketConnection(socket, onNPSData), + onServerError + ); + + const shardService = new ShardService(); + shardService.addShard( + 1, + "Rusty Motors", + "A test shard", + "10.10.5.20", + "Group - 1" + ); + + const userLoginService = new UserLoginService(); + + const mainLoop = new MainLoop(); + mainLoop.addTask("start", authServer.listen.bind(authServer)); + mainLoop.addTask("start", loginServer.listen.bind(loginServer)); + mainLoop.addTask("start", personaServer.listen.bind(personaServer)); + mainLoop.addTask("stop", authServer.close.bind(authServer, onClose)); + mainLoop.addTask("stop", loginServer.close.bind(loginServer, onServerError)); + mainLoop.addTask( + "stop", + personaServer.close.bind(personaServer, onServerError) + ); + mainLoop.addTask( + "stop", + userLoginService.deleteAllTokens.bind(userLoginService) + ); + + mainLoop.start(); +} + +export { main, _atExit, onServerError }; diff --git a/packages/main/src/nps.d.ts b/packages/main/src/nps.d.ts new file mode 100644 index 0000000..c3e9033 --- /dev/null +++ b/packages/main/src/nps.d.ts @@ -0,0 +1,9 @@ +/// +import { TClientCallback } from "./types.js"; +/** + * @param {number} port + * @param {Buffer} data + * @param {(data: Buffer) => void} sendToClient + */ +declare function onNPSData(port: number, data: Buffer, sendToClient: TClientCallback): void; +export { onNPSData }; diff --git a/packages/main/src/nps.js b/packages/main/src/nps.js index 302ffdf..1b78a1f 100644 --- a/packages/main/src/nps.js +++ b/packages/main/src/nps.js @@ -1,36 +1,25 @@ import { NPSMessage } from "./NPSMessage.js"; -import { NPSUserLoginPayload } from "./NPSUserLoginPayload.js"; - -/** - * @typedef INPSPayload - * @type {import("./NPSMessagePayload.js").INPSPayload} - */ - -/** @type {Map INPSPayload>} */ -const payloadMap = new Map(); - -payloadMap.set(1281, NPSUserLoginPayload.parse); - +import { getPayloadHandler, getPayloadParser } from "./payloadMap.js"; /** * @param {number} port * @param {Buffer} data * @param {(data: Buffer) => void} sendToClient */ -export function onNPSData(port, data, sendToClient) { - const message = NPSMessage.parse(data); - console.log(`Received message on port ${port}: ${message.toString()}`); - - const messageType = payloadMap.get(message._header.messageId); - - if (!messageType) { - console.error(`Unknown message type: ${message._header.messageId}`); - return; - } - - const payload = messageType( - message.data.data, - message._header.messageLength - message._header.dataOffset, - ); - - console.log(`Parsed payload: ${payload.toString()}`); +function onNPSData(port, data, sendToClient) { + const message = NPSMessage.parse(data); + console.log(`Received message on port ${port}: ${message.toString()}`); + const messageType = getPayloadParser(message._header.messageId); + if (!messageType) { + console.error(`Unknown message type: ${message._header.messageId}`); + return; + } + const payload = messageType(message.data.data, message._header.messageLength - message._header.dataOffset); + const handler = getPayloadHandler(message._header.messageId); + if (!handler) { + console.error(`Unknown message type: ${message._header.messageId}`); + return; + } + handler(payload, sendToClient); } +export { onNPSData }; +//# sourceMappingURL=nps.js.map \ No newline at end of file diff --git a/packages/main/src/nps.js.map b/packages/main/src/nps.js.map new file mode 100644 index 0000000..a0646c8 --- /dev/null +++ b/packages/main/src/nps.js.map @@ -0,0 +1 @@ +{"version":3,"file":"nps.js","sourceRoot":"","sources":["nps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGtE;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,YAA6B;IAC1E,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,KAAK,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEvE,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CACzB,OAAO,CAAC,IAAI,CAAC,IAAI,EACjB,OAAO,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAC3D,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,OAAO,EAAE,SAAS,EAAC,CAAA"} \ No newline at end of file diff --git a/packages/main/src/nps.ts b/packages/main/src/nps.ts new file mode 100644 index 0000000..e54142e --- /dev/null +++ b/packages/main/src/nps.ts @@ -0,0 +1,36 @@ +import { NPSMessage } from "./NPSMessage.js"; +import { getPayloadHandler, getPayloadParser } from "./payloadMap.js"; +import { TClientCallback } from "./types.js"; + +/** + * @param {number} port + * @param {Buffer} data + * @param {(data: Buffer) => void} sendToClient + */ +function onNPSData(port: number, data: Buffer, sendToClient: TClientCallback) { + const message = NPSMessage.parse(data); + console.log(`Received message on port ${port}: ${message.toString()}`); + + const messageType = getPayloadParser(message._header.messageId); + + if (!messageType) { + console.error(`Unknown message type: ${message._header.messageId}`); + return; + } + + const payload = messageType( + message.data.data, + message._header.messageLength - message._header.dataOffset + ); + + const handler = getPayloadHandler(message._header.messageId); + + if (!handler) { + console.error(`Unknown message type: ${message._header.messageId}`); + return; + } + + handler(payload, sendToClient); +} + +export { onNPSData} diff --git a/packages/main/src/payloadMap.d.ts b/packages/main/src/payloadMap.d.ts new file mode 100644 index 0000000..cc0d798 --- /dev/null +++ b/packages/main/src/payloadMap.d.ts @@ -0,0 +1,13 @@ +/** + * + * @param {number} messageId + * @returns {((data: Buffer, len: number) => INPSPayload) | undefined} + */ +declare function getPayloadParser(messageId: number): any; +/** + * + * @param {number} messageId + * @returns {((payload: INPSPayload, clientCallback: (data: Buffer) => void) => void) | undefined} + */ +declare function getPayloadHandler(messageId: number): any; +export { getPayloadParser, getPayloadHandler }; diff --git a/packages/main/src/payloadMap.js b/packages/main/src/payloadMap.js new file mode 100644 index 0000000..e2189e6 --- /dev/null +++ b/packages/main/src/payloadMap.js @@ -0,0 +1,40 @@ +import { NPSUserLoginPayload } from "./NPSUserLoginPayload.js"; +import { handleUserLogin } from "./handleUserLogin.js"; +/** + * @typedef INPSPayload + * @type {import("./NPSMessagePayload.js").INPSPayload} + */ +/** @type {Map INPSPayload>} */ +const payloadParserMap = new Map(); +payloadParserMap.set(1281, NPSUserLoginPayload.parse); +/** @type {Map void) => void) | undefined>} */ +const payloadHandlerMap = new Map(); +payloadHandlerMap.set(1281, handleUserLogin); +/** + * + * @param {number} messageId + * @returns {((data: Buffer, len: number) => INPSPayload) | undefined} + */ +function getPayloadParser(messageId) { + const payloadParser = payloadParserMap.get(messageId); + if (!payloadParser) { + console.error(`Unknown message type: ${messageId}, no parser found`); + return; + } + return payloadParser; +} +/** + * + * @param {number} messageId + * @returns {((payload: INPSPayload, clientCallback: (data: Buffer) => void) => void) | undefined} + */ +function getPayloadHandler(messageId) { + const payloadHandler = payloadHandlerMap.get(messageId); + if (!payloadHandler) { + console.error(`Unknown message type: ${messageId}, no handler found`); + return; + } + return payloadHandler; +} +export { getPayloadParser, getPayloadHandler }; +//# sourceMappingURL=payloadMap.js.map \ No newline at end of file diff --git a/packages/main/src/payloadMap.js.map b/packages/main/src/payloadMap.js.map new file mode 100644 index 0000000..4b0c3a8 --- /dev/null +++ b/packages/main/src/payloadMap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"payloadMap.js","sourceRoot":"","sources":["payloadMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;GAGG;AACH,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;AACnC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAEtD,gHAAgH;AAChH,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAC;AACpC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAE7C;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEtD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,mBAAmB,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAExD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,oBAAoB,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAC,CAAA"} \ No newline at end of file diff --git a/packages/main/src/payloadMap.ts b/packages/main/src/payloadMap.ts new file mode 100644 index 0000000..c484f8e --- /dev/null +++ b/packages/main/src/payloadMap.ts @@ -0,0 +1,48 @@ +import { NPSUserLoginPayload } from "./NPSUserLoginPayload.js"; +import { handleUserLogin } from "./handleUserLogin.js"; + +/** + * @typedef INPSPayload + * @type {import("./NPSMessagePayload.js").INPSPayload} + */ +/** @type {Map INPSPayload>} */ +const payloadParserMap = new Map(); +payloadParserMap.set(1281, NPSUserLoginPayload.parse); + +/** @type {Map void) => void) | undefined>} */ +const payloadHandlerMap = new Map(); +payloadHandlerMap.set(1281, handleUserLogin); + +/** + * + * @param {number} messageId + * @returns {((data: Buffer, len: number) => INPSPayload) | undefined} + */ +function getPayloadParser(messageId: number) { + const payloadParser = payloadParserMap.get(messageId); + + if (!payloadParser) { + console.error(`Unknown message type: ${messageId}, no parser found`); + return; + } + + return payloadParser; +} + +/** + * + * @param {number} messageId + * @returns {((payload: INPSPayload, clientCallback: (data: Buffer) => void) => void) | undefined} + */ +function getPayloadHandler(messageId: number) { + const payloadHandler = payloadHandlerMap.get(messageId); + + if (!payloadHandler) { + console.error(`Unknown message type: ${messageId}, no handler found`); + return; + } + + return payloadHandler; +} + +export { getPayloadParser, getPayloadHandler} diff --git a/packages/main/src/types.d.ts b/packages/main/src/types.d.ts new file mode 100644 index 0000000..63f66fd --- /dev/null +++ b/packages/main/src/types.d.ts @@ -0,0 +1,18 @@ +/// +export interface INPSPayload { + toBuffer(): Buffer; + toString(): string; +} +export type TClientCallback = (data: Buffer) => void; +export type TErrorHandler = (error: Error) => void; +export interface KeypressEvent { + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; +} +export type TTask = () => Promise | void | any; +export interface IShardEntry { + formatForWeb(): string; +} diff --git a/packages/main/src/types.js b/packages/main/src/types.js new file mode 100644 index 0000000..718fd38 --- /dev/null +++ b/packages/main/src/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/main/src/types.js.map b/packages/main/src/types.js.map new file mode 100644 index 0000000..8da0887 --- /dev/null +++ b/packages/main/src/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/main/src/types.ts b/packages/main/src/types.ts new file mode 100644 index 0000000..dfcfd02 --- /dev/null +++ b/packages/main/src/types.ts @@ -0,0 +1,22 @@ +export interface INPSPayload { + toBuffer(): Buffer; + toString(): string; +} + +export type TClientCallback = (data: Buffer) => void; + +export type TErrorHandler = (error: Error) => void; + +export interface KeypressEvent { + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; +} + +export type TTask = () => Promise | void | any; + +export interface IShardEntry { + formatForWeb(): string; +} diff --git a/packages/main/src/web.d.ts b/packages/main/src/web.d.ts new file mode 100644 index 0000000..eb287f6 --- /dev/null +++ b/packages/main/src/web.d.ts @@ -0,0 +1,8 @@ +/// +import { IncomingMessage, ServerResponse } from "node:http"; +/** + * @param {import("node:http").IncomingMessage} req + * @param {import("node:http").ServerResponse} res + */ +declare function onWebRequest(req: IncomingMessage, res: ServerResponse): void; +export { onWebRequest }; diff --git a/packages/main/src/web.js b/packages/main/src/web.js index 0539190..ac7bb8a 100644 --- a/packages/main/src/web.js +++ b/packages/main/src/web.js @@ -1,40 +1,33 @@ import { ShardService } from "./ShardService.js"; import { UserLoginService } from "./UserLoginService.js"; - /** * * @param {import("node:http").ServerResponse} res * @param {string} ticket */ function sendTicket(res, ticket) { - res.statusCode = 200; - res.setHeader("Content-Type", "text/plain"); - res.end(`Valid=TRUE\nTicket=${ticket}`); + res.statusCode = 200; + res.setHeader("Content-Type", "text/plain"); + res.end(`Valid=TRUE\nTicket=${ticket}`); } - /** * * @param {import("node:http").ServerResponse} res * @param {number} statusCode * @param {string} message */ - function sendError(res, statusCode, message) { - res.statusCode = statusCode; - res.setHeader("Content-Type", "text/plain"); - res.end( - `reasoncode=INV-200\nreasontext=${message}\nreasonurl=https://rusty-motors.com`, - ); + res.statusCode = statusCode; + res.setHeader("Content-Type", "text/plain"); + res.end(`reasoncode=INV-200\nreasontext=${message}\nreasonurl=https://rusty-motors.com`); } - /** * @param {import("node:http").IncomingMessage} req * @param {import("node:http").ServerResponse} res */ function homePage(req, res) { - res.end("Hello, world!"); + res.end("Hello, world!"); } - /** * @param {import("node:http").IncomingMessage} req * @param {import("node:http").ServerResponse} res @@ -42,51 +35,43 @@ function homePage(req, res) { * @param {string} password */ function authLogin(req, res, username, password) { - const userLoginService = new UserLoginService(); - const customerId = userLoginService.checkUser(username, password); - - if (customerId === -1) { - return sendError(res, 401, "Invalid username or password"); - } - - const token = userLoginService.createToken(customerId); - return sendTicket(res, token); + const userLoginService = new UserLoginService(); + const customerId = userLoginService.checkUser(username, password); + if (customerId === -1) { + return sendError(res, 401, "Invalid username or password"); + } + const token = userLoginService.createToken(customerId); + return sendTicket(res, token); } - /** * @param {import("node:http").IncomingMessage} req * @param {import("node:http").ServerResponse} res */ function getShardList(req, res) { - const shardService = new ShardService(); - - res.statusCode = 200; - res.setHeader("Content-Type", "text/plain"); - - res.end(shardService.getShardList()); + const shardService = new ShardService(); + res.statusCode = 200; + res.setHeader("Content-Type", "text/plain"); + res.end(shardService.getShardList()); } - /** * @param {import("node:http").IncomingMessage} req * @param {import("node:http").ServerResponse} res */ -export function onWebRequest(req, res) { - console.log(`Request URL: ${req.url}`); - const url = new URL(`http://${process.env.HOST ?? "localhost"}${req.url}`); - - if (url.pathname === "/") { - return homePage(req, res); - } - - if (url.pathname === "/AuthLogin") { - const username = url.searchParams.get("username") ?? ""; - const password = url.searchParams.get("password") ?? ""; - - return authLogin(req, res, username, password); - } - - if (url.pathname === "/ShardList/") { - return getShardList(req, res); - } - res.end("Hello, world!"); +function onWebRequest(req, res) { + console.log(`Request URL: ${req.url}`); + const url = new URL(`http://${process.env.HOST ?? "localhost"}${req.url}`); + if (url.pathname === "/") { + return homePage(req, res); + } + if (url.pathname === "/AuthLogin") { + const username = url.searchParams.get("username") ?? ""; + const password = url.searchParams.get("password") ?? ""; + return authLogin(req, res, username, password); + } + if (url.pathname === "/ShardList/") { + return getShardList(req, res); + } + res.end("Hello, world!"); } +export { onWebRequest }; +//# sourceMappingURL=web.js.map \ No newline at end of file diff --git a/packages/main/src/web.js.map b/packages/main/src/web.js.map new file mode 100644 index 0000000..845bbb7 --- /dev/null +++ b/packages/main/src/web.js.map @@ -0,0 +1 @@ +{"version":3,"file":"web.js","sourceRoot":"","sources":["web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;GAIG;AACH,SAAS,UAAU,CAAC,GAAmB,EAAE,MAAc;IACrD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5C,GAAG,CAAC,GAAG,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AAEH,SAAS,SAAS,CAAC,GAAmB,EAAE,UAAkB,EAAE,OAAe;IACzE,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5B,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5C,GAAG,CAAC,GAAG,CACL,kCAAkC,OAAO,sCAAsC,CAChF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,GAAoB,EAAE,GAAmB;IACzD,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,GAAoB,EAAE,GAAmB,EAAE,QAAgB,EAAE,QAAgB;IAC9F,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAElE,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACvD,OAAO,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAoB,EAAE,GAAmB;IAC7D,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAExC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAE5C,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAoB,EAAE,GAAmB;IAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAE3E,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAExD,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC3B,CAAC;AAED,OAAO,EAAE,YAAY,EAAC,CAAA"} \ No newline at end of file diff --git a/packages/main/src/web.ts b/packages/main/src/web.ts new file mode 100644 index 0000000..c97312a --- /dev/null +++ b/packages/main/src/web.ts @@ -0,0 +1,95 @@ +import { IncomingMessage, ServerResponse } from "node:http"; +import { ShardService } from "./ShardService.js"; +import { UserLoginService } from "./UserLoginService.js"; + +/** + * + * @param {import("node:http").ServerResponse} res + * @param {string} ticket + */ +function sendTicket(res: ServerResponse, ticket: string) { + res.statusCode = 200; + res.setHeader("Content-Type", "text/plain"); + res.end(`Valid=TRUE\nTicket=${ticket}`); +} + +/** + * + * @param {import("node:http").ServerResponse} res + * @param {number} statusCode + * @param {string} message + */ + +function sendError(res: ServerResponse, statusCode: number, message: string) { + res.statusCode = statusCode; + res.setHeader("Content-Type", "text/plain"); + res.end( + `reasoncode=INV-200\nreasontext=${message}\nreasonurl=https://rusty-motors.com`, + ); +} + +/** + * @param {import("node:http").IncomingMessage} req + * @param {import("node:http").ServerResponse} res + */ +function homePage(req: IncomingMessage, res: ServerResponse) { + res.end("Hello, world!"); +} + +/** + * @param {import("node:http").IncomingMessage} req + * @param {import("node:http").ServerResponse} res + * @param {string} username + * @param {string} password + */ +function authLogin(req: IncomingMessage, res: ServerResponse, username: string, password: string) { + const userLoginService = new UserLoginService(); + const customerId = userLoginService.checkUser(username, password); + + if (customerId === -1) { + return sendError(res, 401, "Invalid username or password"); + } + + const token = userLoginService.createToken(customerId); + return sendTicket(res, token); +} + +/** + * @param {import("node:http").IncomingMessage} req + * @param {import("node:http").ServerResponse} res + */ +function getShardList(req: IncomingMessage, res: ServerResponse) { + const shardService = new ShardService(); + + res.statusCode = 200; + res.setHeader("Content-Type", "text/plain"); + + res.end(shardService.getShardList()); +} + +/** + * @param {import("node:http").IncomingMessage} req + * @param {import("node:http").ServerResponse} res + */ +function onWebRequest(req: IncomingMessage, res: ServerResponse) { + console.log(`Request URL: ${req.url}`); + const url = new URL(`http://${process.env.HOST ?? "localhost"}${req.url}`); + + if (url.pathname === "/") { + return homePage(req, res); + } + + if (url.pathname === "/AuthLogin") { + const username = url.searchParams.get("username") ?? ""; + const password = url.searchParams.get("password") ?? ""; + + return authLogin(req, res, username, password); + } + + if (url.pathname === "/ShardList/") { + return getShardList(req, res); + } + res.end("Hello, world!"); +} + +export { onWebRequest} diff --git a/packages/main/tsconfig.json b/packages/main/tsconfig.json new file mode 100644 index 0000000..efa4a6f --- /dev/null +++ b/packages/main/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "composite": true, + "module": "NodeNext", + "target": "ES2022", + "allowJs": false, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strict": true, + "rootDir": "src", + "declaration": true, + "sourceMap": true + }, + "exclude": ["node_modules", "**/node_modules/*", "dist"], + "include": ["src"], +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd1c759..fde4012 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,19 +1,20 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: + .: dependencies: - "@opentelemetry/instrumentation": + '@opentelemetry/instrumentation': specifier: ^0.51.1 version: 0.51.1(@opentelemetry/api@1.8.0) - "@sentry/node": + '@sentry/node': specifier: ^8.7.0 version: 8.7.0 - "@sentry/profiling-node": + '@sentry/profiling-node': specifier: ^8.7.0 version: 8.7.0 express: @@ -22,14 +23,20 @@ importers: obsidian-main: specifier: link:packages/main version: link:packages/main + tsx: + specifier: ^4.11.0 + version: 4.11.0 devDependencies: - "@eslint/js": + '@eslint/js': specifier: ^9.3.0 version: 9.4.0 - "@types/node": + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/node': specifier: ^20.12.12 version: 20.13.0 - "@vitest/coverage-v8": + '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.13.0)) eslint: @@ -38,2560 +45,1506 @@ importers: globals: specifier: ^15.3.0 version: 15.3.0 + typescript: + specifier: ^5.4.5 + version: 5.4.5 vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@20.13.0) packages: - "@ampproject/remapping@2.3.0": - resolution: - { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, - } - engines: { node: ">=6.0.0" } - - "@babel/helper-string-parser@7.24.6": - resolution: - { - integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.24.6": - resolution: - { - integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.24.6": - resolution: - { - integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==, - } - engines: { node: ">=6.0.0" } + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/types@7.24.6": - resolution: - { - integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==, - } - engines: { node: ">=6.9.0" } - - "@bcoe/v8-coverage@0.2.3": - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } - - "@esbuild/aix-ppc64@0.20.2": - resolution: - { - integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, - } - engines: { node: ">=12" } + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} cpu: [ppc64] os: [aix] - "@esbuild/android-arm64@0.20.2": - resolution: - { - integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, - } - engines: { node: ">=12" } + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} cpu: [arm64] os: [android] - "@esbuild/android-arm@0.20.2": - resolution: - { - integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, - } - engines: { node: ">=12" } + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} cpu: [arm] os: [android] - "@esbuild/android-x64@0.20.2": - resolution: - { - integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, - } - engines: { node: ">=12" } + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} cpu: [x64] os: [android] - "@esbuild/darwin-arm64@0.20.2": - resolution: - { - integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, - } - engines: { node: ">=12" } + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-x64@0.20.2": - resolution: - { - integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, - } - engines: { node: ">=12" } + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} cpu: [x64] os: [darwin] - "@esbuild/freebsd-arm64@0.20.2": - resolution: - { - integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-x64@0.20.2": - resolution: - { - integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] - "@esbuild/linux-arm64@0.20.2": - resolution: - { - integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, - } - engines: { node: ">=12" } + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm@0.20.2": - resolution: - { - integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, - } - engines: { node: ">=12" } + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} cpu: [arm] os: [linux] - "@esbuild/linux-ia32@0.20.2": - resolution: - { - integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, - } - engines: { node: ">=12" } + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} cpu: [ia32] os: [linux] - "@esbuild/linux-loong64@0.20.2": - resolution: - { - integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, - } - engines: { node: ">=12" } + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} cpu: [loong64] os: [linux] - "@esbuild/linux-mips64el@0.20.2": - resolution: - { - integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, - } - engines: { node: ">=12" } + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} cpu: [mips64el] os: [linux] - "@esbuild/linux-ppc64@0.20.2": - resolution: - { - integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, - } - engines: { node: ">=12" } + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] - "@esbuild/linux-riscv64@0.20.2": - resolution: - { - integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, - } - engines: { node: ">=12" } + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] - "@esbuild/linux-s390x@0.20.2": - resolution: - { - integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, - } - engines: { node: ">=12" } + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} cpu: [s390x] os: [linux] - "@esbuild/linux-x64@0.20.2": - resolution: - { - integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, - } - engines: { node: ">=12" } + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} cpu: [x64] os: [linux] - "@esbuild/netbsd-x64@0.20.2": - resolution: - { - integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, - } - engines: { node: ">=12" } + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} cpu: [x64] os: [netbsd] - "@esbuild/openbsd-x64@0.20.2": - resolution: - { - integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, - } - engines: { node: ">=12" } + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} cpu: [x64] os: [openbsd] - "@esbuild/sunos-x64@0.20.2": - resolution: - { - integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, - } - engines: { node: ">=12" } + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} cpu: [x64] os: [sunos] - "@esbuild/win32-arm64@0.20.2": - resolution: - { - integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, - } - engines: { node: ">=12" } + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] - "@esbuild/win32-ia32@0.20.2": - resolution: - { - integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, - } - engines: { node: ">=12" } + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} cpu: [ia32] os: [win32] - "@esbuild/win32-x64@0.20.2": - resolution: - { - integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, - } - engines: { node: ">=12" } + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} cpu: [x64] os: [win32] - "@eslint-community/eslint-utils@4.4.0": - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + '@eslint-community/eslint-utils@4.4.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 - "@eslint-community/regexpp@4.10.0": - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - "@eslint/config-array@0.15.1": - resolution: - { - integrity: sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/eslintrc@3.1.0": - resolution: - { - integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/js@9.4.0": - resolution: - { - integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/object-schema@2.1.3": - resolution: - { - integrity: sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@humanwhocodes/module-importer@1.0.1": - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - "@humanwhocodes/retry@0.3.0": - resolution: - { - integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==, - } - engines: { node: ">=18.18" } - - "@istanbuljs/schema@0.1.3": - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: ">=8" } - - "@jest/schemas@29.6.3": - resolution: - { - integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - - "@jridgewell/gen-mapping@0.3.5": - resolution: - { - integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, - } - engines: { node: ">=6.0.0" } - - "@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==, - } - - "@nodelib/fs.scandir@2.1.5": - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.stat@2.0.5": - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.walk@1.2.8": - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - - "@opentelemetry/api-logs@0.51.1": - resolution: - { - integrity: sha512-E3skn949Pk1z2XtXu/lxf6QAZpawuTM/IUEXcAzpiUkTd73Hmvw26FiN3cJuTmkpM5hZzHwkomVdtrh/n/zzwA==, - } - engines: { node: ">=14" } - - "@opentelemetry/api@1.8.0": - resolution: - { - integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==, - } - engines: { node: ">=8.0.0" } - - "@opentelemetry/context-async-hooks@1.24.1": - resolution: - { - integrity: sha512-R5r6DO4kgEOVBxFXhXjwospLQkv+sYxwCfjvoZBe7Zm6KKXAV9kDSJhi/D1BweowdZmO+sdbENLs374gER8hpQ==, - } - engines: { node: ">=14" } + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.15.1': + resolution: {integrity: sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.4.0': + resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.3': + resolution: {integrity: sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@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==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@opentelemetry/api-logs@0.51.1': + resolution: {integrity: sha512-E3skn949Pk1z2XtXu/lxf6QAZpawuTM/IUEXcAzpiUkTd73Hmvw26FiN3cJuTmkpM5hZzHwkomVdtrh/n/zzwA==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@1.24.1': + resolution: {integrity: sha512-R5r6DO4kgEOVBxFXhXjwospLQkv+sYxwCfjvoZBe7Zm6KKXAV9kDSJhi/D1BweowdZmO+sdbENLs374gER8hpQ==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.9.0" - - "@opentelemetry/core@1.24.1": - resolution: - { - integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==, - } - engines: { node: ">=14" } + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/core@1.24.1': + resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.9.0" - - "@opentelemetry/instrumentation-connect@0.36.1": - resolution: - { - integrity: sha512-xI5Q/CMmzBmHshPnzzjD19ptFaYO/rQWzokpNio4QixZYWhJsa35QgRvN9FhPkwgtuJIbt/CWWAufJ3egJNHEA==, - } - engines: { node: ">=14" } + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/instrumentation-connect@0.36.1': + resolution: {integrity: sha512-xI5Q/CMmzBmHshPnzzjD19ptFaYO/rQWzokpNio4QixZYWhJsa35QgRvN9FhPkwgtuJIbt/CWWAufJ3egJNHEA==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-express@0.39.0": - resolution: - { - integrity: sha512-AG8U7z7D0JcBu/7dDcwb47UMEzj9/FMiJV2iQZqrsZnxR3FjB9J9oIH2iszJYci2eUdp2WbdvtpD9RV/zmME5A==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.39.0': + resolution: {integrity: sha512-AG8U7z7D0JcBu/7dDcwb47UMEzj9/FMiJV2iQZqrsZnxR3FjB9J9oIH2iszJYci2eUdp2WbdvtpD9RV/zmME5A==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-fastify@0.36.1": - resolution: - { - integrity: sha512-3Nfm43PI0I+3EX+1YbSy6xbDu276R1Dh1tqAk68yd4yirnIh52Kd5B+nJ8CgHA7o3UKakpBjj6vSzi5vNCzJIA==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.36.1': + resolution: {integrity: sha512-3Nfm43PI0I+3EX+1YbSy6xbDu276R1Dh1tqAk68yd4yirnIh52Kd5B+nJ8CgHA7o3UKakpBjj6vSzi5vNCzJIA==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-graphql@0.40.0": - resolution: - { - integrity: sha512-LVRdEHWACWOczv2imD+mhUrLMxsEjPPi32vIZJT57zygR5aUiA4em8X3aiGOCycgbMWkIu8xOSGSxdx3JmzN+w==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.40.0': + resolution: {integrity: sha512-LVRdEHWACWOczv2imD+mhUrLMxsEjPPi32vIZJT57zygR5aUiA4em8X3aiGOCycgbMWkIu8xOSGSxdx3JmzN+w==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-hapi@0.38.0": - resolution: - { - integrity: sha512-ZcOqEuwuutTDYIjhDIStix22ECblG/i9pHje23QGs4Q4YS4RMaZ5hKCoQJxW88Z4K7T53rQkdISmoXFKDV8xMg==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.38.0': + resolution: {integrity: sha512-ZcOqEuwuutTDYIjhDIStix22ECblG/i9pHje23QGs4Q4YS4RMaZ5hKCoQJxW88Z4K7T53rQkdISmoXFKDV8xMg==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-http@0.51.1": - resolution: - { - integrity: sha512-6b3nZnFFEz/3xZ6w8bVxctPUWIPWiXuPQ725530JgxnN1cvYFd8CJ75PrHZNjynmzSSnqBkN3ef4R9N+RpMh8Q==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.51.1': + resolution: {integrity: sha512-6b3nZnFFEz/3xZ6w8bVxctPUWIPWiXuPQ725530JgxnN1cvYFd8CJ75PrHZNjynmzSSnqBkN3ef4R9N+RpMh8Q==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-ioredis@0.40.0": - resolution: - { - integrity: sha512-Jv/fH7KhpWe4KBirsiqeUJIYrsdR2iu2l4nWhfOlRvaZ+zYIiLEzTQR6QhBbyRoAbU4OuYJzjWusOmmpGBnwng==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.40.0': + resolution: {integrity: sha512-Jv/fH7KhpWe4KBirsiqeUJIYrsdR2iu2l4nWhfOlRvaZ+zYIiLEzTQR6QhBbyRoAbU4OuYJzjWusOmmpGBnwng==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-koa@0.40.0": - resolution: - { - integrity: sha512-dJc3H/bKMcgUYcQpLF+1IbmUKus0e5Fnn/+ru/3voIRHwMADT3rFSUcGLWSczkg68BCgz0vFWGDTvPtcWIFr7A==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.40.0': + resolution: {integrity: sha512-dJc3H/bKMcgUYcQpLF+1IbmUKus0e5Fnn/+ru/3voIRHwMADT3rFSUcGLWSczkg68BCgz0vFWGDTvPtcWIFr7A==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-mongodb@0.43.0": - resolution: - { - integrity: sha512-bMKej7Y76QVUD3l55Q9YqizXybHUzF3pujsBFjqbZrRn2WYqtsDtTUlbCK7fvXNPwFInqZ2KhnTqd0gwo8MzaQ==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.43.0': + resolution: {integrity: sha512-bMKej7Y76QVUD3l55Q9YqizXybHUzF3pujsBFjqbZrRn2WYqtsDtTUlbCK7fvXNPwFInqZ2KhnTqd0gwo8MzaQ==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-mongoose@0.38.1": - resolution: - { - integrity: sha512-zaeiasdnRjXe6VhYCBMdkmAVh1S5MmXC/0spet+yqoaViGnYst/DOxPvhwg3yT4Yag5crZNWsVXnA538UjP6Ow==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.38.1': + resolution: {integrity: sha512-zaeiasdnRjXe6VhYCBMdkmAVh1S5MmXC/0spet+yqoaViGnYst/DOxPvhwg3yT4Yag5crZNWsVXnA538UjP6Ow==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-mysql2@0.38.1": - resolution: - { - integrity: sha512-qkpHMgWSDTYVB1vlZ9sspf7l2wdS5DDq/rbIepDwX5BA0N0068JTQqh0CgAh34tdFqSCnWXIhcyOXC2TtRb0sg==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.38.1': + resolution: {integrity: sha512-qkpHMgWSDTYVB1vlZ9sspf7l2wdS5DDq/rbIepDwX5BA0N0068JTQqh0CgAh34tdFqSCnWXIhcyOXC2TtRb0sg==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-mysql@0.38.1": - resolution: - { - integrity: sha512-+iBAawUaTfX/HAlvySwozx0C2B6LBfNPXX1W8Z2On1Uva33AGkw2UjL9XgIg1Pj4eLZ9R4EoJ/aFz+Xj4E/7Fw==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.38.1': + resolution: {integrity: sha512-+iBAawUaTfX/HAlvySwozx0C2B6LBfNPXX1W8Z2On1Uva33AGkw2UjL9XgIg1Pj4eLZ9R4EoJ/aFz+Xj4E/7Fw==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-nestjs-core@0.37.1": - resolution: - { - integrity: sha512-ebYQjHZEmGHWEALwwDGhSQVLBaurFnuLIkZD5igPXrt7ohfF4lc5/4al1LO+vKc0NHk8SJWStuRueT86ISA8Vg==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.37.1': + resolution: {integrity: sha512-ebYQjHZEmGHWEALwwDGhSQVLBaurFnuLIkZD5igPXrt7ohfF4lc5/4al1LO+vKc0NHk8SJWStuRueT86ISA8Vg==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation-pg@0.41.0": - resolution: - { - integrity: sha512-BSlhpivzBD77meQNZY9fS4aKgydA8AJBzv2dqvxXFy/Hq64b7HURgw/ztbmwFeYwdF5raZZUifiiNSMLpOJoSA==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.41.0': + resolution: {integrity: sha512-BSlhpivzBD77meQNZY9fS4aKgydA8AJBzv2dqvxXFy/Hq64b7HURgw/ztbmwFeYwdF5raZZUifiiNSMLpOJoSA==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation@0.43.0": - resolution: - { - integrity: sha512-S1uHE+sxaepgp+t8lvIDuRgyjJWisAb733198kwQTUc9ZtYQ2V2gmyCtR1x21ePGVLoMiX/NWY7WA290hwkjJQ==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.43.0': + resolution: {integrity: sha512-S1uHE+sxaepgp+t8lvIDuRgyjJWisAb733198kwQTUc9ZtYQ2V2gmyCtR1x21ePGVLoMiX/NWY7WA290hwkjJQ==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/instrumentation@0.51.1": - resolution: - { - integrity: sha512-JIrvhpgqY6437QIqToyozrUG1h5UhwHkaGK/WAX+fkrpyPtc+RO5FkRtUd9BH0MibabHHvqsnBGKfKVijbmp8w==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.51.1': + resolution: {integrity: sha512-JIrvhpgqY6437QIqToyozrUG1h5UhwHkaGK/WAX+fkrpyPtc+RO5FkRtUd9BH0MibabHHvqsnBGKfKVijbmp8w==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.3.0 - - "@opentelemetry/redis-common@0.36.2": - resolution: - { - integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==, - } - engines: { node: ">=14" } - - "@opentelemetry/resources@1.24.1": - resolution: - { - integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==, - } - engines: { node: ">=14" } + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resources@1.24.1': + resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.9.0" - - "@opentelemetry/sdk-metrics@1.24.1": - resolution: - { - integrity: sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==, - } - engines: { node: ">=14" } + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/sdk-metrics@1.24.1': + resolution: {integrity: sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.9.0" - - "@opentelemetry/sdk-trace-base@1.24.1": - resolution: - { - integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==, - } - engines: { node: ">=14" } + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/sdk-trace-base@1.24.1': + resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.9.0" - - "@opentelemetry/semantic-conventions@1.24.1": - resolution: - { - integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==, - } - engines: { node: ">=14" } - - "@opentelemetry/sql-common@0.40.1": - resolution: - { - integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==, - } - engines: { node: ">=14" } + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/semantic-conventions@1.24.1': + resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} peerDependencies: - "@opentelemetry/api": ^1.1.0 - - "@prisma/instrumentation@5.14.0": - resolution: - { - integrity: sha512-DeybWvIZzu/mUsOYP9MVd6AyBj+MP7xIMrcuIn25MX8FiQX39QBnET5KhszTAip/ToctUuDwSJ46QkIoyo3RFA==, - } - - "@rollup/rollup-android-arm-eabi@4.18.0": - resolution: - { - integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==, - } + '@opentelemetry/api': ^1.1.0 + + '@prisma/instrumentation@5.14.0': + resolution: {integrity: sha512-DeybWvIZzu/mUsOYP9MVd6AyBj+MP7xIMrcuIn25MX8FiQX39QBnET5KhszTAip/ToctUuDwSJ46QkIoyo3RFA==} + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.18.0": - resolution: - { - integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==, - } + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.18.0": - resolution: - { - integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==, - } + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.18.0": - resolution: - { - integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==, - } + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] - "@rollup/rollup-linux-arm-gnueabihf@4.18.0": - resolution: - { - integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==, - } + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.18.0": - resolution: - { - integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==, - } + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.18.0": - resolution: - { - integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==, - } + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.18.0": - resolution: - { - integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==, - } + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - resolution: - { - integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==, - } + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.18.0": - resolution: - { - integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==, - } + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.18.0": - resolution: - { - integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==, - } + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.18.0": - resolution: - { - integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==, - } + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.18.0": - resolution: - { - integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==, - } + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] - "@rollup/rollup-win32-arm64-msvc@4.18.0": - resolution: - { - integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==, - } + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.18.0": - resolution: - { - integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==, - } + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.18.0": - resolution: - { - integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==, - } + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] - "@sentry/core@8.7.0": - resolution: - { - integrity: sha512-Sq/46B+5nWmgnCD6dEMZ6HTkKbV/KAdgaSvT8oXDb9OWoPy1jJ/gbLrhLs62KbjuDQk4/vWnOgHiKQbcslSzMw==, - } - engines: { node: ">=14.18" } - - "@sentry/node@8.7.0": - resolution: - { - integrity: sha512-El1LmXGVe8Ahi5oUdlrE5s3Or23/iGnnntNvaYymXk4BmL4dJtv7ttlQ94ZrI9QWs8VnfM7eHqCd+OPjTh0XJQ==, - } - engines: { node: ">=14.18" } - - "@sentry/opentelemetry@8.7.0": - resolution: - { - integrity: sha512-I9JEXnqXDBPr5MtgEYRvmcolmpugSgH1QV+SFnfOPc40Mu/npNsJq7oqbGzhlCe4H45XD6LJzFlc7BfoCzwAsQ==, - } - engines: { node: ">=14.18" } + '@sentry/core@8.7.0': + resolution: {integrity: sha512-Sq/46B+5nWmgnCD6dEMZ6HTkKbV/KAdgaSvT8oXDb9OWoPy1jJ/gbLrhLs62KbjuDQk4/vWnOgHiKQbcslSzMw==} + engines: {node: '>=14.18'} + + '@sentry/node@8.7.0': + resolution: {integrity: sha512-El1LmXGVe8Ahi5oUdlrE5s3Or23/iGnnntNvaYymXk4BmL4dJtv7ttlQ94ZrI9QWs8VnfM7eHqCd+OPjTh0XJQ==} + engines: {node: '>=14.18'} + + '@sentry/opentelemetry@8.7.0': + resolution: {integrity: sha512-I9JEXnqXDBPr5MtgEYRvmcolmpugSgH1QV+SFnfOPc40Mu/npNsJq7oqbGzhlCe4H45XD6LJzFlc7BfoCzwAsQ==} + engines: {node: '>=14.18'} peerDependencies: - "@opentelemetry/api": ^1.8.0 - "@opentelemetry/core": ^1.24.1 - "@opentelemetry/instrumentation": ^0.51.1 - "@opentelemetry/sdk-trace-base": ^1.23.0 - "@opentelemetry/semantic-conventions": ^1.23.0 - - "@sentry/profiling-node@8.7.0": - resolution: - { - integrity: sha512-JL4XZD4bchbAjxR4KIO9GQxmK79y3SBZFp8ELz6cyT3XP0dl57C/BOtaOq6pt5kcW7dlCFFWQPxXVsIZSSN5Xw==, - } - engines: { node: ">=14.18" } + '@opentelemetry/api': ^1.8.0 + '@opentelemetry/core': ^1.24.1 + '@opentelemetry/instrumentation': ^0.51.1 + '@opentelemetry/sdk-trace-base': ^1.23.0 + '@opentelemetry/semantic-conventions': ^1.23.0 + + '@sentry/profiling-node@8.7.0': + resolution: {integrity: sha512-JL4XZD4bchbAjxR4KIO9GQxmK79y3SBZFp8ELz6cyT3XP0dl57C/BOtaOq6pt5kcW7dlCFFWQPxXVsIZSSN5Xw==} + engines: {node: '>=14.18'} hasBin: true - "@sentry/types@8.7.0": - resolution: - { - integrity: sha512-11KLOKumP6akugVGLvSoEig+JlP0ZEzW3nN9P+ppgdIx9HAxMIh6UvumbieG4/DWjAh2kh6NPNfUw3gk2Gfq1A==, - } - engines: { node: ">=14.18" } - - "@sentry/utils@8.7.0": - resolution: - { - integrity: sha512-aWmcbSoOmrbzll/FkNQFJcCtLAuJLvTYbRKiCSkV3FScA7UaA742HkTZAPFiioALFIESWk/fcGZqtN0s4I281Q==, - } - engines: { node: ">=14.18" } - - "@sinclair/typebox@0.27.8": - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } - - "@types/accepts@1.3.7": - resolution: - { - integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==, - } - - "@types/body-parser@1.19.5": - resolution: - { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, - } - - "@types/connect@3.4.36": - resolution: - { - integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==, - } - - "@types/connect@3.4.38": - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } - - "@types/content-disposition@0.5.8": - resolution: - { - integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==, - } - - "@types/cookies@0.9.0": - resolution: - { - integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==, - } - - "@types/estree@1.0.5": - resolution: - { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, - } - - "@types/express-serve-static-core@4.19.3": - resolution: - { - integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==, - } - - "@types/express@4.17.21": - resolution: - { - integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, - } - - "@types/http-assert@1.5.5": - resolution: - { - integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==, - } - - "@types/http-errors@2.0.4": - resolution: - { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, - } - - "@types/keygrip@1.0.6": - resolution: - { - integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==, - } - - "@types/koa-compose@3.2.8": - resolution: - { - integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==, - } - - "@types/koa@2.14.0": - resolution: - { - integrity: sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==, - } - - "@types/koa__router@12.0.3": - resolution: - { - integrity: sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==, - } - - "@types/mime@1.3.5": - resolution: - { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, - } - - "@types/mysql@2.15.22": - resolution: - { - integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==, - } - - "@types/node@20.13.0": - resolution: - { - integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==, - } - - "@types/pg-pool@2.0.4": - resolution: - { - integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==, - } - - "@types/pg@8.6.1": - resolution: - { - integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==, - } - - "@types/qs@6.9.15": - resolution: - { - integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==, - } - - "@types/range-parser@1.2.7": - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } - - "@types/send@0.17.4": - resolution: - { - integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, - } - - "@types/serve-static@1.15.7": - resolution: - { - integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, - } - - "@types/shimmer@1.0.5": - resolution: - { - integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==, - } - - "@vitest/coverage-v8@1.6.0": - resolution: - { - integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==, - } + '@sentry/types@8.7.0': + resolution: {integrity: sha512-11KLOKumP6akugVGLvSoEig+JlP0ZEzW3nN9P+ppgdIx9HAxMIh6UvumbieG4/DWjAh2kh6NPNfUw3gk2Gfq1A==} + engines: {node: '>=14.18'} + + '@sentry/utils@8.7.0': + resolution: {integrity: sha512-aWmcbSoOmrbzll/FkNQFJcCtLAuJLvTYbRKiCSkV3FScA7UaA742HkTZAPFiioALFIESWk/fcGZqtN0s4I281Q==} + engines: {node: '>=14.18'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/content-disposition@0.5.8': + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + + '@types/cookies@0.9.0': + resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.3': + resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/http-assert@1.5.5': + resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + + '@types/koa@2.14.0': + resolution: {integrity: sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==} + + '@types/koa__router@12.0.3': + resolution: {integrity: sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mysql@2.15.22': + resolution: {integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==} + + '@types/node@20.13.0': + resolution: {integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==} + + '@types/pg-pool@2.0.4': + resolution: {integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/shimmer@1.0.5': + resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} + + '@vitest/coverage-v8@1.6.0': + resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} peerDependencies: vitest: 1.6.0 - "@vitest/expect@1.6.0": - resolution: - { - integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==, - } - - "@vitest/runner@1.6.0": - resolution: - { - integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==, - } - - "@vitest/snapshot@1.6.0": - resolution: - { - integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==, - } - - "@vitest/spy@1.6.0": - resolution: - { - integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==, - } - - "@vitest/utils@1.6.0": - resolution: - { - integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==, - } + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} accepts@1.3.8: - resolution: - { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} acorn-import-assertions@1.9.0: - resolution: - { - integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, - } + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 acorn-import-attributes@1.9.5: - resolution: - { - integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==, - } + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.3.2: - resolution: - { - integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} acorn@8.11.3: - resolution: - { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} array-flatten@1.1.1: - resolution: - { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, - } + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} assertion-error@1.1.0: - resolution: - { - integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, - } + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} body-parser@1.20.2: - resolution: - { - integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} cac@6.7.14: - resolution: - { - integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} call-bind@1.0.7: - resolution: - { - integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} chai@4.4.1: - resolution: - { - integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} check-error@1.0.3: - resolution: - { - integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, - } + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} cjs-module-lexer@1.3.1: - resolution: - { - integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==, - } + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} confbox@0.1.7: - resolution: - { - integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==, - } + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} content-disposition@0.5.4: - resolution: - { - integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} cookie-signature@1.0.6: - resolution: - { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, - } + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} cookie@0.6.0: - resolution: - { - integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.3.5: - resolution: - { - integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true deep-eql@4.1.3: - resolution: - { - integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} detect-libc@2.0.3: - resolution: - { - integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} diff-sequences@29.6.3: - resolution: - { - integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} es-define-property@1.0.0: - resolution: - { - integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} esbuild@0.20.2: - resolution: - { - integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} hasBin: true escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} eslint-scope@8.0.1: - resolution: - { - integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 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 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.0.0: - resolution: - { - integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.4.0: - resolution: - { - integrity: sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true espree@10.0.1: - resolution: - { - integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} estree-walker@3.0.3: - resolution: - { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, - } + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} execa@8.0.1: - resolution: - { - integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, - } - engines: { node: ">=16.17" } + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} express@4.19.2: - resolution: - { - integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==, - } - engines: { node: ">= 0.10.0" } + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.17.1: - resolution: - { - integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, - } + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: ">=16.0.0" } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} finalhandler@1.2.0: - resolution: - { - integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.1: - resolution: - { - integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, - } + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } + 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 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} get-func-name@2.0.2: - resolution: - { - integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, - } + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} get-intrinsic@1.2.4: - resolution: - { - integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} get-stream@8.0.1: - resolution: - { - integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globals@15.3.0: - resolution: - { - integrity: sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==} + engines: {node: '>=18'} gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.0.3: - resolution: - { - integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} human-signals@5.0.0: - resolution: - { - integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, - } - engines: { node: ">=16.17.0" } + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} ignore@5.3.1: - resolution: - { - integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} import-in-the-middle@1.4.2: - resolution: - { - integrity: sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==, - } + resolution: {integrity: sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==} import-in-the-middle@1.7.4: - resolution: - { - integrity: sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==, - } + resolution: {integrity: sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==} imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + 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" } + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} is-core-module@2.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - } + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} is-stream@3.0.0: - resolution: - { - integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@5.0.4: - resolution: - { - integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + engines: {node: '>=10'} istanbul-reports@3.1.7: - resolution: - { - integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} js-tokens@9.0.0: - resolution: - { - integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==, - } + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} local-pkg@0.5.0: - resolution: - { - integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} loupe@2.3.7: - resolution: - { - integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, - } + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} magic-string@0.30.10: - resolution: - { - integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, - } + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} magicast@0.3.4: - resolution: - { - integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==, - } + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} merge-descriptors@1.0.1: - resolution: - { - integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, - } + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true mimic-fn@4.0.0: - resolution: - { - integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} mlly@1.7.0: - resolution: - { - integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==, - } + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} module-details-from-path@1.0.3: - resolution: - { - integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==, - } + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@3.3.7: - resolution: - { - integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} node-abi@3.63.0: - resolution: - { - integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} + engines: {node: '>=10'} npm-run-path@5.3.0: - resolution: - { - integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} object-inspect@1.13.1: - resolution: - { - integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, - } + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} onetime@6.0.0: - resolution: - { - integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} opentelemetry-instrumentation-fetch-node@1.2.0: - resolution: - { - integrity: sha512-aiSt/4ubOTyb1N5C2ZbGrBvaJOXIZhZvpRPYuUVxQJe27wJZqf/o65iPrqgLcgfeOLaQ8cS2Q+762jrYvniTrA==, - } - engines: { node: ">18.0.0" } + resolution: {integrity: sha512-aiSt/4ubOTyb1N5C2ZbGrBvaJOXIZhZvpRPYuUVxQJe27wJZqf/o65iPrqgLcgfeOLaQ8cS2Q+762jrYvniTrA==} + engines: {node: '>18.0.0'} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-limit@5.0.0: - resolution: - { - integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } + 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" } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-key@4.0.0: - resolution: - { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-to-regexp@0.1.7: - resolution: - { - integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, - } + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} pathe@1.1.2: - resolution: - { - integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, - } + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathval@1.1.1: - resolution: - { - integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, - } + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} pg-int8@1.0.1: - resolution: - { - integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==, - } - engines: { node: ">=4.0.0" } + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} pg-protocol@1.6.1: - resolution: - { - integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==, - } + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} pg-types@2.2.0: - resolution: - { - integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} picocolors@1.0.1: - resolution: - { - integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, - } + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} pkg-types@1.1.1: - resolution: - { - integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==, - } + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} postcss@8.4.38: - resolution: - { - integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: - resolution: - { - integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} postgres-bytea@1.0.0: - resolution: - { - integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} postgres-date@1.0.7: - resolution: - { - integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} postgres-interval@1.2.0: - resolution: - { - integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} pretty-format@29.7.0: - resolution: - { - integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: ">= 0.10" } + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} qs@6.11.0: - resolution: - { - integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} raw-body@2.5.2: - resolution: - { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} react-is@18.3.1: - resolution: - { - integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, - } + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} require-in-the-middle@7.3.0: - resolution: - { - integrity: sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==, - } - engines: { node: ">=8.6.0" } + resolution: {integrity: sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==} + engines: {node: '>=8.6.0'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rollup@4.18.0: - resolution: - { - integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} semver@7.6.2: - resolution: - { - integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} hasBin: true send@0.18.0: - resolution: - { - integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} serve-static@1.15.0: - resolution: - { - integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shimmer@1.2.1: - resolution: - { - integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==, - } + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} side-channel@1.0.6: - resolution: - { - integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} siginfo@2.0.0: - resolution: - { - integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, - } + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} source-map-js@1.2.0: - resolution: - { - integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} stackback@0.0.2: - resolution: - { - integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, - } + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} std-env@3.7.0: - resolution: - { - integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==, - } + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-final-newline@3.0.0: - resolution: - { - integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} strip-literal@2.1.0: - resolution: - { - integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==, - } + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} tinybench@2.8.0: - resolution: - { - integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==, - } + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} tinypool@0.8.4: - resolution: - { - integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} tinyspy@2.2.1: - resolution: - { - integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tsx@4.11.0: + resolution: {integrity: sha512-vzGGELOgAupsNVssAmZjbUDfdm/pWP4R+Kg8TVdsonxbXk0bEpE1qh0yV6/QxUVXaVlNemgcPajGdJJ82n3stg==} + engines: {node: '>=18.0.0'} + hasBin: true type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true ufo@1.5.3: - resolution: - { - integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==, - } + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: ">= 0.4.0" } + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} vite-node@1.6.0: - resolution: - { - integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true vite@5.2.12: - resolution: - { - integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" + sass: '*' + stylus: '*' + sugarss: '*' terser: ^5.4.0 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true less: optional: true @@ -2607,27 +1560,24 @@ packages: optional: true vitest@1.6.0: - resolution: - { - integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + 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.6.0 - "@vitest/ui": 1.6.0 - happy-dom: "*" - jsdom: "*" + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: - "@edge-runtime/vm": + '@edge-runtime/vm': optional: true - "@types/node": + '@types/node': optional: true - "@vitest/browser": + '@vitest/browser': optional: true - "@vitest/ui": + '@vitest/ui': optional: true happy-dom: optional: true @@ -2635,162 +1585,142 @@ packages: optional: true which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true why-is-node-running@2.2.2: - resolution: - { - integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} hasBin: true word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: ">=0.4" } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } + 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" } + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} snapshots: - "@ampproject/remapping@2.3.0": + + '@ampproject/remapping@2.3.0': dependencies: - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - "@babel/helper-string-parser@7.24.6": {} + '@babel/helper-string-parser@7.24.6': {} - "@babel/helper-validator-identifier@7.24.6": {} + '@babel/helper-validator-identifier@7.24.6': {} - "@babel/parser@7.24.6": + '@babel/parser@7.24.6': dependencies: - "@babel/types": 7.24.6 + '@babel/types': 7.24.6 - "@babel/types@7.24.6": + '@babel/types@7.24.6': dependencies: - "@babel/helper-string-parser": 7.24.6 - "@babel/helper-validator-identifier": 7.24.6 + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 - "@bcoe/v8-coverage@0.2.3": {} + '@bcoe/v8-coverage@0.2.3': {} - "@esbuild/aix-ppc64@0.20.2": + '@esbuild/aix-ppc64@0.20.2': optional: true - "@esbuild/android-arm64@0.20.2": + '@esbuild/android-arm64@0.20.2': optional: true - "@esbuild/android-arm@0.20.2": + '@esbuild/android-arm@0.20.2': optional: true - "@esbuild/android-x64@0.20.2": + '@esbuild/android-x64@0.20.2': optional: true - "@esbuild/darwin-arm64@0.20.2": + '@esbuild/darwin-arm64@0.20.2': optional: true - "@esbuild/darwin-x64@0.20.2": + '@esbuild/darwin-x64@0.20.2': optional: true - "@esbuild/freebsd-arm64@0.20.2": + '@esbuild/freebsd-arm64@0.20.2': optional: true - "@esbuild/freebsd-x64@0.20.2": + '@esbuild/freebsd-x64@0.20.2': optional: true - "@esbuild/linux-arm64@0.20.2": + '@esbuild/linux-arm64@0.20.2': optional: true - "@esbuild/linux-arm@0.20.2": + '@esbuild/linux-arm@0.20.2': optional: true - "@esbuild/linux-ia32@0.20.2": + '@esbuild/linux-ia32@0.20.2': optional: true - "@esbuild/linux-loong64@0.20.2": + '@esbuild/linux-loong64@0.20.2': optional: true - "@esbuild/linux-mips64el@0.20.2": + '@esbuild/linux-mips64el@0.20.2': optional: true - "@esbuild/linux-ppc64@0.20.2": + '@esbuild/linux-ppc64@0.20.2': optional: true - "@esbuild/linux-riscv64@0.20.2": + '@esbuild/linux-riscv64@0.20.2': optional: true - "@esbuild/linux-s390x@0.20.2": + '@esbuild/linux-s390x@0.20.2': optional: true - "@esbuild/linux-x64@0.20.2": + '@esbuild/linux-x64@0.20.2': optional: true - "@esbuild/netbsd-x64@0.20.2": + '@esbuild/netbsd-x64@0.20.2': optional: true - "@esbuild/openbsd-x64@0.20.2": + '@esbuild/openbsd-x64@0.20.2': optional: true - "@esbuild/sunos-x64@0.20.2": + '@esbuild/sunos-x64@0.20.2': optional: true - "@esbuild/win32-arm64@0.20.2": + '@esbuild/win32-arm64@0.20.2': optional: true - "@esbuild/win32-ia32@0.20.2": + '@esbuild/win32-ia32@0.20.2': optional: true - "@esbuild/win32-x64@0.20.2": + '@esbuild/win32-x64@0.20.2': optional: true - "@eslint-community/eslint-utils@4.4.0(eslint@9.4.0)": + '@eslint-community/eslint-utils@4.4.0(eslint@9.4.0)': dependencies: eslint: 9.4.0 eslint-visitor-keys: 3.4.3 - "@eslint-community/regexpp@4.10.0": {} + '@eslint-community/regexpp@4.10.0': {} - "@eslint/config-array@0.15.1": + '@eslint/config-array@0.15.1': dependencies: - "@eslint/object-schema": 2.1.3 + '@eslint/object-schema': 2.1.3 debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - "@eslint/eslintrc@3.1.0": + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 debug: 4.3.5 @@ -2804,197 +1734,197 @@ snapshots: transitivePeerDependencies: - supports-color - "@eslint/js@9.4.0": {} + '@eslint/js@9.4.0': {} - "@eslint/object-schema@2.1.3": {} + '@eslint/object-schema@2.1.3': {} - "@humanwhocodes/module-importer@1.0.1": {} + '@humanwhocodes/module-importer@1.0.1': {} - "@humanwhocodes/retry@0.3.0": {} + '@humanwhocodes/retry@0.3.0': {} - "@istanbuljs/schema@0.1.3": {} + '@istanbuljs/schema@0.1.3': {} - "@jest/schemas@29.6.3": + '@jest/schemas@29.6.3': dependencies: - "@sinclair/typebox": 0.27.8 + '@sinclair/typebox': 0.27.8 - "@jridgewell/gen-mapping@0.3.5": + '@jridgewell/gen-mapping@0.3.5': dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.4.15 - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 - "@jridgewell/resolve-uri@3.1.2": {} + '@jridgewell/resolve-uri@3.1.2': {} - "@jridgewell/set-array@1.2.1": {} + '@jridgewell/set-array@1.2.1': {} - "@jridgewell/sourcemap-codec@1.4.15": {} + '@jridgewell/sourcemap-codec@1.4.15': {} - "@jridgewell/trace-mapping@0.3.25": + '@jridgewell/trace-mapping@0.3.25': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 - "@nodelib/fs.scandir@2.1.5": + '@nodelib/fs.scandir@2.1.5': dependencies: - "@nodelib/fs.stat": 2.0.5 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - "@nodelib/fs.stat@2.0.5": {} + '@nodelib/fs.stat@2.0.5': {} - "@nodelib/fs.walk@1.2.8": + '@nodelib/fs.walk@1.2.8': dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - "@opentelemetry/api-logs@0.51.1": + '@opentelemetry/api-logs@0.51.1': dependencies: - "@opentelemetry/api": 1.8.0 + '@opentelemetry/api': 1.8.0 - "@opentelemetry/api@1.8.0": {} + '@opentelemetry/api@1.8.0': {} - "@opentelemetry/context-async-hooks@1.24.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/context-async-hooks@1.24.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 + '@opentelemetry/api': 1.8.0 - "@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/semantic-conventions': 1.24.1 - "@opentelemetry/instrumentation-connect@0.36.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-connect@0.36.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@types/connect": 3.4.36 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@types/connect': 3.4.36 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-express@0.39.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-express@0.39.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-fastify@0.36.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-fastify@0.36.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-graphql@0.40.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-graphql@0.40.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-hapi@0.38.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-hapi@0.38.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-http@0.51.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-http@0.51.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 semver: 7.6.2 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-ioredis@0.40.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-ioredis@0.40.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/redis-common": 0.36.2 - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-koa@0.40.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-koa@0.40.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@types/koa": 2.14.0 - "@types/koa__router": 12.0.3 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@types/koa': 2.14.0 + '@types/koa__router': 12.0.3 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-mongodb@0.43.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-mongodb@0.43.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/sdk-metrics": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-metrics': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-mongoose@0.38.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-mongoose@0.38.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-mysql2@0.38.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-mysql2@0.38.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@opentelemetry/sql-common": 0.40.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.8.0) transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-mysql@0.38.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-mysql@0.38.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@types/mysql": 2.15.22 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@types/mysql': 2.15.22 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-nestjs-core@0.37.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-nestjs-core@0.37.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation-pg@0.41.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation-pg@0.41.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@opentelemetry/sql-common": 0.40.1(@opentelemetry/api@1.8.0) - "@types/pg": 8.6.1 - "@types/pg-pool": 2.0.4 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.8.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.4 transitivePeerDependencies: - supports-color - "@opentelemetry/instrumentation@0.43.0(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation@0.43.0(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@types/shimmer": 1.0.5 + '@opentelemetry/api': 1.8.0 + '@types/shimmer': 1.0.5 import-in-the-middle: 1.4.2 require-in-the-middle: 7.3.0 semver: 7.6.2 @@ -3003,11 +1933,11 @@ snapshots: - supports-color optional: true - "@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/api-logs": 0.51.1 - "@types/shimmer": 1.0.5 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/api-logs': 0.51.1 + '@types/shimmer': 1.0.5 import-in-the-middle: 1.7.4 require-in-the-middle: 7.3.0 semver: 7.6.2 @@ -3015,267 +1945,267 @@ snapshots: transitivePeerDependencies: - supports-color - "@opentelemetry/redis-common@0.36.2": {} + '@opentelemetry/redis-common@0.36.2': {} - "@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 - "@opentelemetry/sdk-metrics@1.24.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/sdk-metrics@1.24.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/resources": 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) lodash.merge: 4.6.2 - "@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/resources": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 - "@opentelemetry/semantic-conventions@1.24.1": {} + '@opentelemetry/semantic-conventions@1.24.1': {} - "@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.8.0)": + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.8.0)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - "@prisma/instrumentation@5.14.0": + '@prisma/instrumentation@5.14.0': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/sdk-trace-base": 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.8.0) transitivePeerDependencies: - supports-color - "@rollup/rollup-android-arm-eabi@4.18.0": + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true - "@rollup/rollup-android-arm64@4.18.0": + '@rollup/rollup-android-arm64@4.18.0': optional: true - "@rollup/rollup-darwin-arm64@4.18.0": + '@rollup/rollup-darwin-arm64@4.18.0': optional: true - "@rollup/rollup-darwin-x64@4.18.0": + '@rollup/rollup-darwin-x64@4.18.0': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.18.0": + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.18.0": + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true - "@rollup/rollup-linux-arm64-gnu@4.18.0": + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true - "@rollup/rollup-linux-arm64-musl@4.18.0": + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true - "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.18.0": + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true - "@rollup/rollup-linux-s390x-gnu@4.18.0": + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true - "@rollup/rollup-linux-x64-gnu@4.18.0": + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true - "@rollup/rollup-linux-x64-musl@4.18.0": + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true - "@rollup/rollup-win32-arm64-msvc@4.18.0": + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true - "@rollup/rollup-win32-ia32-msvc@4.18.0": + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true - "@rollup/rollup-win32-x64-msvc@4.18.0": + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - "@sentry/core@8.7.0": - dependencies: - "@sentry/types": 8.7.0 - "@sentry/utils": 8.7.0 - - "@sentry/node@8.7.0": - dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/context-async-hooks": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-connect": 0.36.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-express": 0.39.0(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-fastify": 0.36.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-graphql": 0.40.0(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-hapi": 0.38.0(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-http": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-ioredis": 0.40.0(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-koa": 0.40.0(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-mongodb": 0.43.0(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-mongoose": 0.38.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-mysql": 0.38.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-mysql2": 0.38.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-nestjs-core": 0.37.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation-pg": 0.41.0(@opentelemetry/api@1.8.0) - "@opentelemetry/resources": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/sdk-trace-base": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@prisma/instrumentation": 5.14.0 - "@sentry/core": 8.7.0 - "@sentry/opentelemetry": 8.7.0(@opentelemetry/api@1.8.0)(@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.24.1) - "@sentry/types": 8.7.0 - "@sentry/utils": 8.7.0 + '@sentry/core@8.7.0': + dependencies: + '@sentry/types': 8.7.0 + '@sentry/utils': 8.7.0 + + '@sentry/node@8.7.0': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/context-async-hooks': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-connect': 0.36.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-express': 0.39.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-fastify': 0.36.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-graphql': 0.40.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-hapi': 0.38.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-http': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-ioredis': 0.40.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-koa': 0.40.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-mongodb': 0.43.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-mongoose': 0.38.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-mysql': 0.38.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-mysql2': 0.38.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-nestjs-core': 0.37.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation-pg': 0.41.0(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@prisma/instrumentation': 5.14.0 + '@sentry/core': 8.7.0 + '@sentry/opentelemetry': 8.7.0(@opentelemetry/api@1.8.0)(@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.24.1) + '@sentry/types': 8.7.0 + '@sentry/utils': 8.7.0 optionalDependencies: opentelemetry-instrumentation-fetch-node: 1.2.0 transitivePeerDependencies: - supports-color - "@sentry/opentelemetry@8.7.0(@opentelemetry/api@1.8.0)(@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.24.1)": + '@sentry/opentelemetry@8.7.0(@opentelemetry/api@1.8.0)(@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.24.1)': dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/core": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/instrumentation": 0.51.1(@opentelemetry/api@1.8.0) - "@opentelemetry/sdk-trace-base": 1.24.1(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 - "@sentry/core": 8.7.0 - "@sentry/types": 8.7.0 - "@sentry/utils": 8.7.0 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + '@sentry/core': 8.7.0 + '@sentry/types': 8.7.0 + '@sentry/utils': 8.7.0 - "@sentry/profiling-node@8.7.0": + '@sentry/profiling-node@8.7.0': dependencies: - "@sentry/core": 8.7.0 - "@sentry/node": 8.7.0 - "@sentry/types": 8.7.0 - "@sentry/utils": 8.7.0 + '@sentry/core': 8.7.0 + '@sentry/node': 8.7.0 + '@sentry/types': 8.7.0 + '@sentry/utils': 8.7.0 detect-libc: 2.0.3 node-abi: 3.63.0 transitivePeerDependencies: - supports-color - "@sentry/types@8.7.0": {} + '@sentry/types@8.7.0': {} - "@sentry/utils@8.7.0": + '@sentry/utils@8.7.0': dependencies: - "@sentry/types": 8.7.0 + '@sentry/types': 8.7.0 - "@sinclair/typebox@0.27.8": {} + '@sinclair/typebox@0.27.8': {} - "@types/accepts@1.3.7": + '@types/accepts@1.3.7': dependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 - "@types/body-parser@1.19.5": + '@types/body-parser@1.19.5': dependencies: - "@types/connect": 3.4.38 - "@types/node": 20.13.0 + '@types/connect': 3.4.38 + '@types/node': 20.13.0 - "@types/connect@3.4.36": + '@types/connect@3.4.36': dependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 - "@types/connect@3.4.38": + '@types/connect@3.4.38': dependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 - "@types/content-disposition@0.5.8": {} + '@types/content-disposition@0.5.8': {} - "@types/cookies@0.9.0": + '@types/cookies@0.9.0': dependencies: - "@types/connect": 3.4.38 - "@types/express": 4.17.21 - "@types/keygrip": 1.0.6 - "@types/node": 20.13.0 + '@types/connect': 3.4.38 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 20.13.0 - "@types/estree@1.0.5": {} + '@types/estree@1.0.5': {} - "@types/express-serve-static-core@4.19.3": + '@types/express-serve-static-core@4.19.3': dependencies: - "@types/node": 20.13.0 - "@types/qs": 6.9.15 - "@types/range-parser": 1.2.7 - "@types/send": 0.17.4 + '@types/node': 20.13.0 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 - "@types/express@4.17.21": + '@types/express@4.17.21': dependencies: - "@types/body-parser": 1.19.5 - "@types/express-serve-static-core": 4.19.3 - "@types/qs": 6.9.15 - "@types/serve-static": 1.15.7 + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.3 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 - "@types/http-assert@1.5.5": {} + '@types/http-assert@1.5.5': {} - "@types/http-errors@2.0.4": {} + '@types/http-errors@2.0.4': {} - "@types/keygrip@1.0.6": {} + '@types/keygrip@1.0.6': {} - "@types/koa-compose@3.2.8": + '@types/koa-compose@3.2.8': dependencies: - "@types/koa": 2.14.0 + '@types/koa': 2.14.0 - "@types/koa@2.14.0": + '@types/koa@2.14.0': dependencies: - "@types/accepts": 1.3.7 - "@types/content-disposition": 0.5.8 - "@types/cookies": 0.9.0 - "@types/http-assert": 1.5.5 - "@types/http-errors": 2.0.4 - "@types/keygrip": 1.0.6 - "@types/koa-compose": 3.2.8 - "@types/node": 20.13.0 + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.9.0 + '@types/http-assert': 1.5.5 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 20.13.0 - "@types/koa__router@12.0.3": + '@types/koa__router@12.0.3': dependencies: - "@types/koa": 2.14.0 + '@types/koa': 2.14.0 - "@types/mime@1.3.5": {} + '@types/mime@1.3.5': {} - "@types/mysql@2.15.22": + '@types/mysql@2.15.22': dependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 - "@types/node@20.13.0": + '@types/node@20.13.0': dependencies: undici-types: 5.26.5 - "@types/pg-pool@2.0.4": + '@types/pg-pool@2.0.4': dependencies: - "@types/pg": 8.6.1 + '@types/pg': 8.6.1 - "@types/pg@8.6.1": + '@types/pg@8.6.1': dependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 pg-protocol: 1.6.1 pg-types: 2.2.0 - "@types/qs@6.9.15": {} + '@types/qs@6.9.15': {} - "@types/range-parser@1.2.7": {} + '@types/range-parser@1.2.7': {} - "@types/send@0.17.4": + '@types/send@0.17.4': dependencies: - "@types/mime": 1.3.5 - "@types/node": 20.13.0 + '@types/mime': 1.3.5 + '@types/node': 20.13.0 - "@types/serve-static@1.15.7": + '@types/serve-static@1.15.7': dependencies: - "@types/http-errors": 2.0.4 - "@types/node": 20.13.0 - "@types/send": 0.17.4 + '@types/http-errors': 2.0.4 + '@types/node': 20.13.0 + '@types/send': 0.17.4 - "@types/shimmer@1.0.5": {} + '@types/shimmer@1.0.5': {} - "@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.13.0))": + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.13.0))': dependencies: - "@ampproject/remapping": 2.3.0 - "@bcoe/v8-coverage": 0.2.3 + '@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 @@ -3291,29 +2221,29 @@ snapshots: transitivePeerDependencies: - supports-color - "@vitest/expect@1.6.0": + '@vitest/expect@1.6.0': dependencies: - "@vitest/spy": 1.6.0 - "@vitest/utils": 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 chai: 4.4.1 - "@vitest/runner@1.6.0": + '@vitest/runner@1.6.0': dependencies: - "@vitest/utils": 1.6.0 + '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - "@vitest/snapshot@1.6.0": + '@vitest/snapshot@1.6.0': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - "@vitest/spy@1.6.0": + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 - "@vitest/utils@1.6.0": + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -3492,29 +2422,29 @@ snapshots: esbuild@0.20.2: 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 + '@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 escape-html@1.0.3: {} @@ -3531,14 +2461,14 @@ snapshots: eslint@9.4.0: dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@9.4.0) - "@eslint-community/regexpp": 4.10.0 - "@eslint/config-array": 0.15.1 - "@eslint/eslintrc": 3.1.0 - "@eslint/js": 9.4.0 - "@humanwhocodes/module-importer": 1.0.1 - "@humanwhocodes/retry": 0.3.0 - "@nodelib/fs.walk": 1.2.8 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/config-array': 0.15.1 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.4.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -3586,7 +2516,7 @@ snapshots: estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.5 + '@types/estree': 1.0.5 esutils@2.0.3: {} @@ -3701,6 +2631,10 @@ snapshots: get-stream@8.0.1: {} + get-tsconfig@4.7.5: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -3811,7 +2745,7 @@ snapshots: istanbul-lib-source-maps@5.0.4: dependencies: - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/trace-mapping': 0.3.25 debug: 4.3.4 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -3860,12 +2794,12 @@ snapshots: magic-string@0.30.10: dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 + '@jridgewell/sourcemap-codec': 1.4.15 magicast@0.3.4: dependencies: - "@babel/parser": 7.24.6 - "@babel/types": 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 source-map-js: 1.2.0 make-dir@4.0.0: @@ -3939,9 +2873,9 @@ snapshots: opentelemetry-instrumentation-fetch-node@1.2.0: dependencies: - "@opentelemetry/api": 1.8.0 - "@opentelemetry/instrumentation": 0.43.0(@opentelemetry/api@1.8.0) - "@opentelemetry/semantic-conventions": 1.24.1 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.43.0(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 transitivePeerDependencies: - supports-color optional: true @@ -4029,7 +2963,7 @@ snapshots: pretty-format@29.7.0: dependencies: - "@jest/schemas": 29.6.3 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 @@ -4067,6 +3001,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.8: dependencies: is-core-module: 2.13.1 @@ -4077,24 +3013,24 @@ snapshots: rollup@4.18.0: dependencies: - "@types/estree": 1.0.5 + '@types/estree': 1.0.5 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.18.0 - "@rollup/rollup-android-arm64": 4.18.0 - "@rollup/rollup-darwin-arm64": 4.18.0 - "@rollup/rollup-darwin-x64": 4.18.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 - "@rollup/rollup-linux-arm-musleabihf": 4.18.0 - "@rollup/rollup-linux-arm64-gnu": 4.18.0 - "@rollup/rollup-linux-arm64-musl": 4.18.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 - "@rollup/rollup-linux-riscv64-gnu": 4.18.0 - "@rollup/rollup-linux-s390x-gnu": 4.18.0 - "@rollup/rollup-linux-x64-gnu": 4.18.0 - "@rollup/rollup-linux-x64-musl": 4.18.0 - "@rollup/rollup-win32-arm64-msvc": 4.18.0 - "@rollup/rollup-win32-ia32-msvc": 4.18.0 - "@rollup/rollup-win32-x64-msvc": 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4192,7 +3128,7 @@ snapshots: test-exclude@6.0.0: dependencies: - "@istanbuljs/schema": 0.1.3 + '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 @@ -4208,6 +3144,13 @@ snapshots: toidentifier@1.0.1: {} + tsx@4.11.0: + dependencies: + esbuild: 0.20.2 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -4219,6 +3162,8 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + typescript@5.4.5: {} + ufo@1.5.3: {} undici-types@5.26.5: {} @@ -4241,7 +3186,7 @@ snapshots: picocolors: 1.0.1 vite: 5.2.12(@types/node@20.13.0) transitivePeerDependencies: - - "@types/node" + - '@types/node' - less - lightningcss - sass @@ -4256,16 +3201,16 @@ snapshots: postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 fsevents: 2.3.3 vitest@1.6.0(@types/node@20.13.0): dependencies: - "@vitest/expect": 1.6.0 - "@vitest/runner": 1.6.0 - "@vitest/snapshot": 1.6.0 - "@vitest/spy": 1.6.0 - "@vitest/utils": 1.6.0 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4 @@ -4282,7 +3227,7 @@ snapshots: vite-node: 1.6.0(@types/node@20.13.0) why-is-node-running: 2.2.2 optionalDependencies: - "@types/node": 20.13.0 + '@types/node': 20.13.0 transitivePeerDependencies: - less - lightningcss diff --git a/server.d.ts b/server.d.ts new file mode 100644 index 0000000..65be0dc --- /dev/null +++ b/server.d.ts @@ -0,0 +1 @@ +import "./instrument.js"; diff --git a/server.js b/server.js index 88d9e71..c998a5c 100644 --- a/server.js +++ b/server.js @@ -1,19 +1,18 @@ // obsidian-spoon is a game server // Copyright (C) 2024 Molly Crendraven - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - -import main from "obsidian-main"; - +// Import this first! +import "./instrument.js"; +// Rest of the imports +import { main } from "obsidian-main"; main(); +//# sourceMappingURL=server.js.map \ No newline at end of file diff --git a/server.js.map b/server.js.map new file mode 100644 index 0000000..8b6d8e8 --- /dev/null +++ b/server.js.map @@ -0,0 +1 @@ +{"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,sCAAsC;AAEtC,uEAAuE;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AAEtC,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAE/C,oEAAoE;AACpE,yEAAyE;AAEzE,qBAAqB;AACrB,OAAO,iBAAiB,CAAC;AAEzB,sBAAsB;AAEtB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..0d8cbfa --- /dev/null +++ b/server.ts @@ -0,0 +1,24 @@ +// obsidian-spoon is a game server +// Copyright (C) 2024 Molly Crendraven + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// Import this first! +import "./instrument.js"; + +// Rest of the imports + +import { main } from "obsidian-main"; + +main(); diff --git a/test/connections.spec.js b/test/connections.spec.js index 1609bbd..5410b6d 100644 --- a/test/connections.spec.js +++ b/test/connections.spec.js @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -import { TCPServer } from "../packages/main/src/TCPServer.js"; +import { TCPServer } from "../packages/main/src/TCPServer.ts"; describe("TCPServer", () => { it("should return an error if the port is priviliged", () => diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ee6ce5e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "NodeNext", + "target": "ES2020", + "allowJs": false, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strict": true, + "verbatimModuleSyntax": true, + "declaration": true, + "sourceMap": true + }, + "exclude": ["node_modules", "**/node_modules/*", "dist/**/*", "./instrument"], + "files": ["./server.ts"], + "references": [{ "path": "./packages/main" }] +} diff --git a/vite.config.js b/vite.config.js index 5bd16ae..6c62a36 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,7 +4,8 @@ export default defineConfig({ test: { coverage: { enabled: true, - exclude: ["node_modules", "test", "server.js"], + exclude: ["node_modules", "test", "./server.{t,j}s", "*.d.ts", "instrument.js"], + include: ["packages/*/*"], } }, });