From 8d363d13c3e03d74084dd9a37be428dece1ae6b2 Mon Sep 17 00:00:00 2001 From: reaby Date: Fri, 28 Jun 2024 22:15:38 +0300 Subject: [PATCH 01/35] minicontrol 0.4.0! bye Bun... welcome Node. Dedimania works just fine :) --- .vscode/launch.json | 85 +- .vscode/settings.json | 11 - README.md | 9 +- bun.lockb | Bin 95491 -> 0 bytes core/gbx/index.ts | 30 +- core/minicontrol.ts | 12 +- core/playermanager.ts | 30 +- core/plugins/database/index.ts | 10 +- core/plugins/debugtool/index.ts | 8 - core/plugins/healthcheck/index.ts | 47 +- core/plugins/index.ts | 1 - core/plugins/maplikes/index.ts | 6 +- core/plugins/players/index.ts | 2 +- core/plugins/records/index.ts | 4 +- core/plugins/tmnf/dedimania/index.ts | 10 +- core/plugins/widgets/checkpoints/index.ts | 4 +- core/server.ts | 2 +- core/ui/manialink.ts | 6 +- core/uimanager.ts | 5 +- documentation/devs/concept.md | 3 - documentation/users/install.md | 30 +- documentation/users/plugins.md | 1 - package-lock.json | 2751 +++++++++++++++++++++ package.json | 17 +- tools/xaseco.ts | 11 +- tsconfig.json | 7 +- 26 files changed, 2894 insertions(+), 208 deletions(-) delete mode 100644 .vscode/settings.json delete mode 100755 bun.lockb create mode 100644 package-lock.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 2603206..768a0f3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,53 +1,32 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "bun", - "request": "launch", - "name": "Debug Bun", - - // The path to a JavaScript or TypeScript file to run. - "program": "core/minicontrol.ts", - // The arguments to pass to the program, if any. - "args": [], - - // The working directory of the program. - "cwd": "${workspaceFolder}", - - // The environment variables to pass to the program. - "env": {}, - - // If the environment variables should not be inherited from the parent process. - "strictEnv": false, - - // If the program should be run in watch mode. - // This is equivalent to passing `--watch` to the `bun` executable. - // You can also set this to "hot" to enable hot reloading using `--hot`. - "watchMode": false, - - // If the debugger should stop on the first line of the program. - "stopOnEntry": false, - - // If the debugger should be disabled. (for example, breakpoints will not be hit) - "noDebug": false, - - // The path to the `bun` executable, defaults to your `PATH` environment variable. - "runtime": "bun", - - // The arguments to pass to the `bun` executable, if any. - // Unlike `args`, these are passed to the executable itself, not the program. - "runtimeArgs": [ - "--smol" - ], - }, - { - "type": "bun", - "request": "attach", - "name": "Attach to Bun", - - // The URL of the WebSocket inspector to attach to. - // This value can be retrieved by using `bun --inspect`. - "url": "ws://localhost:6499/", - } - ] - } \ No newline at end of file +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "runtimeArgs": [ + "start" + ], + "runtimeExecutable": "npm", + "name": "Run npm start", + "request": "launch", + "envFile": "${workspaceFolder}/.env", + "type": "node" + }, + { + "name": "Launch via NPM", + "request": "launch", + "runtimeArgs": [ + "run-script", + "debug" + ], + "runtimeExecutable": "npm", + "skipFiles": [ + "/**" + ], + "type": "node" + }, + + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 55d1d99..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - // The path to the `bun` executable. -// "bun.runtime": "/path/to/bun", - - // If support for Bun should be added to the default "JavaScript Debug Terminal". - "bun.debugTerminal.enabled": true, - - // If the debugger should stop on the first line of the program. -"bun.debugTerminal.stopOnEntry": false, -"js/ts.implicitProjectConfig.target": "ESNext" -} diff --git a/README.md b/README.md index 77235c4..9fd5f82 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,9 @@ A very simple plugin host for Trackmania United Forever, Maniaplanet and Trackma # QuickStart -1. `npm i -g bun` -2. `bun install` -3. copy .env.example to .env and configure -4. `bun start` +1. `npm install` +2. copy .env.example to .env and configure +3. `npm start` See [documentation](./documentation/index.md) for more info! @@ -15,7 +14,7 @@ See [documentation](./documentation/index.md) for more info! 1. run controller once to generate database structure 2. `mysqldump -u root -p databasename > xaseco.sql` 3. move `xaseco.sql` to `tools` -5. run bun from Tools folder: `bun xaseco.ts xaseco.sql` +5. run bun from Tools folder: `tsx xaseco.ts xaseco.sql` 6. start controller diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 6364d7135005bc78ea7689becd2a3ba8678adedb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95491 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 Q2MREZiJiOjFZ{p%13R8nD*ylh diff --git a/core/gbx/index.ts b/core/gbx/index.ts index 86c0b1c..dcfb6b9 100644 --- a/core/gbx/index.ts +++ b/core/gbx/index.ts @@ -1,4 +1,5 @@ -import {Buffer} from "buffer"; +import { Buffer } from "node:buffer"; +import { Socket } from 'net'; import type Server from "core/server"; import {Readable} from 'stream'; // @ts-ignore @@ -53,24 +54,31 @@ export class GbxClient { host = host || "127.0.0.1"; port = port || 5000; const that = this; - this.socket = await Bun.connect({ - hostname: host, + const socket = new Socket(); + this.socket = socket; + socket.connect({ + host: host, port: port, - socket: { - end() { + keepAlive: true, + }, () => { + socket.on("end", () => { that.isConnected = false; that.server.onDisconnect("end"); - }, - error(error: any) { + }); + socket.on("error", (error: any) => { that.isConnected = false; that.server.onDisconnect(error.message); - }, - data(socket: any, data: Buffer) { + }); + socket.on("data", (data: Buffer) => { that.handleData(data); - } + }); - } + socket.on("timeout", () => { + tmc.cli("¤error¤XMLRPC Connection timeout"); + process.exit(1); + }); }); + const res: boolean = await new Promise((resolve, reject) => { this.promiseCallbacks['onConnect'] = {resolve, reject}; }); diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 6a95626..15ce51b 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -11,11 +11,6 @@ import Plugin from 'core/plugins'; import path from 'path'; import { DepGraph } from "dependency-graph"; -if (!process.versions.bun) { - log.info(`Please install bun using "npm install -g bun"`); - process.exit(); -} - export interface GameStruct { Name: string; Version?: string; @@ -30,7 +25,7 @@ class MiniControl { * The version of MiniControl. */ readonly brand: string = "$n$o$eeeMINI$o$z$s$abccontrol$z$s¤white¤"; - readonly version: string = "0.3.8"; + readonly version: string = "0.4.0"; /** * The start time of MiniControl. */ @@ -196,7 +191,6 @@ class MiniControl { const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ failed to load. Missing dependency ¤cmd¤${depend}¤white¤.`; this.cli(msg); if (this.startComplete) this.chat(msg); - Bun.gc(true); return; } } @@ -257,8 +251,6 @@ class MiniControl { } else { this.cli(`$fffFailed to remove require cache for ¤cmd¤${unloadName}¤white¤, hotreload will not work right.`); } - - Bun.gc(true); const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ unloaded.`; this.cli(msg); this.chat(msg); @@ -308,7 +300,7 @@ class MiniControl { if (this.startComplete) return; const port = Number.parseInt(process.env.XMLRPC_PORT || "5000"); this.cli("¤info¤Starting MiniControl..."); - this.cli(`¤info¤Using Bun ¤white¤${Bun.version}`); + this.cli(`¤info¤Using Node ¤white¤${process.version}`); this.cli("¤info¤Connecting to Trackmania Dedicated server at ¤white¤" + (process.env.XMLRPC_HOST ?? "127.0.0.1") + ":" + port); const status = await this.server.connect(process.env.XMLRPC_HOST ?? "127.0.0.1", port); if (!status) { diff --git a/core/playermanager.ts b/core/playermanager.ts index 87efe4f..43c5bfc 100644 --- a/core/playermanager.ts +++ b/core/playermanager.ts @@ -1,5 +1,4 @@ -import { sleep } from "bun"; -import { clone } from "./utils"; +import { clone, sleep } from "./utils"; interface PlayerRanking { Path: string; @@ -19,6 +18,7 @@ interface LadderStats { nbrMatchLosses: number; TeamName: string; } + /** * Player class */ @@ -53,7 +53,7 @@ export class Player { data[key] = data[key].replace(/[$][lh]\[.*?](.*?)([$][lh])?/i, "$1").replaceAll(/[$][lh]/gi, ""); } if (k == "flags") { - this.spectatorTarget = Math.floor(data.Flags / 10000); + this.spectatorTarget = Math.floor(data.SpecatorStatus / 10000); } this[k] = data[key]; } @@ -104,9 +104,9 @@ export default class PlayerManager { } private async onPlayerConnect(data: any) { - await sleep(100); const login = data[0]; - if (login) { + if (login) { + await sleep(100); // @TODO check if this is really needed const player = await this.getPlayer(login); tmc.server.emit("TMC.PlayerConnect", player); } else { @@ -133,7 +133,7 @@ export default class PlayerManager { * get players objects * @returns {Player[]} Returns clone of the current playerlist */ - get(): Player[] { + getAll(): Player[] { return Object.values(this.players); } @@ -156,13 +156,17 @@ export default class PlayerManager { */ async getPlayer(login: string): Promise { if (this.players[login]) return this.players[login]; - tmc.debug(`$888Player ${login} not found, fetching from server.`); - - const data = await tmc.server.call("GetDetailedPlayerInfo", login); - const player = new Player(); - await player.syncFromDetailedPlayerInfo(data); - this.players[login] = player; - return player; + + try { + tmc.debug(`$888Player ${login} not found, fetching from server.`); + const data = await tmc.server.call("GetDetailedPlayerInfo", login); + const player = new Player(); + await player.syncFromDetailedPlayerInfo(data); + this.players[login] = player; + return player; + } catch (e: any) { + return new Player(); + } } /** diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index 32a5227..b062726 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -1,6 +1,6 @@ -import { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite'; -import { migrate } from "drizzle-orm/bun-sqlite/migrator"; -import { Database } from 'bun:sqlite'; +import { drizzle, type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; +import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; +import Database from 'better-sqlite3'; import { eq } from "drizzle-orm"; import type { Logger } from 'drizzle-orm/logger'; import type { Player as PlayerType } from 'core/playermanager'; @@ -53,7 +53,7 @@ export default class SqliteDb extends Plugin { async syncPlayer(player: PlayerType) { if (!tmc.storage['sqlite']) return; - const db: BunSQLiteDatabase = tmc.storage['sqlite']; + const db: BetterSQLite3Database = tmc.storage['sqlite']; const query = await db.select().from(Player).where(eq(Player.login, player.login)); if (query.length == 0) { await db.insert(Player).values({ @@ -73,7 +73,7 @@ export default class SqliteDb extends Plugin { } async syncPlayers() { - const players = tmc.players.get(); + const players = tmc.players.getAll(); for (const player of players) { await this.syncPlayer(await tmc.players.getPlayer(player.login)); } diff --git a/core/plugins/debugtool/index.ts b/core/plugins/debugtool/index.ts index d7723a3..67957cd 100644 --- a/core/plugins/debugtool/index.ts +++ b/core/plugins/debugtool/index.ts @@ -1,4 +1,3 @@ -import { generateHeapSnapshot } from "bun"; import { memInfo } from "core/utils"; import Plugin from "core/plugins"; import tm from 'tm-essentials'; @@ -12,7 +11,6 @@ export default class DebugTool extends Plugin { if (process.env.DEBUG == "true") { this.widget = new Widget("core/plugins/debugtool/widget.twig"); this.widget.pos = { x: 159, y: -60 }; - tmc.addCommand("//heap", this.cmdHeap.bind(this), "Log heap memory usage"); tmc.addCommand("//addfake", this.cmdFakeUsers.bind(this), "Connect Fake users"); tmc.addCommand("//removefake", this.cmdRemoveFakeUsers.bind(this), "Connect Fake users"); } @@ -48,12 +46,6 @@ export default class DebugTool extends Plugin { tmc.chat("¤info¤Memory usage: " + mem, login); } - async cmdHeap(login: string, args: string[]) { - const snapshot = generateHeapSnapshot(); - await Bun.write("./heap.heapsnapshot", JSON.stringify(snapshot, null, 4)); - tmc.chat("¤info¤Heap snapshot written to ¤white¤heap.heapsnapshot", login); - } - async displayMemInfo() { const mem = memInfo(); diff --git a/core/plugins/healthcheck/index.ts b/core/plugins/healthcheck/index.ts index 7cddd7a..185c581 100644 --- a/core/plugins/healthcheck/index.ts +++ b/core/plugins/healthcheck/index.ts @@ -1,37 +1,38 @@ -import type { Socket, TCPSocketListener } from "bun"; +import { Server, type Socket } from "net"; import Plugin from ".."; export default class HealthCheck extends Plugin { - socket: TCPSocketListener | null = null; + server: Server | null = null; async onLoad() { - this.socket = Bun.listen({ - port: 3000, - hostname: "127.0.0.1", - socket: { - error(error: any) { - tmc.cli(`¤error¤HealthCheck: ${error.message}`); - }, - data(socket: Socket, data: Buffer) { - const message = data.toString("utf-8").trim(); - if (message == "ping") { - // sends 0 if the service is healthy, 1 if it's not - socket.end(tmc.startComplete ? "0" : "1"); - tmc.debug("¤info¤HealthCheck: Ping received."); - } - }, - open() { - tmc.debug("¤info¤HealthCheck: Connection opened."); + this.server = new Server((socket: Socket) => { + + socket.on("error", (error: any) => { + tmc.cli(`¤error¤HealthCheck: ${error.message}`); + }) + + socket.on("data", (data: Buffer) => { + const message = data.toString("utf-8").trim(); + if (message == "ping") { + // sends 0 if the service is healthy, 1 if it's not + socket.end(tmc.startComplete ? "0" : "1"); + tmc.debug("¤info¤HealthCheck: Ping received."); } - } + }); + + socket.on("open", () => { + tmc.debug("¤info¤HealthCheck: Connection opened."); + }); }); + + this.server.listen(3000); } async onUnload() { - if (this.socket) { - this.socket.stop(); - this.socket = null; + if (this.server) { + this.server.close(); + this.server = null; } } } \ No newline at end of file diff --git a/core/plugins/index.ts b/core/plugins/index.ts index 326c088..be1e247 100644 --- a/core/plugins/index.ts +++ b/core/plugins/index.ts @@ -1,4 +1,3 @@ -import Statistics from "userdata/plugins/kacky/stats"; export default abstract class Plugin { /** "game:TmForever | game:ManiaPlanet | game:Trackmania or plugin name to depend" */ diff --git a/core/plugins/maplikes/index.ts b/core/plugins/maplikes/index.ts index f3cbdc8..9ea9c44 100644 --- a/core/plugins/maplikes/index.ts +++ b/core/plugins/maplikes/index.ts @@ -1,5 +1,5 @@ import Plugin from "core/plugins"; -import type {BunSQLiteDatabase} from "drizzle-orm/bun-sqlite"; +import type {BetterSQLite3Database} from "drizzle-orm/better-sqlite3"; import {and, eq} from "drizzle-orm"; import {MapLikes as Likes} from "core/schemas/maplikes"; @@ -35,7 +35,7 @@ export default class MapLikes extends Plugin { async syncVotes() { if (!tmc.storage['sqlite']) return; if (!tmc.maps.currentMap) return; - const db: BunSQLiteDatabase = tmc.storage['sqlite']; + const db: BetterSQLite3Database = tmc.storage['sqlite']; const votes = await db.select().from(Likes).where(eq(Likes.mapUuid, tmc.maps.currentMap.UId)); this.votes = []; for (const vote of votes) { @@ -70,7 +70,7 @@ export default class MapLikes extends Plugin { async updateVote(login: string, value: number = 0) { if (!tmc.storage['sqlite']) return; if (!tmc.maps.currentMap) return; - const db: BunSQLiteDatabase = tmc.storage['sqlite']; + const db: BetterSQLite3Database = tmc.storage['sqlite']; const query = await db.select().from(Likes).where(and(eq(Likes.mapUuid, tmc.maps.currentMap.UId), eq(Likes.login, login))); if (query.length == 0) { await db.insert(Likes).values({ diff --git a/core/plugins/players/index.ts b/core/plugins/players/index.ts index e9b0bca..f5d355f 100644 --- a/core/plugins/players/index.ts +++ b/core/plugins/players/index.ts @@ -27,7 +27,7 @@ export default class Players extends Plugin { const window = new PlayerWindow(login); window.size = { width: 195, height: 95 }; window.title = "Players"; - window.setItems(tmc.players.get()); + window.setItems(tmc.players.getAll()); window.setColumns([ { key: "nickname", title: "Nickname", width: 50 }, { key: "login", title: "Login", width: 50, type:"entry" }, diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index e080bd8..2807fa9 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -1,4 +1,4 @@ -import { type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite'; +import { type BetterSQLite3Database } from 'drizzle-orm/bun-sqlite'; import Plugin from "core/plugins"; import { Score } from "core/schemas/scores"; import { Player } from "core/schemas/players"; @@ -38,7 +38,7 @@ export class Record { export default class Records extends Plugin { static depends: string[] = ["database"]; - db: BunSQLiteDatabase | null = null; + db: BetterSQLite3Database | null = null; records: Record[] = []; currentMapUid: string = ""; limit: number = 100; diff --git a/core/plugins/tmnf/dedimania/index.ts b/core/plugins/tmnf/dedimania/index.ts index 5d6b504..2158e9f 100644 --- a/core/plugins/tmnf/dedimania/index.ts +++ b/core/plugins/tmnf/dedimania/index.ts @@ -116,9 +116,9 @@ export default class Dedimania extends Plugin { SrvIP: "127.0.0.1", SrvPort: "2350", XmlRpcPort: "5000", - NumPlayers: tmc.players.get().filter((pl: Player) => !pl.isSpectator).length, + NumPlayers: tmc.players.getAll().filter((pl: Player) => !pl.isSpectator).length, MaxPlayers: serverInfo.CurrentMaxPlayers, - NumSpectators: tmc.players.get().filter((pl: Player) => pl.isSpectator).length, + NumSpectators: tmc.players.getAll().filter((pl: Player) => pl.isSpectator).length, MaxSpectators: serverInfo.CurrentMaxSpectators, LadderMode: serverInfo.LadderMode, NextFiveUID: "", @@ -271,9 +271,9 @@ export default class Dedimania extends Plugin { SrvIP: "127.0.0.1", SrvPort: "2350", XmlRpcPort: "5000", - NumPlayers: tmc.players.get().filter((pl: Player) => !pl.isSpectator).length, + NumPlayers: tmc.players.getAll().filter((pl: Player) => !pl.isSpectator).length, MaxPlayers: serverInfo.CurrentMaxPlayers, - NumSpectators: tmc.players.get().filter((pl: Player) => pl.isSpectator).length, + NumSpectators: tmc.players.getAll().filter((pl: Player) => pl.isSpectator).length, MaxSpectators: serverInfo.CurrentMaxSpectators, LadderMode: serverInfo.LadderMode, NextFiveUID: "", @@ -288,7 +288,7 @@ export default class Dedimania extends Plugin { async getDedimaniaPlayers() { const out = []; - for (let player of tmc.players.get()) { + for (let player of tmc.players.getAll()) { out.push({ Login: player.login, NickName: player.nickname, diff --git a/core/plugins/widgets/checkpoints/index.ts b/core/plugins/widgets/checkpoints/index.ts index 7f4c116..0e3b3df 100644 --- a/core/plugins/widgets/checkpoints/index.ts +++ b/core/plugins/widgets/checkpoints/index.ts @@ -57,7 +57,7 @@ export default class Checkpoints extends Plugin { } async onHideWidget(data: any) { - const players = tmc.players.get(); + const players = tmc.players.getAll(); for (const player of players) { if (this.widgets[player.login]) { await this.widgets[player.login].hide(); @@ -67,7 +67,7 @@ export default class Checkpoints extends Plugin { async onBeginMap(data: any) { this.checkpointCounter = {}; - const players = tmc.players.get(); + const players = tmc.players.getAll(); for (const player of players) { this.checkpointCounter[player.login] = 0; await this.onPlayerConnect(player); diff --git a/core/server.ts b/core/server.ts index 8845964..b4a3c76 100644 --- a/core/server.ts +++ b/core/server.ts @@ -1,5 +1,5 @@ import { GbxClient } from "./gbx"; -import EventEmitter from "events"; +import EventEmitter from "node:events"; /** * Server class */ diff --git a/core/ui/manialink.ts b/core/ui/manialink.ts index 0409053..f873813 100644 --- a/core/ui/manialink.ts +++ b/core/ui/manialink.ts @@ -41,11 +41,11 @@ export default class Manialink { */ render(): string { if (this._templateData == "") { - this._templateData = fs.readFileSync(import.meta.dir + "/../../" + this.template, 'utf-8'); + this._templateData = fs.readFileSync(process.cwd() + "/" + this.template, 'utf-8'); } const template = Twig.twig({ - base: import.meta.dir + "/../../", - path: import.meta.dir + "/../../", + base: process.cwd() + "/", + path: process.cwd() + "/", data: this._templateData, async: false, options: { diff --git a/core/uimanager.ts b/core/uimanager.ts index 651a658..389b60c 100644 --- a/core/uimanager.ts +++ b/core/uimanager.ts @@ -270,7 +270,7 @@ export default class UiManager { await tmc.server.send("SendDisplayManialinkPageToLogin", manialink.recipient, xml, 0, false,); } else { if (this.hiddenManialinks.length > 0) { - const logins = tmc.players.get().map((player) => player.login); + const logins = tmc.players.getAll().map((player) => player.login); const recipients = logins.filter((login) => !this.hiddenManialinks.includes(login)); await tmc.server.send("SendDisplayManialinkPageToLogin", recipients.join(","), xml, 0, false,); } else { @@ -293,7 +293,7 @@ export default class UiManager { } } else { if (this.hiddenManialinks.length > 0) { - const logins = tmc.players.get().map((player) => player.login); + const logins = tmc.players.getAll().map((player) => player.login); const recipients = logins.filter((login) => !this.hiddenManialinks.includes(login)); await tmc.server.send("SendDisplayManialinkPageToLogin", recipients.join(","), xml, 0, false); } else { @@ -343,7 +343,6 @@ export default class UiManager { } } } - Bun.gc(true); } /** diff --git a/documentation/devs/concept.md b/documentation/devs/concept.md index b063a67..9dbff96 100644 --- a/documentation/devs/concept.md +++ b/documentation/devs/concept.md @@ -6,9 +6,6 @@ PHP5 support has been dropped some while ago and attempts to get it running on e On key idea as well is to use same plugins code for all the games. This is due NADEO been kindly enough to keep the Dedicated server API quite the same all these years, kudos to them! So with a few adapters built-in it is very possible to build a plugin system running same code for all these games. Also this is not my first attempt to build a server controller, actually this is my 4th controller project, so i hope to have learnt something from the past projects. Previous attempts been: MLEPP, Expansion and Expansion2, you prolly can find these at github, they're all aswell open sourced. -## Typescript and Bun -The MINIcontrol is coded usign typescript, and I just lately changed to use Bun over Nodejs since it's even faster than node runtime. - ## Core Core of the controller itself doesn't do much, rather provides a playground for the plugin developers to work with. diff --git a/documentation/users/install.md b/documentation/users/install.md index a8f6121..7eb7703 100644 --- a/documentation/users/install.md +++ b/documentation/users/install.md @@ -1,34 +1,12 @@ -# Install guide - -Let's get started with, due the controller is coded with [Bun](https://bun.sh), you need to run it with a docker or a linux box, there's not yet windows version available. - -## Install Bun - -Type at console: -```bash -curl -fsSL https://bun.sh/install | bash -``` - -Alternative if you have already node adn npm installed, you can say - -```bash -npm i -g bun -``` - -To check your install: type -```bash -bun --version -``` - -## Install MINIcontrol +# Install MINIcontrol You can either use git to update and install initially the controller, or [download a zip](https://github.com/reaby/minicontrol.git) from the github. ```bash -git clone https://github.com/reaby/minicontrol.git +git clone https://github.com/evoesports/minicontrol.git ``` Afterwards go to the controller directory and say: -1. `bun install` +1. `npm install` 2. copy .env.example to .env and configure -3. run `bun start` +3. run `npm start` diff --git a/documentation/users/plugins.md b/documentation/users/plugins.md index 8bc16de..de3fe89 100644 --- a/documentation/users/plugins.md +++ b/documentation/users/plugins.md @@ -108,7 +108,6 @@ Provides mapslist for the server. | Command | Description | |:--- |:--- | -|`/maps` | show maplist | |`/list` | show maplist | # MapWidget diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ca430d9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2751 @@ +{ + "name": "minicontrol", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "better-sqlite3": "^11.1.1", + "dependency-graph": "1.0.0", + "drizzle-kit": "^0.20.18", + "drizzle-orm": "0.30.6", + "iomem": "1.5.10", + "tm-essentials": "^1.0.5", + "twig": "^1.17.1", + "xmlrpc": "1.3.2" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.10", + "@types/node": "^20.14.9", + "@types/twig": "1.12.16", + "@types/xmlrpc": "^1.3.10", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "casual": "1.6.2", + "eslint": "8.57.0", + "eslint-plugin-drizzle": "^0.2.3" + }, + "peerDependencies": { + "typescript": "^5.5.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.7", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hono/node-server": { + "version": "1.11.4", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.2.2", + "license": "MIT", + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.19.1" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.10", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz", + "integrity": "sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==", + "devOptional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "devOptional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/twig": { + "version": "1.12.16", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/xmlrpc": { + "version": "1.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.1.1.tgz", + "integrity": "sha512-bAlQQb7gwCgxNpDYafK0O4AaIOiTwA7srfqRtBbw0Nsiq6P+qxEYGl3hLw+9C5jX2FVjKW7oxkSouxlJ+3VX8A==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/bun-types": { + "version": "1.1.14", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "node_modules/bun-types/node_modules/@types/node": { + "version": "20.12.14", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/casual": { + "version": "1.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mersenne-twister": "^1.0.1", + "moment": "^2.15.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/cli-color": { + "version": "2.0.3", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/connection-parse": { + "version": "0.0.7", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "dependencies": { + "heap": ">= 0.2.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dreamopt": { + "version": "0.8.0", + "dependencies": { + "wordwrap": ">=0.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.20.18", + "license": "MIT", + "dependencies": { + "@esbuild-kit/esm-loader": "^2.5.5", + "@hono/node-server": "^1.9.0", + "@hono/zod-validator": "^0.2.0", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "commander": "^9.4.1", + "env-paths": "^3.0.0", + "esbuild": "^0.19.7", + "esbuild-register": "^3.5.0", + "glob": "^8.1.0", + "hanji": "^0.0.5", + "hono": "^4.1.4", + "json-diff": "0.9.0", + "minimatch": "^7.4.3", + "semver": "^7.5.4", + "superjson": "^2.2.1", + "zod": "^3.20.2" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/drizzle-kit/node_modules/commander": { + "version": "9.5.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/drizzle-kit/node_modules/minimatch": { + "version": "7.4.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/drizzle-kit/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/drizzle-orm": { + "version": "0.30.6", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=3", + "@electric-sql/pglite": ">=0.1.1", + "@libsql/client": "*", + "@neondatabase/serverless": ">=0.1", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/react": ">=18", + "@types/sql.js": "*", + "@vercel/postgres": "*", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=13.2.0", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "react": ">=18", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "react": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-register": { + "version": "3.5.0", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-drizzle": { + "version": "0.2.3", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "license": "ISC" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.16.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "license": "Apache2" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hanji": { + "version": "0.0.5", + "license": "ISC", + "dependencies": { + "lodash.throttle": "^4.1.1", + "sisteransi": "^1.0.5" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashring": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "connection-parse": "0.0.x", + "simple-lru-cache": "0.0.x" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "license": "MIT" + }, + "node_modules/hono": { + "version": "4.4.8", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/iomem": { + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "hashring": "^3.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "4.1.16", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-diff": { + "version": "0.9.0", + "license": "MIT", + "dependencies": { + "cli-color": "^2.0.0", + "difflib": "~0.2.1", + "dreamopt": "~0.8.0" + }, + "bin": { + "json-diff": "bin/json-diff.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locutus": { + "version": "2.0.16", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mersenne-twister": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/moment": { + "version": "2.30.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/node-abi": { + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sax": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.6.0", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-lru-cache": { + "version": "0.0.2" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "license": "ISC", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tm-essentials": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tm-essentials/-/tm-essentials-1.0.5.tgz", + "integrity": "sha512-l759+mgcL4ZdpQRkRMHDb3JtZehNVkaO6J0C+xxunhGz7h+064FopqbGBBh+y0XFSx8zO2q83lsa9X41nAp/yg==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/twig": { + "version": "1.17.1", + "license": "BSD-2-Clause", + "dependencies": { + "@babel/runtime": "^7.8.4", + "locutus": "^2.0.11", + "minimatch": "3.0.x", + "walk": "2.3.x" + }, + "bin": { + "twigjs": "bin/twigjs" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/twig/node_modules/minimatch": { + "version": "3.0.8", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "devOptional": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/walk": { + "version": "2.3.15", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "8.2.2", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlrpc": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "sax": "1.2.x", + "xmlbuilder": "8.2.x" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.0.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json index 483e7fe..3308760 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "scripts": { - "dev": "drizzle-kit generate:sqlite --config=drizzle.config.ts && bun --env-file=.env --smol --watch run core/minicontrol.ts", - "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.ts && bun --env-file=.env2 --smol --watch run core/minicontrol.ts", - "debug": "bun --inspect=9229 --smol core/minicontrol.ts", - "start": "drizzle-kit generate:sqlite --config=drizzle.config.ts && bun --smol core/minicontrol.ts", - "start2": "drizzle-kit generate:sqlite --config=drizzle.config.ts && bun --env-file=.env2 --smol core/minicontrol.ts", - "build": "bun build ./core/minicontrol.ts --compile --minify --outfile ../test/minicontrol", + "dev": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env --watch run core/minicontrol.ts", + "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env2 --watch run core/minicontrol.ts", + "start": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env core/minicontrol.ts", + "start2": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env2 core/minicontrol.ts", "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.ts && pm2 start --interpreter ~/.bun/bin/bun --smol core/minicontrol.ts" }, + "type": "module", "dependencies": { + "better-sqlite3": "^11.1.1", "dependency-graph": "1.0.0", "drizzle-kit": "^0.20.18", "drizzle-orm": "0.30.6", @@ -18,7 +18,8 @@ "xmlrpc": "1.3.2" }, "devDependencies": { - "@types/bun": "^1.1.5", + "@types/better-sqlite3": "^7.6.10", + "@types/node": "^20.14.9", "@types/twig": "1.12.16", "@types/xmlrpc": "^1.3.10", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -28,6 +29,6 @@ "eslint-plugin-drizzle": "^0.2.3" }, "peerDependencies": { - "typescript": "^5.3.3" + "typescript": "^5.5.2" } } diff --git a/tools/xaseco.ts b/tools/xaseco.ts index 9eb72eb..b4ee513 100644 --- a/tools/xaseco.ts +++ b/tools/xaseco.ts @@ -1,9 +1,10 @@ -import Database from 'bun:sqlite'; +import Database from 'better-sqlite3'; import { readFileSync } from 'fs'; async function main() { const sqlite = new Database(__dirname + '/../userdata/local.sqlite'); + sqlite.pragma('journal_mode = WAL'); const xasecoDb = new Database(":memory:"); if (process.argv.length < 3) { console.log("Usage: bun xaseco.ts "); @@ -26,28 +27,28 @@ async function main() { console.log("Migrating XAseco database to MINIcontrol..."); console.log("Please wait and do not interrupt the process..."); console.log("Processing maps...") - const dbMaps: any = xasecoDb.query("SELECT * FROM challenges").all(); + const dbMaps: any = xasecoDb.prepare("SELECT * FROM challenges").all(); console.log("Total: " + dbMaps.length); for (const map of dbMaps) { maps[map.Id] = map.Uid; sqlite.exec(`INSERT OR IGNORE INTO map ("uuid", "name", "author", "author_time", "environment") VALUES ('${map.Uid}', '${map.Name}', '${map.Author}', -1, '${map.Environment}')`); } console.log("Processing players..."); - const dbPlayers: any = xasecoDb.query("SELECT * FROM players").all(); + const dbPlayers: any = xasecoDb.prepare("SELECT * FROM players").all(); console.log("Total: " + dbPlayers.length); for (const player of dbPlayers) { players[player.Id] = player.Login; sqlite.exec(`INSERT OR IGNORE INTO player (login, nickname, custom_nick, nick_override, created_at, updated_at) VALUES ('${player.Login}', '${player.NickName}', '', 1, '${player.UpdatedAt}', '${player.UpdatedAt}')`); } console.log("Processing records..."); - const dbRecords: any = xasecoDb.query("SELECT * FROM records").all(); + const dbRecords: any = xasecoDb.prepare("SELECT * FROM records").all(); console.log("Total: " + dbRecords.length); for (const record of dbRecords) { if (!players[record.PlayerId]) continue; sqlite.exec(`INSERT OR IGNORE INTO records (map_uuid, player, time, checkpoints, avg_time, finishes, created_at, updated_at) VALUES ('${maps[record.ChallengeId]}', '${players[record.PlayerId]}', ${record.Score}, '${record.Checkpoints}', 0, 1, '${record.CreatedAt}', '${record.UpdatedAt}')`); } console.log("Processing karma..."); - const dbKarma: any = xasecoDb.query("SELECT * FROM rs_karma").all(); + const dbKarma: any = xasecoDb.prepare("SELECT * FROM rs_karma").all(); console.log("Total: " + dbKarma.length); for (const k of dbKarma) { if (!players[k.PlayerId]) continue; diff --git a/tsconfig.json b/tsconfig.json index 8722e60..ad6e8d6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,18 +7,15 @@ "jsx": "react-jsx", "allowJs": true, "preserveSymlinks": true, - /* Bundler mode */ "moduleResolution": "Bundler", "allowImportingTsExtensions": true, "verbatimModuleSyntax": true, "noEmit": true, - - /* Linting */ - "skipLibCheck": true, + "skipLibCheck": false, "strict": true, "noFallthroughCasesInSwitch": true, "forceConsistentCasingInFileNames": true, - //"rootDir": ".", + "rootDir": ".", "baseUrl": "./", "paths": { "core/*": ["core/*"], From 506b4c4bc0729d1111715ab8b2da06210d978980 Mon Sep 17 00:00:00 2001 From: reaby Date: Fri, 28 Jun 2024 23:37:58 +0300 Subject: [PATCH 02/35] database fixes --- core/plugins/database/index.ts | 48 +++++- core/plugins/records/index.ts | 206 +++++++++++++------------ core/schemas/scores.ts | 2 +- drizzle.config.ts => drizzle.config.js | 6 +- package.json | 10 +- 5 files changed, 161 insertions(+), 111 deletions(-) rename drizzle.config.ts => drizzle.config.js (63%) diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index b062726..6fc70c1 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -1,11 +1,12 @@ import { drizzle, type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; import Database from 'better-sqlite3'; -import { eq } from "drizzle-orm"; +import { eq, inArray, sql } from "drizzle-orm"; import type { Logger } from 'drizzle-orm/logger'; import type { Player as PlayerType } from 'core/playermanager'; import { Player } from 'core/schemas/players'; import Plugin from 'core/plugins'; +import { Map as DbMap } from 'core/schemas/map'; class SqliteLogger implements Logger { logQuery(query: string, params: unknown[]): void { @@ -18,7 +19,7 @@ export default class SqliteDb extends Plugin { async onLoad() { const sqlite = new Database(process.cwd() + '/userdata/local.sqlite'); const client = drizzle(sqlite, { - logger: new SqliteLogger() + logger: new SqliteLogger() }); console.log("Running Migrates..."); try { @@ -33,6 +34,7 @@ export default class SqliteDb extends Plugin { tmc.storage['sqlite'] = client; tmc.cli("¤success¤Database connected."); tmc.server.addListener("TMC.PlayerConnect", this.onPlayerConnect, this); + tmc.server.addListener("Trackmania.MapListModified", this.onMapListModified, this); } async onUnload() { @@ -45,6 +47,7 @@ export default class SqliteDb extends Plugin { async onStart() { await this.syncPlayers(); + await this.syncMaps(); } async onPlayerConnect(player: any) { @@ -78,4 +81,45 @@ export default class SqliteDb extends Plugin { await this.syncPlayer(await tmc.players.getPlayer(player.login)); } } + + async onMapListModified(data: any) { + if (data[2] === true) { + await this.syncMaps(); + } + } + + async syncMaps() { + if (!tmc.storage['sqlite']) return; + const db: BetterSQLite3Database = tmc.storage['sqlite']; + + const serverUids = tmc.maps.getUids(); + const result = await db.select().from(DbMap).where(inArray(DbMap.uuid, serverUids)).all(); + const dbUids = result.map((value) => value.uuid); + const missingUids = serverUids.filter(item => dbUids.indexOf(item) < 0); + let missingMaps: any[] = []; + + for (const uid of missingUids) { + const map = tmc.maps.getMap(uid); + if (!map) continue; + const outMap = { + uuid: map.UId, + name: map.Name, + author: map.Author, + authorNickname: map.AuthorNickname ?? "", + authorTime: map.AuthorTime, + environment: map.Environnement, + created_at: sql`CURRENT_TIMESTAMP`, + updated_at: sql`CURRENT_TIMESTAMP`, + }; + missingMaps.push(outMap); + } + try { + if (missingMaps.length > 0) + await db.insert(DbMap).values(missingMaps); + } catch (e: any) { + tmc.cli(`¤error¤` + e.message); + } + } + + } \ No newline at end of file diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index 2807fa9..6adf63d 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -1,4 +1,4 @@ -import { type BetterSQLite3Database } from 'drizzle-orm/bun-sqlite'; +import { type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; import Plugin from "core/plugins"; import { Score } from "core/schemas/scores"; import { Player } from "core/schemas/players"; @@ -121,10 +121,10 @@ export default class Records extends Plugin { createdAt: Score.createdAt, updatedAt: Score.updatedAt, }).from(Score).leftJoin(Player, eq(Score.login, Player.login)).where(eq(Score.mapUuid, mapUuid)).orderBy(asc(Score.time), asc(Score.updatedAt)).all(); - + this.records = []; let rank = 1; - for (const score of scores) { + for (const score of scores) { score.rank = rank; this.records.push(new Record().fromScore(score)); rank += 1; @@ -172,114 +172,118 @@ export default class Records extends Plugin { } async onPlayerFinish(data: any) { - const login = data[0]; - if (this.records.length == 0) { - let ranking = await this.getRankingsForLogin(data); - const newRecord = new Record().fromScore({ - login: login, - nickname: removeLinks(ranking.NickName), - time: ranking.BestTime, - avgTime: ranking.BestTime, - totalFinishes: 1, - checkpoints: ranking.BestCheckpoints.join(","), - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), - }); - newRecord.rank = 1; - this.records.push(newRecord); - await this.db?.insert(Score).values({ - login: newRecord.login, - time: newRecord.time, - avgTime: newRecord.avgTime, - totalFinishes: newRecord.totalFinishes, - checkpoints: newRecord.checkpoints, - createdAt: newRecord.createdAt, - updatedAt: newRecord.updatedAt, - mapUuid: this.currentMapUid - }); - tmc.server.emit("Plugin.Records.onNewRecord", { - oldRecord: null, - record: clone(newRecord || {}), - records: clone(this.records) - }); - return; - } + try { + const login = data[0]; + if (this.records.length == 0) { + let ranking = await this.getRankingsForLogin(data); + const newRecord = new Record().fromScore({ + login: login, + nickname: removeLinks(ranking.NickName), + time: ranking.BestTime, + avgTime: ranking.BestTime, + totalFinishes: 1, + checkpoints: ranking.BestCheckpoints.join(","), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }); + newRecord.rank = 1; + this.records.push(newRecord); + await this.db?.insert(Score).values({ + login: newRecord.login, + time: newRecord.time, + avgTime: newRecord.avgTime, + totalFinishes: newRecord.totalFinishes, + checkpoints: newRecord.checkpoints, + createdAt: newRecord.createdAt, + updatedAt: newRecord.updatedAt, + mapUuid: this.currentMapUid + }); + tmc.server.emit("Plugin.Records.onNewRecord", { + oldRecord: null, + record: clone(newRecord || {}), + records: clone(this.records) + }); + return; + } - const lastIndex = this.records.length > this.limit ? this.limit : this.records.length; - const lastRecord = this.records[lastIndex - 1]; + const lastIndex = this.records.length > this.limit ? this.limit : this.records.length; + const lastRecord = this.records[lastIndex - 1]; - let ranking = await this.getRankingsForLogin(data); + let ranking = await this.getRankingsForLogin(data); - if (lastIndex >= this.limit && ranking.BestTime >= lastRecord.time) return; - const time = ranking.BestTime; - const oldRecord = this.records.find(r => r.login === login); - if (oldRecord) { - if (ranking.BestTime >= oldRecord.time) return; - if (time < oldRecord.time) { - const newRecord = clone(oldRecord); - newRecord.nickname = removeLinks(ranking.NickName); - newRecord.avgTime = newRecord.avgTime + (time - newRecord.avgTime) / newRecord.totalFinishes; - newRecord.time = ranking.BestTime; - newRecord.checkpoints = ranking.BestCheckpoints.join(","); - newRecord.totalFinishes++; - newRecord.updatedAt = new Date().toISOString(); - await this.db?.update(Score).set({ + if (lastIndex >= this.limit && ranking.BestTime >= lastRecord.time) return; + const time = ranking.BestTime; + const oldRecord = this.records.find(r => r.login === login); + if (oldRecord) { + if (ranking.BestTime >= oldRecord.time) return; + if (time < oldRecord.time) { + const newRecord = clone(oldRecord); + newRecord.nickname = removeLinks(ranking.NickName); + newRecord.avgTime = newRecord.avgTime + (time - newRecord.avgTime) / newRecord.totalFinishes; + newRecord.time = ranking.BestTime; + newRecord.checkpoints = ranking.BestCheckpoints.join(","); + newRecord.totalFinishes++; + newRecord.updatedAt = new Date().toISOString(); + await this.db?.update(Score).set({ + time: newRecord.time, + avgTime: newRecord.avgTime, + checkpoints: newRecord.checkpoints, + totalFinishes: newRecord.totalFinishes, + updatedAt: newRecord.updatedAt + }).where(and(eq(Score.login, login), eq(Score.mapUuid, this.currentMapUid))); + this.records[this.records.findIndex(r => r.login === login)] = newRecord; + } + } else { + const newRecord = new Record().fromScore({ + login: login, + nickname: removeLinks(ranking.NickName), + time: ranking.BestTime, + avgTime: ranking.BestTime, + totalFinishes: 1, + checkpoints: ranking.BestCheckpoints.join(","), + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }); + this.records.push(newRecord); + await this.db?.insert(Score).values({ + login: newRecord.login, time: newRecord.time, avgTime: newRecord.avgTime, - checkpoints: newRecord.checkpoints, totalFinishes: newRecord.totalFinishes, - updatedAt: newRecord.updatedAt - }).where(and(eq(Score.login, login), eq(Score.mapUuid, this.currentMapUid))); - this.records[this.records.findIndex(r => r.login === login)] = newRecord; + checkpoints: newRecord.checkpoints, + createdAt: newRecord.createdAt, + updatedAt: newRecord.updatedAt, + mapUuid: this.currentMapUid + }); } - } else { - const newRecord = new Record().fromScore({ - login: login, - nickname: removeLinks(ranking.NickName), - time: ranking.BestTime, - avgTime: ranking.BestTime, - totalFinishes: 1, - checkpoints: ranking.BestCheckpoints.join(","), - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), + // Sort records + this.records.sort((a, b) => { + if (a.time === b.time) { + return a.updatedAt.localeCompare(b.updatedAt); + } + return a.time - b.time; }); - this.records.push(newRecord); - await this.db?.insert(Score).values({ - login: newRecord.login, - time: newRecord.time, - avgTime: newRecord.avgTime, - totalFinishes: newRecord.totalFinishes, - checkpoints: newRecord.checkpoints, - createdAt: newRecord.createdAt, - updatedAt: newRecord.updatedAt, - mapUuid: this.currentMapUid - }); - } - // Sort records - this.records.sort((a, b) => { - if (a.time === b.time) { - return a.updatedAt.localeCompare(b.updatedAt); - } - return a.time - b.time; - }); - // Update ranks - let newRecord = {}; - for (let i = 0; i < this.records.length; i++) { - this.records[i].rank = i + 1; - if (this.records[i].login === login) { - newRecord = this.records[i]; - } - if (i >= this.limit) { - tmc.cli(`Deleting record ${i} because it's out of limit.`); - await this.db?.delete(Score).where(and(eq(Score.login, this.records[i].login), eq(Score.mapUuid, this.currentMapUid))); + // Update ranks + let newRecord = {}; + for (let i = 0; i < this.records.length; i++) { + this.records[i].rank = i + 1; + if (this.records[i].login === login) { + newRecord = this.records[i]; + } + if (i >= this.limit) { + tmc.cli(`Deleting record ${i} because it's out of limit.`); + await this.db?.delete(Score).where(and(eq(Score.login, this.records[i].login), eq(Score.mapUuid, this.currentMapUid))); + } } + this.records = this.records.slice(0, this.limit); + tmc.server.emit("Plugin.Records.onUpdateRecord", { + oldRecord: clone(oldRecord || {}), + record: clone(newRecord), + records: clone(this.records) + }); + } catch (e: any) { + console.log(e); } - this.records = this.records.slice(0, this.limit); - tmc.server.emit("Plugin.Records.onUpdateRecord", { - oldRecord: clone(oldRecord || {}), - record: clone(newRecord), - records: clone(this.records) - }); } } \ No newline at end of file diff --git a/core/schemas/scores.ts b/core/schemas/scores.ts index 899d170..e4e40db 100644 --- a/core/schemas/scores.ts +++ b/core/schemas/scores.ts @@ -6,7 +6,7 @@ import { Map } from "./map"; export const Score = sqliteTable("records", { mapUuid: text("map_uuid").notNull().references(() => Map.uuid), - login: text("player").notNull().references(() => player.login), + login: text("login").notNull().references(() => player.login), time: integer("time").notNull(), checkpoints: text("checkpoints").notNull(), avgTime: integer("avg_time").default(0), diff --git a/drizzle.config.ts b/drizzle.config.js similarity index 63% rename from drizzle.config.ts rename to drizzle.config.js index 84d0111..5ef9f62 100644 --- a/drizzle.config.ts +++ b/drizzle.config.js @@ -1,9 +1,11 @@ -import type { Config } from "drizzle-kit"; +import { Config } from "drizzle-kit"; +/** @type { import("drizzle-kit").Config } */ export default { + dialect: "sqlite", schema: ["./core/schemas/*.ts", "./userdata/schemas/*.ts"], out: "./userdata/drizzle", dbCredentials: { url: "sqlite://userdata/local.sqlite", } -} satisfies Config; +} \ No newline at end of file diff --git a/package.json b/package.json index 3308760..f3677e7 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "scripts": { - "dev": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env --watch run core/minicontrol.ts", - "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env2 --watch run core/minicontrol.ts", - "start": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env core/minicontrol.ts", - "start2": "drizzle-kit generate:sqlite --config=drizzle.config.ts && tsx --env-file=.env2 core/minicontrol.ts", - "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.ts && pm2 start --interpreter ~/.bun/bin/bun --smol core/minicontrol.ts" + "dev": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env --watch run core/minicontrol.ts", + "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", + "start": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", + "start2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", + "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.js && pm2 start --interpreter ~/.bun/bin/bun --smol core/minicontrol.ts" }, "type": "module", "dependencies": { From cd7f8da3d478a03e79b69a16a6f4e7aa3ef1206d Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 29 Jun 2024 08:40:41 +0300 Subject: [PATCH 03/35] disallow Windows platforms to start minicontrol --- core/minicontrol.ts | 9 ++++++ package.json | 69 +++++++++++++++++++++++---------------------- tsconfig.json | 3 +- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 15ce51b..bed6a2d 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -10,6 +10,13 @@ import fs from 'fs'; import Plugin from 'core/plugins'; import path from 'path'; import { DepGraph } from "dependency-graph"; +import os from 'node:os'; +const platform = os.platform(); +if (platform.startsWith("win")) { + log.info("\n\nSorry, but MINIcontrol currently $f00not supported $zon Windows platforms."); + log.info("Please use WSL or Docker to run MINIcontrol.") + process.exit(1); +} export interface GameStruct { Name: string; @@ -17,6 +24,8 @@ export interface GameStruct { Build?: string; } + + /** * MiniControl class */ diff --git a/package.json b/package.json index f3677e7..7006f47 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,37 @@ { - "scripts": { - "dev": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env --watch run core/minicontrol.ts", - "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", - "start": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", - "start2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", - "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.js && pm2 start --interpreter ~/.bun/bin/bun --smol core/minicontrol.ts" - }, - "type": "module", - "dependencies": { - "better-sqlite3": "^11.1.1", - "dependency-graph": "1.0.0", - "drizzle-kit": "^0.20.18", - "drizzle-orm": "0.30.6", - "iomem": "1.5.10", - "tm-essentials": "^1.0.5", - "twig": "^1.17.1", - "xmlrpc": "1.3.2" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.10", - "@types/node": "^20.14.9", - "@types/twig": "1.12.16", - "@types/xmlrpc": "^1.3.10", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "casual": "1.6.2", - "eslint": "8.57.0", - "eslint-plugin-drizzle": "^0.2.3" - }, - "peerDependencies": { - "typescript": "^5.5.2" - } -} + "scripts": { + "dev": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env --watch run core/minicontrol.ts", + "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", + "start": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", + "start2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", + "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.js && pm2 start core/minicontrol.ts" + }, + "type": "module", + "resolutions": { + + }, + "dependencies": { + "better-sqlite3": "^11.1.1", + "dependency-graph": "1.0.0", + "drizzle-kit": "^0.20.18", + "drizzle-orm": "0.30.6", + "iomem": "1.5.10", + "tm-essentials": "^1.0.5", + "twig": "^1.17.1", + "xmlrpc": "1.3.2", + "tsx": "^4.15.8" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.10", + "@types/node": "^20.14.9", + "@types/twig": "1.12.16", + "@types/xmlrpc": "^1.3.10", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "eslint": "8.57.0", + "eslint-plugin-drizzle": "^0.2.3" + }, + "peerDependencies": { + "typescript": "^5.5.2" + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index ad6e8d6..9240981 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,11 +15,12 @@ "strict": true, "noFallthroughCasesInSwitch": true, "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, "rootDir": ".", "baseUrl": "./", "paths": { "core/*": ["core/*"], "schemas/*": ["core/schemas/*"] - }, + } } } \ No newline at end of file From 0707284efadde35871bd76b15002661a31d6811f Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 29 Jun 2024 08:41:30 +0300 Subject: [PATCH 04/35] fix --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index 7006f47..74d4fe1 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,6 @@ "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.js && pm2 start core/minicontrol.ts" }, "type": "module", - "resolutions": { - - }, "dependencies": { "better-sqlite3": "^11.1.1", "dependency-graph": "1.0.0", From c1e38e29a6308e42171ba7cb83508d001ba0fc5c Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 29 Jun 2024 14:57:55 +0300 Subject: [PATCH 05/35] implement endwu for tm2020 --- core/plugins/admin/index.ts | 11 +++++++++-- core/server.ts | 8 +++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/plugins/admin/index.ts b/core/plugins/admin/index.ts index 5f49cf0..41e7f77 100644 --- a/core/plugins/admin/index.ts +++ b/core/plugins/admin/index.ts @@ -248,12 +248,19 @@ export default class AdminPlugin extends Plugin { } }, "Calls server method"); tmc.addCommand("//wu", async (login: string, params: string[]) => { - tmc.server.send("SetWarmUp", true); + if (tmc.game.Name == "TmForever") { + tmc.server.send("SetWarmUp", true); + } }, "Starts warmup"); tmc.addCommand("//endwu", async (login: string, params: string[]) => { - tmc.server.send("SetWarmUp", false); + if (tmc.game.Name == "TmForever") { + tmc.server.send("SetWarmUp", false); + } else { + tmc.server.callScript("Trackmania.WarmUp.ForceStop"); + } }, "end warmup"); + tmc.addCommand("//addlocal", this.cmdAddLocal.bind(this), "Adds local map to playlist"); tmc.addCommand("//modecommand", async (login: string, params: string[]) => { if (!params[0]) { diff --git a/core/server.ts b/core/server.ts index b4a3c76..bc3962a 100644 --- a/core/server.ts +++ b/core/server.ts @@ -8,12 +8,14 @@ export default class Server { * GbxClient instance */ gbx: GbxClient + + /** @ignore */ events: EventEmitter = new EventEmitter(); - /** - * method overrides - */ + /** @ignore */ methodOverrides: { [key: string]: CallableFunction } = {}; + /** @ignore */ scriptCalls: { [key: string]: Promise } = {}; + login: string = ""; name: string = ""; From 4d1ef2e6db05e5fc121b3915c020508263af3f23 Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 29 Jun 2024 15:06:11 +0300 Subject: [PATCH 06/35] implement timeout for xmlrpc connection --- core/gbx/index.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core/gbx/index.ts b/core/gbx/index.ts index dcfb6b9..6e0ea87 100644 --- a/core/gbx/index.ts +++ b/core/gbx/index.ts @@ -22,6 +22,7 @@ export class GbxClient { showErrors: false, throwErrors: true, }; + timeoutHandler:any; promiseCallbacks: { [key: string]: any } = {}; /** @@ -55,12 +56,16 @@ export class GbxClient { port = port || 5000; const that = this; const socket = new Socket(); + const timeout = 5000; this.socket = socket; socket.connect({ host: host, port: port, keepAlive: true, }, () => { + socket.on("connect", () => { + clearTimeout(this.timeoutHandler); + }); socket.on("end", () => { that.isConnected = false; that.server.onDisconnect("end"); @@ -72,13 +77,16 @@ export class GbxClient { socket.on("data", (data: Buffer) => { that.handleData(data); }); - socket.on("timeout", () => { tmc.cli("¤error¤XMLRPC Connection timeout"); process.exit(1); }); }); - + this.timeoutHandler = setTimeout(() => { + tmc.cli("¤error¤[ERROR] Attempt at connection exceeded timeout value."); + socket.end(); + process.exit(1); + }, timeout); const res: boolean = await new Promise((resolve, reject) => { this.promiseCallbacks['onConnect'] = {resolve, reject}; }); From 77d91d8a5fac8dfd33b0ca1fd0678a3f5a5911f8 Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 29 Jun 2024 15:53:08 +0300 Subject: [PATCH 07/35] process new maps for database in chunks --- core/gbx/index.ts | 3 ++- core/plugins/database/index.ts | 49 +++++++++++++++++----------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/core/gbx/index.ts b/core/gbx/index.ts index 6e0ea87..2679db1 100644 --- a/core/gbx/index.ts +++ b/core/gbx/index.ts @@ -64,7 +64,7 @@ export class GbxClient { keepAlive: true, }, () => { socket.on("connect", () => { - clearTimeout(this.timeoutHandler); + clearTimeout(that.timeoutHandler); }); socket.on("end", () => { that.isConnected = false; @@ -75,6 +75,7 @@ export class GbxClient { that.server.onDisconnect(error.message); }); socket.on("data", (data: Buffer) => { + clearTimeout(that.timeoutHandler); that.handleData(data); }); socket.on("timeout", () => { diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index 6fc70c1..16e22cb 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -7,6 +7,7 @@ import type { Player as PlayerType } from 'core/playermanager'; import { Player } from 'core/schemas/players'; import Plugin from 'core/plugins'; import { Map as DbMap } from 'core/schemas/map'; +import { chunkArray } from 'core/utils'; class SqliteLogger implements Logger { logQuery(query: string, params: unknown[]): void { @@ -95,31 +96,31 @@ export default class SqliteDb extends Plugin { const serverUids = tmc.maps.getUids(); const result = await db.select().from(DbMap).where(inArray(DbMap.uuid, serverUids)).all(); const dbUids = result.map((value) => value.uuid); - const missingUids = serverUids.filter(item => dbUids.indexOf(item) < 0); - let missingMaps: any[] = []; + const missingUids = chunkArray(serverUids.filter(item => dbUids.indexOf(item) < 0), 50); + for (const groups of missingUids) { + let missingMaps: any[] = []; + for (const uid of groups) { + const map = tmc.maps.getMap(uid); + if (!map) continue; + const outMap = { + uuid: map.UId, + name: map.Name, + author: map.Author, + authorNickname: map.AuthorNickname ?? "", + authorTime: map.AuthorTime, + environment: map.Environnement, + created_at: sql`CURRENT_TIMESTAMP`, + updated_at: sql`CURRENT_TIMESTAMP`, + }; + missingMaps.push(outMap); + } - for (const uid of missingUids) { - const map = tmc.maps.getMap(uid); - if (!map) continue; - const outMap = { - uuid: map.UId, - name: map.Name, - author: map.Author, - authorNickname: map.AuthorNickname ?? "", - authorTime: map.AuthorTime, - environment: map.Environnement, - created_at: sql`CURRENT_TIMESTAMP`, - updated_at: sql`CURRENT_TIMESTAMP`, - }; - missingMaps.push(outMap); - } - try { - if (missingMaps.length > 0) - await db.insert(DbMap).values(missingMaps); - } catch (e: any) { - tmc.cli(`¤error¤` + e.message); + try { + if (missingMaps.length > 0) + await db.insert(DbMap).values(missingMaps); + } catch (e: any) { + tmc.cli(`¤error¤` + e.message); + } } } - - } \ No newline at end of file From ae42c076ae86fa12972438c4c4f1a34689a3172f Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 29 Jun 2024 16:11:22 +0200 Subject: [PATCH 08/35] Fix MINIcontrol not working on Windows Don't ask how, it's ugly but it works... -.- --- build.ts | 9 - core/gbx/index.ts | 2 +- core/minicontrol.ts | 28 +- core/plugins/admin/LocalMapsWindow.ts | 2 +- core/plugins/admin/ModeSettingsWindow.ts | 4 +- core/plugins/admin/PlayerListsWindow.ts | 2 +- core/plugins/admin/index.ts | 4 +- core/plugins/announces/index.ts | 8 +- core/plugins/chat/index.ts | 2 +- core/plugins/database/index.ts | 10 +- core/plugins/debugtool/index.ts | 6 +- core/plugins/funcommands/index.ts | 2 +- core/plugins/maplikes/index.ts | 4 +- core/plugins/maps/index.ts | 4 +- core/plugins/maps/mapsWindow.ts | 6 +- core/plugins/maps/queueWIndow.ts | 2 +- core/plugins/players/PlayerWindow.ts | 4 +- core/plugins/players/index.ts | 2 +- core/plugins/records/index.ts | 10 +- core/plugins/records/recordsWindow.ts | 6 +- core/plugins/tmnf/coppers/index.ts | 2 +- core/plugins/tmnf/dedimania/index.ts | 8 +- core/plugins/tmnf/freezone/index.ts | 2 +- core/plugins/tmnf/index.ts | 2 +- core/plugins/tmnf/talimit/index.ts | 4 +- core/plugins/tmnf/togglechat/index.ts | 4 +- core/plugins/tmnf/ui/index.ts | 2 +- core/plugins/tmx/index.ts | 2 +- core/plugins/votes/index.ts | 6 +- core/plugins/widgets/bestcps/index.ts | 6 +- core/plugins/widgets/checkpoints/index.ts | 6 +- core/plugins/widgets/dedimania/index.ts | 6 +- core/plugins/widgets/index.ts | 2 +- core/plugins/widgets/map/index.ts | 6 +- core/plugins/widgets/maplikes/index.ts | 6 +- core/plugins/widgets/menu/index.ts | 4 +- core/plugins/widgets/menu/menuWidget.ts | 2 +- core/plugins/widgets/records/index.ts | 6 +- core/ui/confirm.ts | 2 +- core/ui/listwindow.ts | 2 +- package-lock.json | 5958 +++++++++++---------- package.json | 6 +- tsconfig.json | 6 +- 43 files changed, 3316 insertions(+), 2851 deletions(-) delete mode 100644 build.ts diff --git a/build.ts b/build.ts deleted file mode 100644 index 5c953c6..0000000 --- a/build.ts +++ /dev/null @@ -1,9 +0,0 @@ -await Bun.build({ - entrypoints: ['./core/minicontrol.ts'], - root: '.', - outdir: './dist', - target: 'bun', - external: ['core/plugins/*'], - format: "esm", - minify: true, -}); diff --git a/core/gbx/index.ts b/core/gbx/index.ts index 2679db1..76d96c4 100644 --- a/core/gbx/index.ts +++ b/core/gbx/index.ts @@ -1,6 +1,6 @@ import { Buffer } from "node:buffer"; import { Socket } from 'net'; -import type Server from "core/server"; +import type Server from "../../core/server"; import {Readable} from 'stream'; // @ts-ignore import Serializer from "xmlrpc/lib/serializer"; diff --git a/core/minicontrol.ts b/core/minicontrol.ts index bed6a2d..701e28b 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -7,16 +7,16 @@ import SettingsManager from './settingsmanager'; import { processColorString } from './utils'; import log from './log'; import fs from 'fs'; -import Plugin from 'core/plugins'; +import Plugin from './plugins'; import path from 'path'; import { DepGraph } from "dependency-graph"; import os from 'node:os'; const platform = os.platform(); -if (platform.startsWith("win")) { +/*if (platform.startsWith("win")) { log.info("\n\nSorry, but MINIcontrol currently $f00not supported $zon Windows platforms."); log.info("Please use WSL or Docker to run MINIcontrol.") process.exit(1); -} +}*/ export interface GameStruct { Name: string; @@ -135,7 +135,7 @@ class MiniControl { * @returns */ findPlugin(name: string): string | null { - const dirsToCheck = ["core/plugins/", "userdata/plugins/"]; + const dirsToCheck = ["./core/plugins/", "./userdata/plugins/"]; for (const dir of dirsToCheck) { if (fs.existsSync(dir + name + "/index.ts")) { return (dir + name).replaceAll("\\", "/"); @@ -160,7 +160,12 @@ class MiniControl { } return; } - const plugin = await import(process.cwd() + "/" + pluginPath); + let plugin = null; + if(process.platform === "win32") { + plugin = await import("file:///" + process.cwd() + "/" + pluginPath); + } else { + plugin = await import(process.cwd() + "/" + pluginPath); + } if (plugin.default == undefined) { const msg = `¤gray¤Plugin ¤cmd¤${name}¤error¤ failed to load. Plugin has no default export.`; @@ -350,13 +355,13 @@ class MiniControl { async beforeInit() { await this.chatCmd.beforeInit(); // load plugins - let plugins = fs.readdirSync(process.cwd() + "/core/plugins", { withFileTypes: true, recursive: true }); - plugins = plugins.concat(fs.readdirSync(process.cwd() + "/userdata/plugins", { withFileTypes: true, recursive: true })); + let plugins = fs.readdirSync(process.cwd().replaceAll("\\", "/") + "/core/plugins", { withFileTypes: true, recursive: true }); + plugins = plugins.concat(fs.readdirSync(process.cwd().replaceAll("\\", "/") + "/userdata/plugins", { withFileTypes: true, recursive: true })); const exclude = process.env.EXCLUDED_PLUGINS?.split(",") || []; let loadList = []; for (const plugin of plugins) { let include = plugin && plugin.isDirectory(); - const directory = plugin.path.replace(path.resolve("core", "plugins"), "").replace(path.resolve("userdata", "plugins"), ""); + const directory = plugin.parentPath.replaceAll("\\", "/").replace(path.resolve("core", "plugins").replaceAll("\\", "/"), "").replace(path.resolve("userdata", "plugins").replaceAll("\\", "/"), ""); if (include) { let pluginName = plugin.name; if (directory != "") { @@ -383,7 +388,12 @@ class MiniControl { this.cli(msg); continue; } - const cls = await import(process.cwd() + "/" + pluginName); + let cls = null; + if(process.platform === "win32") { + cls = await import("file:///" + process.cwd() + "/" + pluginName); + } else { + cls = await import(process.cwd() + "/" + pluginName); + } const plugin = cls.default; if (plugin == undefined) { const msg = `¤gray¤Plugin ¤cmd¤${name}¤error¤ failed to load. Plugin has no default export.`; diff --git a/core/plugins/admin/LocalMapsWindow.ts b/core/plugins/admin/LocalMapsWindow.ts index fa09138..62b2e78 100644 --- a/core/plugins/admin/LocalMapsWindow.ts +++ b/core/plugins/admin/LocalMapsWindow.ts @@ -1,4 +1,4 @@ -import ListWindow from 'core/ui/listwindow'; +import ListWindow from '../../ui/listwindow'; export default class LocalMapsWindow extends ListWindow { diff --git a/core/plugins/admin/ModeSettingsWindow.ts b/core/plugins/admin/ModeSettingsWindow.ts index 0ca60d4..25c4785 100644 --- a/core/plugins/admin/ModeSettingsWindow.ts +++ b/core/plugins/admin/ModeSettingsWindow.ts @@ -1,5 +1,5 @@ -import ListWindow from "core/ui/listwindow"; -import {castType} from "core/utils"; +import ListWindow from "../../ui/listwindow"; +import {castType} from "../../utils"; export default class ModeSettingsWindow extends ListWindow { diff --git a/core/plugins/admin/PlayerListsWindow.ts b/core/plugins/admin/PlayerListsWindow.ts index 9e738f8..c42ebed 100644 --- a/core/plugins/admin/PlayerListsWindow.ts +++ b/core/plugins/admin/PlayerListsWindow.ts @@ -1,4 +1,4 @@ -import ListWindow from 'core/ui/listwindow'; +import ListWindow from "../../ui/listwindow"; export default class PlayerListWindow extends ListWindow { diff --git a/core/plugins/admin/index.ts b/core/plugins/admin/index.ts index 41e7f77..358448e 100644 --- a/core/plugins/admin/index.ts +++ b/core/plugins/admin/index.ts @@ -1,6 +1,6 @@ -import { castType, escape, removeColors } from "core/utils"; +import { castType, escape, removeColors } from "../../utils"; import ModeSettingsWindow from "./ModeSettingsWindow"; -import Plugin from "core/plugins"; +import Plugin from "../../plugins"; import fs from "fs"; import LocalMapsWindow from "./LocalMapsWindow"; import PlayerListsWindow from "./PlayerListsWindow"; diff --git a/core/plugins/announces/index.ts b/core/plugins/announces/index.ts index 62fb2da..98e1b6f 100644 --- a/core/plugins/announces/index.ts +++ b/core/plugins/announces/index.ts @@ -1,7 +1,7 @@ -import type { Player } from "core/playermanager"; -import Plugin from "core/plugins"; -import type { Record } from "core/plugins/records"; -import { formatTime } from 'core/utils'; +import type { Player } from "../../playermanager"; +import Plugin from "../index"; +import type { Record } from "../records"; +import { formatTime } from '../../utils'; export default class Announces extends Plugin { async onLoad() { diff --git a/core/plugins/chat/index.ts b/core/plugins/chat/index.ts index db3328c..906079f 100644 --- a/core/plugins/chat/index.ts +++ b/core/plugins/chat/index.ts @@ -1,4 +1,4 @@ -import Plugin from 'core/plugins'; +import Plugin from '../index'; export default class Chat extends Plugin { enabled: boolean = false; diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index 16e22cb..f58e8e0 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -3,11 +3,11 @@ import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; import Database from 'better-sqlite3'; import { eq, inArray, sql } from "drizzle-orm"; import type { Logger } from 'drizzle-orm/logger'; -import type { Player as PlayerType } from 'core/playermanager'; -import { Player } from 'core/schemas/players'; -import Plugin from 'core/plugins'; -import { Map as DbMap } from 'core/schemas/map'; -import { chunkArray } from 'core/utils'; +import type { Player as PlayerType } from '../../playermanager'; +import { Player } from '../../schemas/players'; +import Plugin from '../../plugins'; +import { Map as DbMap } from '../../schemas/map'; +import { chunkArray } from '../../utils'; class SqliteLogger implements Logger { logQuery(query: string, params: unknown[]): void { diff --git a/core/plugins/debugtool/index.ts b/core/plugins/debugtool/index.ts index 67957cd..98f6640 100644 --- a/core/plugins/debugtool/index.ts +++ b/core/plugins/debugtool/index.ts @@ -1,7 +1,7 @@ -import { memInfo } from "core/utils"; -import Plugin from "core/plugins"; +import { memInfo } from "../../utils"; +import Plugin from "../../plugins"; import tm from 'tm-essentials'; -import Widget from 'core/ui/widget'; +import Widget from '../../ui/widget'; export default class DebugTool extends Plugin { widget: Widget | null = null; diff --git a/core/plugins/funcommands/index.ts b/core/plugins/funcommands/index.ts index e2fc06b..ec9ab4f 100644 --- a/core/plugins/funcommands/index.ts +++ b/core/plugins/funcommands/index.ts @@ -1,4 +1,4 @@ -import Plugin from 'core/plugins'; +import Plugin from '../../plugins'; export default class FunCommands extends Plugin { diff --git a/core/plugins/maplikes/index.ts b/core/plugins/maplikes/index.ts index 9ea9c44..163943e 100644 --- a/core/plugins/maplikes/index.ts +++ b/core/plugins/maplikes/index.ts @@ -1,7 +1,7 @@ -import Plugin from "core/plugins"; +import Plugin from "../../plugins"; import type {BetterSQLite3Database} from "drizzle-orm/better-sqlite3"; import {and, eq} from "drizzle-orm"; -import {MapLikes as Likes} from "core/schemas/maplikes"; +import {MapLikes as Likes} from "../../schemas/maplikes"; export interface Like { login: string; diff --git a/core/plugins/maps/index.ts b/core/plugins/maps/index.ts index 2398163..da344d0 100644 --- a/core/plugins/maps/index.ts +++ b/core/plugins/maps/index.ts @@ -1,7 +1,7 @@ import tm from 'tm-essentials'; import MapsWindow from './mapsWindow'; -import { clone, escape, formatTime, removeColors } from 'core/utils'; -import Plugin from 'core/plugins'; +import { clone, escape, formatTime, removeColors } from '../../utils'; +import Plugin from '../../plugins'; import QueueWindow from './queueWIndow'; export interface Map { diff --git a/core/plugins/maps/mapsWindow.ts b/core/plugins/maps/mapsWindow.ts index c47ba3e..963a73e 100644 --- a/core/plugins/maps/mapsWindow.ts +++ b/core/plugins/maps/mapsWindow.ts @@ -1,6 +1,6 @@ -import Confirm from 'core/ui/confirm'; -import ListWindow from 'core/ui/listwindow'; -import { formatTime, escape, removeColors } from 'core/utils'; +import Confirm from '../../ui/confirm'; +import ListWindow from '../../ui/listwindow'; +import { formatTime, escape, removeColors } from '../../utils'; export default class MapsWindow extends ListWindow { params: string[] = []; diff --git a/core/plugins/maps/queueWIndow.ts b/core/plugins/maps/queueWIndow.ts index 5c19f53..780b2e6 100644 --- a/core/plugins/maps/queueWIndow.ts +++ b/core/plugins/maps/queueWIndow.ts @@ -1,4 +1,4 @@ -import ListWindow from 'core/ui/listwindow'; +import ListWindow from '../../ui/listwindow'; export default class QueueWindow extends ListWindow { diff --git a/core/plugins/players/PlayerWindow.ts b/core/plugins/players/PlayerWindow.ts index 85d983b..25c9deb 100644 --- a/core/plugins/players/PlayerWindow.ts +++ b/core/plugins/players/PlayerWindow.ts @@ -1,5 +1,5 @@ -import Confirm from 'core/ui/confirm'; -import ListWindow from 'core/ui/listwindow'; +import Confirm from '../../ui/confirm'; +import ListWindow from '../../ui/listwindow'; export default class PlayerWindow extends ListWindow { diff --git a/core/plugins/players/index.ts b/core/plugins/players/index.ts index f5d355f..8da4fe7 100644 --- a/core/plugins/players/index.ts +++ b/core/plugins/players/index.ts @@ -1,4 +1,4 @@ -import Plugin from "core/plugins"; +import Plugin from "../../plugins"; import PlayerWindow from "./PlayerWindow"; diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index 6adf63d..4b77179 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -1,11 +1,11 @@ import { type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; -import Plugin from "core/plugins"; -import { Score } from "core/schemas/scores"; -import { Player } from "core/schemas/players"; +import Plugin from "../../plugins"; +import { Score } from "../../schemas/scores"; +import { Player } from "../../schemas/players"; import { eq, asc, and } from "drizzle-orm"; -import { clone, escape, removeLinks, formatTime } from "core/utils"; +import { clone, escape, removeLinks, formatTime } from "../../utils"; -import RecordsWindow from "core/plugins/records/recordsWindow.ts"; +import RecordsWindow from "./recordsWindow"; export class Record { login: string = ""; diff --git a/core/plugins/records/recordsWindow.ts b/core/plugins/records/recordsWindow.ts index d8de45f..4dbc792 100644 --- a/core/plugins/records/recordsWindow.ts +++ b/core/plugins/records/recordsWindow.ts @@ -1,6 +1,6 @@ -import ListWindow from "core/ui/listwindow.ts"; -import Records from "core/plugins/records/index.ts"; -import Confirm from "core/ui/confirm"; +import ListWindow from "../../ui/listwindow.ts"; +import Records from "../../plugins/records/index.ts"; +import Confirm from "../../ui/confirm"; export default class RecordsWindow extends ListWindow { app: Records; diff --git a/core/plugins/tmnf/coppers/index.ts b/core/plugins/tmnf/coppers/index.ts index 6944a19..8757378 100644 --- a/core/plugins/tmnf/coppers/index.ts +++ b/core/plugins/tmnf/coppers/index.ts @@ -1,4 +1,4 @@ -import Plugin from "core/plugins"; +import Plugin from "../../../plugins"; interface BillState { login: string; diff --git a/core/plugins/tmnf/dedimania/index.ts b/core/plugins/tmnf/dedimania/index.ts index 2158e9f..a5d0973 100644 --- a/core/plugins/tmnf/dedimania/index.ts +++ b/core/plugins/tmnf/dedimania/index.ts @@ -1,8 +1,8 @@ -import { Player } from 'core/playermanager'; +import { Player } from '../../../playermanager'; import Api from './api'; -import { clone, escape, formatTime } from 'core/utils'; -import ListWindow from 'core/ui/listwindow'; -import Plugin from 'core/plugins'; +import { clone, escape, formatTime } from '../../../utils'; +import ListWindow from '../../../ui/listwindow'; +import Plugin from '../../../plugins'; export interface DediRecord { Game?: string; diff --git a/core/plugins/tmnf/freezone/index.ts b/core/plugins/tmnf/freezone/index.ts index 9a4cf36..312fa3b 100644 --- a/core/plugins/tmnf/freezone/index.ts +++ b/core/plugins/tmnf/freezone/index.ts @@ -28,7 +28,7 @@ * SOFTWARE. */ -import Plugin from "core/plugins"; +import Plugin from "../../../plugins"; import http, { ClientRequest } from "http"; export default class Freezone extends Plugin { diff --git a/core/plugins/tmnf/index.ts b/core/plugins/tmnf/index.ts index 2759440..572363b 100644 --- a/core/plugins/tmnf/index.ts +++ b/core/plugins/tmnf/index.ts @@ -1,4 +1,4 @@ -import Plugin from 'core/plugins'; +import Plugin from '../../plugins'; export default class TmnfPlugin extends Plugin { diff --git a/core/plugins/tmnf/talimit/index.ts b/core/plugins/tmnf/talimit/index.ts index 7e4860b..6d308a7 100644 --- a/core/plugins/tmnf/talimit/index.ts +++ b/core/plugins/tmnf/talimit/index.ts @@ -1,5 +1,5 @@ -import Widget from 'core/ui/widget'; -import Plugin from 'core/plugins'; +import Widget from '../../../ui/widget'; +import Plugin from '../../../plugins'; import tm from 'tm-essentials'; export default class TAlimitPlugin extends Plugin { diff --git a/core/plugins/tmnf/togglechat/index.ts b/core/plugins/tmnf/togglechat/index.ts index ea0eb59..7f9e992 100644 --- a/core/plugins/tmnf/togglechat/index.ts +++ b/core/plugins/tmnf/togglechat/index.ts @@ -1,5 +1,5 @@ -import Plugin from 'core/plugins'; -import Widget from 'core/ui/widget'; +import Plugin from '../../../plugins'; +import Widget from '../../../ui/widget'; export default class ToggleChat extends Plugin { static depends: string[] = ["game:TmForever"]; diff --git a/core/plugins/tmnf/ui/index.ts b/core/plugins/tmnf/ui/index.ts index def5503..5e85c54 100644 --- a/core/plugins/tmnf/ui/index.ts +++ b/core/plugins/tmnf/ui/index.ts @@ -1,4 +1,4 @@ -import Plugin from "core/plugins"; +import Plugin from "../../../plugins"; const environments = ['Stadium', 'Speed', 'Alpine', 'Bay', 'Coast', 'Island', 'Rally']; diff --git a/core/plugins/tmx/index.ts b/core/plugins/tmx/index.ts index 3b5c0d8..8bc2f3f 100644 --- a/core/plugins/tmx/index.ts +++ b/core/plugins/tmx/index.ts @@ -1,4 +1,4 @@ -import Plugin from 'core/plugins'; +import Plugin from '../../plugins'; import fs from 'fs'; interface Map { diff --git a/core/plugins/votes/index.ts b/core/plugins/votes/index.ts index 8ec6542..5d9153e 100644 --- a/core/plugins/votes/index.ts +++ b/core/plugins/votes/index.ts @@ -1,6 +1,6 @@ -import Plugin from 'core/plugins'; -import Widget from 'core/ui/widget'; -import { formatTime, processColorString, escape } from 'core/utils'; +import Plugin from '../../plugins'; +import Widget from '../../ui/widget'; +import { formatTime, processColorString, escape } from '../..//utils'; export class Vote { type: string; diff --git a/core/plugins/widgets/bestcps/index.ts b/core/plugins/widgets/bestcps/index.ts index 5063f6a..15c8e91 100644 --- a/core/plugins/widgets/bestcps/index.ts +++ b/core/plugins/widgets/bestcps/index.ts @@ -1,7 +1,7 @@ import tm from 'tm-essentials'; -import Plugin from 'core/plugins'; -import Widget from 'core/ui/widget'; -import { formatTime } from 'core/utils'; +import Plugin from '../../../plugins'; +import Widget from '../../../ui/widget'; +import { formatTime } from '../../../utils'; interface Time { nickname: string; diff --git a/core/plugins/widgets/checkpoints/index.ts b/core/plugins/widgets/checkpoints/index.ts index 0e3b3df..bddc7bf 100644 --- a/core/plugins/widgets/checkpoints/index.ts +++ b/core/plugins/widgets/checkpoints/index.ts @@ -1,6 +1,6 @@ -import type { Player } from "core/playermanager"; -import Plugin from "core/plugins"; -import Widget from "core/ui/widget"; +import type { Player } from "../../../playermanager"; +import Plugin from "../../../plugins"; +import Widget from "../../../ui/widget"; export default class Checkpoints extends Plugin { diff --git a/core/plugins/widgets/dedimania/index.ts b/core/plugins/widgets/dedimania/index.ts index 2765ae3..4c2d748 100644 --- a/core/plugins/widgets/dedimania/index.ts +++ b/core/plugins/widgets/dedimania/index.ts @@ -1,6 +1,6 @@ -import Plugin from 'core/plugins'; -import Widget from 'core/ui/widget'; -import { formatTime, escape } from 'core/utils'; +import Plugin from '../../../plugins'; +import Widget from '../../../ui/widget'; +import { formatTime, escape } from '../../../utils'; export default class DedimaniaWidget extends Plugin { static depends: string[] = ["tmnf/dedimania"]; diff --git a/core/plugins/widgets/index.ts b/core/plugins/widgets/index.ts index 630006f..21d996e 100644 --- a/core/plugins/widgets/index.ts +++ b/core/plugins/widgets/index.ts @@ -1,4 +1,4 @@ -import Plugin from 'core/plugins'; +import Plugin from '../../plugins'; export default class WidgetPlugin extends Plugin { diff --git a/core/plugins/widgets/map/index.ts b/core/plugins/widgets/map/index.ts index 4b1e9d5..6527fc2 100644 --- a/core/plugins/widgets/map/index.ts +++ b/core/plugins/widgets/map/index.ts @@ -1,6 +1,6 @@ -import { escape, formatTime } from 'core/utils'; -import Plugin from 'core/plugins'; -import Widget from 'core/ui/widget'; +import { escape, formatTime } from '../../../utils'; +import Plugin from '../../../plugins'; +import Widget from '../../../ui/widget'; interface Time { login: string; diff --git a/core/plugins/widgets/maplikes/index.ts b/core/plugins/widgets/maplikes/index.ts index 8326aac..c76e2d0 100644 --- a/core/plugins/widgets/maplikes/index.ts +++ b/core/plugins/widgets/maplikes/index.ts @@ -1,6 +1,6 @@ -import Plugin from "core/plugins"; -import Widget from 'core/ui/widget'; -import type { Like } from "core/plugins/maplikes"; +import Plugin from "../../../plugins"; +import Widget from '../../../ui/widget'; +import type { Like } from "../../../plugins/maplikes"; export default class MapLikesWidget extends Plugin { static depends: string[] = ["database", 'maplikes']; diff --git a/core/plugins/widgets/menu/index.ts b/core/plugins/widgets/menu/index.ts index c28da6d..c8aa350 100644 --- a/core/plugins/widgets/menu/index.ts +++ b/core/plugins/widgets/menu/index.ts @@ -1,5 +1,5 @@ -import Plugin from "core/plugins"; -import Widget from "core/ui/widget"; +import Plugin from "../../../plugins"; +import Widget from "../../../ui/widget"; import MenuWidget from "./menuWidget"; export interface Item { diff --git a/core/plugins/widgets/menu/menuWidget.ts b/core/plugins/widgets/menu/menuWidget.ts index c75ece4..5ffa50a 100644 --- a/core/plugins/widgets/menu/menuWidget.ts +++ b/core/plugins/widgets/menu/menuWidget.ts @@ -1,4 +1,4 @@ -import Widget from "core/ui/widget"; +import Widget from "../../../ui/widget"; import { type Item } from "./index"; export default class MenuWidget extends Widget { diff --git a/core/plugins/widgets/records/index.ts b/core/plugins/widgets/records/index.ts index 7f24152..e667d4d 100644 --- a/core/plugins/widgets/records/index.ts +++ b/core/plugins/widgets/records/index.ts @@ -1,6 +1,6 @@ -import Plugin from "core/plugins"; -import Widget from 'core/ui/widget'; -import { formatTime, escape } from "core/utils"; +import Plugin from "../../../plugins"; +import Widget from '../../../ui/widget'; +import { formatTime, escape } from "../../../utils"; export default class RecordsWidget extends Plugin { static depends: string[] = ["records"]; diff --git a/core/ui/confirm.ts b/core/ui/confirm.ts index 5e33e3a..3cb9c92 100644 --- a/core/ui/confirm.ts +++ b/core/ui/confirm.ts @@ -1,5 +1,5 @@ import Widget from './widget'; -import { escape } from 'core/utils'; +import { escape } from '../utils'; export default class Confirm extends Widget { template = "core/templates/confirm.twig"; diff --git a/core/ui/listwindow.ts b/core/ui/listwindow.ts index f719365..3120ec1 100644 --- a/core/ui/listwindow.ts +++ b/core/ui/listwindow.ts @@ -1,4 +1,4 @@ -import { removeColors } from "core/utils"; +import { removeColors } from "../utils.ts"; import Window from "./window"; /** diff --git a/package-lock.json b/package-lock.json index ca430d9..4359146 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2751 +1,3215 @@ { - "name": "minicontrol", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "better-sqlite3": "^11.1.1", - "dependency-graph": "1.0.0", - "drizzle-kit": "^0.20.18", - "drizzle-orm": "0.30.6", - "iomem": "1.5.10", - "tm-essentials": "^1.0.5", - "twig": "^1.17.1", - "xmlrpc": "1.3.2" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.10", - "@types/node": "^20.14.9", - "@types/twig": "1.12.16", - "@types/xmlrpc": "^1.3.10", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "casual": "1.6.2", - "eslint": "8.57.0", - "eslint-plugin-drizzle": "^0.2.3" - }, - "peerDependencies": { - "typescript": "^5.5.2" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.7", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild-kit/core-utils": { - "version": "3.3.2", - "license": "MIT", - "dependencies": { - "esbuild": "~0.18.20", - "source-map-support": "^0.5.21" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.18.20", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.6.5", - "license": "MIT", - "dependencies": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hono/node-server": { - "version": "1.11.4", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - } - }, - "node_modules/@hono/zod-validator": { - "version": "0.2.2", - "license": "MIT", - "peerDependencies": { - "hono": ">=3.9.0", - "zod": "^3.19.1" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.10", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz", - "integrity": "sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==", - "devOptional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", - "devOptional": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/twig": { - "version": "1.12.16", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/xmlrpc": { - "version": "1.3.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/better-sqlite3": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.1.1.tgz", - "integrity": "sha512-bAlQQb7gwCgxNpDYafK0O4AaIOiTwA7srfqRtBbw0Nsiq6P+qxEYGl3hLw+9C5jX2FVjKW7oxkSouxlJ+3VX8A==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/bun-types": { - "version": "1.1.14", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/bun-types/node_modules/@types/node": { - "version": "20.12.14", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/casual": { - "version": "1.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mersenne-twister": "^1.0.1", - "moment": "^2.15.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/cli-color": { - "version": "2.0.3", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.61", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/connection-parse": { - "version": "0.0.7", - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "license": "MIT", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/d": { - "version": "1.0.1", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/difflib": { - "version": "0.2.4", - "dependencies": { - "heap": ">= 0.2.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dreamopt": { - "version": "0.8.0", - "dependencies": { - "wordwrap": ">=0.0.2" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/drizzle-kit": { - "version": "0.20.18", - "license": "MIT", - "dependencies": { - "@esbuild-kit/esm-loader": "^2.5.5", - "@hono/node-server": "^1.9.0", - "@hono/zod-validator": "^0.2.0", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "commander": "^9.4.1", - "env-paths": "^3.0.0", - "esbuild": "^0.19.7", - "esbuild-register": "^3.5.0", - "glob": "^8.1.0", - "hanji": "^0.0.5", - "hono": "^4.1.4", - "json-diff": "0.9.0", - "minimatch": "^7.4.3", - "semver": "^7.5.4", - "superjson": "^2.2.1", - "zod": "^3.20.2" - }, - "bin": { - "drizzle-kit": "bin.cjs" - } - }, - "node_modules/drizzle-kit/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/drizzle-kit/node_modules/commander": { - "version": "9.5.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/drizzle-kit/node_modules/minimatch": { - "version": "7.4.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/drizzle-kit/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/drizzle-orm": { - "version": "0.30.6", - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=3", - "@electric-sql/pglite": ">=0.1.1", - "@libsql/client": "*", - "@neondatabase/serverless": ">=0.1", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/react": ">=18", - "@types/sql.js": "*", - "@vercel/postgres": "*", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=13.2.0", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "react": ">=18", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "react": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/esbuild": { - "version": "0.19.12", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/esbuild-register": { - "version": "3.5.0", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-drizzle": { - "version": "0.2.3", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "eslint": ">=8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esniff/node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" - }, - "node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "license": "ISC" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.16.0", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "dev": true, - "license": "ISC" - }, - "node_modules/foreachasync": { - "version": "3.0.0", - "license": "Apache2" - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/glob": { - "version": "8.1.0", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/hanji": { - "version": "0.0.5", - "license": "ISC", - "dependencies": { - "lodash.throttle": "^4.1.1", - "sisteransi": "^1.0.5" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hashring": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, - "node_modules/heap": { - "version": "0.2.7", - "license": "MIT" - }, - "node_modules/hono": { - "version": "4.4.8", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/iomem": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "hashring": "^3.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "license": "MIT" - }, - "node_modules/is-what": { - "version": "4.1.16", - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-diff": { - "version": "0.9.0", - "license": "MIT", - "dependencies": { - "cli-color": "^2.0.0", - "difflib": "~0.2.1", - "dreamopt": "~0.8.0" - }, - "bin": { - "json-diff": "bin/json-diff.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/locutus": { - "version": "2.0.16", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/memoizee": { - "version": "0.4.15", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mersenne-twister": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/moment": { - "version": "2.30.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/sax": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/semver": { - "version": "7.6.0", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "name": "minicontrol", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "better-sqlite3": "^11.1.1", + "dependency-graph": "1.0.0", + "drizzle-kit": "^0.20.18", + "drizzle-orm": "0.30.6", + "iomem": "1.5.10", + "tm-essentials": "^1.0.5", + "tsx": "^4.15.8", + "twig": "^1.17.1", + "xmlrpc": "1.3.2" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.10", + "@types/node": "^20.14.9", + "@types/twig": "1.12.16", + "@types/xmlrpc": "^1.3.10", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "eslint": "8.57.0", + "eslint-plugin-drizzle": "^0.2.3" + }, + "peerDependencies": { + "typescript": "^5.5.2" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hono/node-server": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.11.4.tgz", + "integrity": "sha512-8TOiiiAqcFC6f62P7M9p6adQREAlWdVi1awehAwgWW+3R65/rKzHnLARO/Hu/466z01VNViBoogqatqXJMyItA==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.2.2.tgz", + "integrity": "sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==", + "license": "MIT", + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.19.1" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.10", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz", + "integrity": "sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/twig": { + "version": "1.12.16", + "resolved": "https://registry.npmjs.org/@types/twig/-/twig-1.12.16.tgz", + "integrity": "sha512-6kXSQwqxWxdHVITY6lur6pVpKbTk5D8R/ZUn2/7Y2AACKFlRqO4jbtHgWPDLe7JUc91sZQhkmopboYDABtZqlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/xmlrpc": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/xmlrpc/-/xmlrpc-1.3.10.tgz", + "integrity": "sha512-0jU+htwq8NGHqcz9pZzD76/Kpe1dpkDGFH696UoTONkwteRHA/2nzBAanqN7EppdkO+DwYYZd9M8IaOcnDqeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/better-sqlite3": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.1.1.tgz", + "integrity": "sha512-bAlQQb7gwCgxNpDYafK0O4AaIOiTwA7srfqRtBbw0Nsiq6P+qxEYGl3hLw+9C5jX2FVjKW7oxkSouxlJ+3VX8A==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/connection-parse": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", + "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dreamopt": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", + "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", + "dependencies": { + "wordwrap": ">=0.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.20.18", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.20.18.tgz", + "integrity": "sha512-fLTwcnLqtBxGd+51H/dEm9TC0FW6+cIX/RVPyNcitBO77X9+nkogEfMAJebpd/8Yl4KucmePHRYRWWvUlW0rqg==", + "license": "MIT", + "dependencies": { + "@esbuild-kit/esm-loader": "^2.5.5", + "@hono/node-server": "^1.9.0", + "@hono/zod-validator": "^0.2.0", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "commander": "^9.4.1", + "env-paths": "^3.0.0", + "esbuild": "^0.19.7", + "esbuild-register": "^3.5.0", + "glob": "^8.1.0", + "hanji": "^0.0.5", + "hono": "^4.1.4", + "json-diff": "0.9.0", + "minimatch": "^7.4.3", + "semver": "^7.5.4", + "superjson": "^2.2.1", + "zod": "^3.20.2" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.6.tgz", + "integrity": "sha512-8RgNUmY7J03GRuRgBV5SaJNbYgLVPjdSWNS/bRkIMIHt2TFCA439lJsNpqYX8asyKMqkw8ceBiamUnCIXZIt9w==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=3", + "@electric-sql/pglite": ">=0.1.1", + "@libsql/client": "*", + "@neondatabase/serverless": ">=0.1", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/react": ">=18", + "@types/sql.js": "*", + "@vercel/postgres": "*", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=13.2.0", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "react": ">=18", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "react": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-register": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", + "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-drizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-drizzle/-/eslint-plugin-drizzle-0.2.3.tgz", + "integrity": "sha512-BO+ymHo33IUNoJlC0rbd7HP9EwwpW4VIp49R/tWQF/d2E1K2kgTf0tCXT0v9MSiBr6gGR1LtPwMLapTKEWSg9A==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==", + "license": "Apache2" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/hanji": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/hanji/-/hanji-0.0.5.tgz", + "integrity": "sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==", + "license": "ISC", + "dependencies": { + "lodash.throttle": "^4.1.1", + "sisteransi": "^1.0.5" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashring": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", + "integrity": "sha512-xCMovURClsQZ+TR30icCZj+34Fq1hs0y6YCASD6ZqdRfYRybb5Iadws2WS+w09mGM/kf9xyA5FCdJQGcgcraSA==", + "license": "MIT", + "dependencies": { + "connection-parse": "0.0.x", + "simple-lru-cache": "0.0.x" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "license": "MIT" + }, + "node_modules/hono": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.4.9.tgz", + "integrity": "sha512-VW1hnYipHL/XsnSYiCTLJ+Z7iisZYWwSOiKXm9RBV2NKPxNqjfaHqeMFiDl11fK893ofmErvRpX20+FTNjZIjA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/iomem": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/iomem/-/iomem-1.5.10.tgz", + "integrity": "sha512-PP5OK1BoEGC8T/+T9yW4s2kDA9RQa0aS7vKQnlsfSVLmGkEp94X08O3439CJ9OBf5XbzV1RmJiB9jA3t5Rqcdg==", + "license": "MIT", + "dependencies": { + "hashring": "^3.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-diff": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.9.0.tgz", + "integrity": "sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==", + "license": "MIT", + "dependencies": { + "cli-color": "^2.0.0", + "difflib": "~0.2.1", + "dreamopt": "~0.8.0" + }, + "bin": { + "json-diff": "bin/json-diff.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locutus": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/locutus/-/locutus-2.0.32.tgz", + "integrity": "sha512-fr7OCpbE4xeefhHqfh6hM2/l9ZB3XvClHgtgFnQNImrM/nqL950o6FO98vmUH8GysfQRCcyBYtZ4C8GcY52Edw==", + "license": "MIT", + "engines": { + "node": ">= 10", + "yarn": ">= 1" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "license": "MIT", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/node-abi": { + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-lru-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", + "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/tm-essentials": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tm-essentials/-/tm-essentials-1.0.5.tgz", + "integrity": "sha512-l759+mgcL4ZdpQRkRMHDb3JtZehNVkaO6J0C+xxunhGz7h+064FopqbGBBh+y0XFSx8zO2q83lsa9X41nAp/yg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsx": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.0.tgz", + "integrity": "sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.21.5", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/twig": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/twig/-/twig-1.17.1.tgz", + "integrity": "sha512-atxccyr/BHtb1gPMA7Lvki0OuU17XBqHsNH9lzDHt9Rr1293EVZOosSZabEXz/DPVikIW8ZDqSkEddwyJnQN2w==", + "license": "BSD-2-Clause", + "dependencies": { + "@babel/runtime": "^7.8.4", + "locutus": "^2.0.11", + "minimatch": "3.0.x", + "walk": "2.3.x" + }, + "bin": { + "twigjs": "bin/twigjs" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/twig/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/twig/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlrpc": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", + "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==", + "license": "MIT", + "dependencies": { + "sax": "1.2.x", + "xmlbuilder": "8.2.x" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-lru-cache": { - "version": "0.0.2" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/superjson": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "license": "ISC", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/tm-essentials": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tm-essentials/-/tm-essentials-1.0.5.tgz", - "integrity": "sha512-l759+mgcL4ZdpQRkRMHDb3JtZehNVkaO6J0C+xxunhGz7h+064FopqbGBBh+y0XFSx8zO2q83lsa9X41nAp/yg==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/twig": { - "version": "1.17.1", - "license": "BSD-2-Clause", - "dependencies": { - "@babel/runtime": "^7.8.4", - "locutus": "^2.0.11", - "minimatch": "3.0.x", - "walk": "2.3.x" - }, - "bin": { - "twigjs": "bin/twigjs" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/twig/node_modules/minimatch": { - "version": "3.0.8", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "devOptional": true, - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/walk": { - "version": "2.3.15", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "foreachasync": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/xmlbuilder": { - "version": "8.2.2", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlrpc": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "sax": "1.2.x", - "xmlbuilder": "8.2.x" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.0.0" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } - } } diff --git a/package.json b/package.json index 74d4fe1..e7b0be2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "scripts": { - "dev": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env --watch run core/minicontrol.ts", + "dev": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --tsconfig ./tsconfig.json --env-file=.env --watch ./core/minicontrol.ts", "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", "start": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", "start2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", @@ -30,5 +30,9 @@ }, "peerDependencies": { "typescript": "^5.5.2" + }, + "imports": { + "core": "./core/", + "schemas": "./core/schemas/" } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9240981..79af240 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,11 +16,7 @@ "noFallthroughCasesInSwitch": true, "forceConsistentCasingInFileNames": true, "esModuleInterop": true, + "traceResolution": true, "rootDir": ".", - "baseUrl": "./", - "paths": { - "core/*": ["core/*"], - "schemas/*": ["core/schemas/*"] - } } } \ No newline at end of file From ba16050cf64ebdb8814f5242fe97045c4803884f Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 29 Jun 2024 18:05:31 +0300 Subject: [PATCH 09/35] update dependencies! to migrate database type: npm run up --- core/minicontrol.ts | 13 +- drizzle.config.js | 3 + package-lock.json | 466 ++------------------------------------------ package.json | 37 ++-- 4 files changed, 45 insertions(+), 474 deletions(-) diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 701e28b..963eb1b 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -10,13 +10,6 @@ import fs from 'fs'; import Plugin from './plugins'; import path from 'path'; import { DepGraph } from "dependency-graph"; -import os from 'node:os'; -const platform = os.platform(); -/*if (platform.startsWith("win")) { - log.info("\n\nSorry, but MINIcontrol currently $f00not supported $zon Windows platforms."); - log.info("Please use WSL or Docker to run MINIcontrol.") - process.exit(1); -}*/ export interface GameStruct { Name: string; @@ -24,8 +17,6 @@ export interface GameStruct { Build?: string; } - - /** * MiniControl class */ @@ -259,8 +250,8 @@ class MiniControl { delete this.plugins[unloadName]; const file = path.resolve(process.cwd() + "/" + pluginPath + "/index.ts"); if (require.cache[file]) { - // eslint-disable-next-line drizzle/enforce-delete-with-where - Loader.registry.delete(file); + // eslint-disable-next-line drizzle/enforce-delete-with-where + // Loader.registry.delete(file); // @TODO check how to do this in tsx delete require.cache[file]; } else { this.cli(`$fffFailed to remove require cache for ¤cmd¤${unloadName}¤white¤, hotreload will not work right.`); diff --git a/drizzle.config.js b/drizzle.config.js index 5ef9f62..6b0c5a8 100644 --- a/drizzle.config.js +++ b/drizzle.config.js @@ -7,5 +7,8 @@ export default { out: "./userdata/drizzle", dbCredentials: { url: "sqlite://userdata/local.sqlite", + }, + migration: { + table: "migrations" } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4359146..31d02e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,14 +5,14 @@ "packages": { "": { "dependencies": { - "better-sqlite3": "^11.1.1", + "better-sqlite3": "11.1.1", "dependency-graph": "1.0.0", - "drizzle-kit": "^0.20.18", - "drizzle-orm": "0.30.6", + "drizzle-kit": "0.22.8", + "drizzle-orm": "0.31.2", "iomem": "1.5.10", - "tm-essentials": "^1.0.5", - "tsx": "^4.15.8", - "twig": "^1.17.1", + "tm-essentials": "1.0.5", + "tsx": "4.16.0", + "twig": "1.17.1", "xmlrpc": "1.3.2" }, "devDependencies": { @@ -214,25 +214,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@hono/node-server": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.11.4.tgz", - "integrity": "sha512-8TOiiiAqcFC6f62P7M9p6adQREAlWdVi1awehAwgWW+3R65/rKzHnLARO/Hu/466z01VNViBoogqatqXJMyItA==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - } - }, - "node_modules/@hono/zod-validator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.2.2.tgz", - "integrity": "sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==", - "license": "MIT", - "peerDependencies": { - "hono": ">=3.9.0", - "zod": "^3.19.1" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -733,6 +714,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -791,52 +773,12 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, - "node_modules/cli-color": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", - "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.64", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -857,15 +799,6 @@ "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -878,21 +811,6 @@ "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==", "license": "MIT" }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "license": "MIT", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -908,19 +826,6 @@ "node": ">= 8" } }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -987,17 +892,6 @@ "node": ">=8" } }, - "node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dependencies": { - "heap": ">= 0.2.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1024,65 +918,23 @@ "node": ">=6.0.0" } }, - "node_modules/dreamopt": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", - "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", - "dependencies": { - "wordwrap": ">=0.0.2" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/drizzle-kit": { - "version": "0.20.18", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.20.18.tgz", - "integrity": "sha512-fLTwcnLqtBxGd+51H/dEm9TC0FW6+cIX/RVPyNcitBO77X9+nkogEfMAJebpd/8Yl4KucmePHRYRWWvUlW0rqg==", - "license": "MIT", + "version": "0.22.8", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.22.8.tgz", + "integrity": "sha512-VjI4wsJjk3hSqHSa3TwBf+uvH6M6pRHyxyoVbt935GUzP9tUR/BRZ+MhEJNgryqbzN2Za1KP0eJMTgKEPsalYQ==", "dependencies": { "@esbuild-kit/esm-loader": "^2.5.5", - "@hono/node-server": "^1.9.0", - "@hono/zod-validator": "^0.2.0", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "commander": "^9.4.1", - "env-paths": "^3.0.0", "esbuild": "^0.19.7", - "esbuild-register": "^3.5.0", - "glob": "^8.1.0", - "hanji": "^0.0.5", - "hono": "^4.1.4", - "json-diff": "0.9.0", - "minimatch": "^7.4.3", - "semver": "^7.5.4", - "superjson": "^2.2.1", - "zod": "^3.20.2" + "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, - "node_modules/drizzle-kit/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/drizzle-orm": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.6.tgz", - "integrity": "sha512-8RgNUmY7J03GRuRgBV5SaJNbYgLVPjdSWNS/bRkIMIHt2TFCA439lJsNpqYX8asyKMqkw8ceBiamUnCIXZIt9w==", - "license": "Apache-2.0", + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.31.2.tgz", + "integrity": "sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg==", "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=3", @@ -1092,11 +944,12 @@ "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", + "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/react": ">=18", "@types/sql.js": "*", - "@vercel/postgres": "*", + "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", @@ -1135,6 +988,9 @@ "@planetscale/database": { "optional": true }, + "@tidbcloud/serverless": { + "optional": true + }, "@types/better-sqlite3": { "optional": true }, @@ -1197,70 +1053,6 @@ "once": "^1.4.0" } }, - "node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "node_modules/esbuild": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", @@ -1461,21 +1253,6 @@ "node": "*" } }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -1540,16 +1317,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1559,15 +1326,6 @@ "node": ">=6" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1716,6 +1474,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, "license": "ISC" }, "node_modules/get-tsconfig": { @@ -1736,26 +1495,6 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "license": "MIT" }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1769,18 +1508,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -1825,16 +1552,6 @@ "dev": true, "license": "MIT" }, - "node_modules/hanji": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/hanji/-/hanji-0.0.5.tgz", - "integrity": "sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==", - "license": "ISC", - "dependencies": { - "lodash.throttle": "^4.1.1", - "sisteransi": "^1.0.5" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1855,21 +1572,6 @@ "simple-lru-cache": "0.0.x" } }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "license": "MIT" - }, - "node_modules/hono": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.4.9.tgz", - "integrity": "sha512-VW1hnYipHL/XsnSYiCTLJ+Z7iisZYWwSOiKXm9RBV2NKPxNqjfaHqeMFiDl11fK893ofmErvRpX20+FTNjZIjA==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1932,6 +1634,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "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.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -2005,24 +1708,6 @@ "node": ">=8" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2050,23 +1735,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-diff": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.9.0.tgz", - "integrity": "sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==", - "license": "MIT", - "dependencies": { - "cli-color": "^2.0.0", - "difflib": "~0.2.1", - "dreamopt": "~0.8.0" - }, - "bin": { - "json-diff": "bin/json-diff.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2138,40 +1806,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT" - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "license": "MIT", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/memoizee": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", - "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2258,12 +1892,6 @@ "dev": true, "license": "MIT" }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, "node_modules/node-abi": { "version": "3.65.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", @@ -2750,12 +2378,6 @@ "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2820,18 +2442,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2880,19 +2490,6 @@ "dev": true, "license": "MIT" }, - "node_modules/timers-ext": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", - "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/tm-essentials": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tm-essentials/-/tm-essentials-1.0.5.tgz", @@ -3050,12 +2647,6 @@ "node": "*" } }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3154,12 +2745,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3201,15 +2786,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/package.json b/package.json index e7b0be2..af442e0 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,36 @@ { "scripts": { - "dev": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --tsconfig ./tsconfig.json --env-file=.env --watch ./core/minicontrol.ts", - "dev2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", - "start": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", - "start2": "drizzle-kit generate:sqlite --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", - "daemon": "drizzle-kit generate:sqlite --config=drizzle.config.js && pm2 start core/minicontrol.ts" + "dev": "drizzle-kit generate --config=drizzle.config.js && tsx --tsconfig ./tsconfig.json --env-file=.env --watch ./core/minicontrol.ts", + "dev2": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", + "start": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", + "start2": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", + "up": "drizzle-kit up", + "daemon": "drizzle-kit generate --config=drizzle.config.js && pm2 start core/minicontrol.ts" }, "type": "module", "dependencies": { - "better-sqlite3": "^11.1.1", + "better-sqlite3": "11.1.1", "dependency-graph": "1.0.0", - "drizzle-kit": "^0.20.18", - "drizzle-orm": "0.30.6", + "drizzle-kit": "0.22.8", + "drizzle-orm": "0.31.2", "iomem": "1.5.10", - "tm-essentials": "^1.0.5", - "twig": "^1.17.1", + "tm-essentials": "1.0.5", + "twig": "1.17.1", "xmlrpc": "1.3.2", - "tsx": "^4.15.8" + "tsx": "4.16.0" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.10", - "@types/node": "^20.14.9", + "@types/better-sqlite3": "7.6.10", + "@types/node": "20.14.9", "@types/twig": "1.12.16", - "@types/xmlrpc": "^1.3.10", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@types/xmlrpc": "1.3.10", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "eslint": "8.57.0", - "eslint-plugin-drizzle": "^0.2.3" + "eslint-plugin-drizzle": "0.2.3" }, "peerDependencies": { - "typescript": "^5.5.2" + "typescript": "5.5.2" }, "imports": { "core": "./core/", From 9fba219a55f958e6362303b0051da1f853204082 Mon Sep 17 00:00:00 2001 From: Nicolas Graf Date: Mon, 1 Jul 2024 13:40:22 +0200 Subject: [PATCH 10/35] Docker rebase to node Signed-off-by: Nicolas Graf --- docker/Dockerfile | 10 +++++----- package.json | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 03ff12e..17feaaa 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # Using bun base image + node because of https://github.com/oven-sh/bun/issues/7343 -FROM oven/bun:alpine +FROM node:lts-alpine ARG UID="9999" \ GID="9999" \ @@ -23,7 +23,7 @@ RUN true \ && addgroup -g $GID minicontrol \ && adduser -u $UID -Hh /minicontrol -G minicontrol -s /sbin/nologin -D minicontrol \ && install -d -o minicontrol -g minicontrol -m 775 /minicontrol \ - && apk add --force-overwrite --no-cache nodejs npm tini \ + && apk add --force-overwrite --no-cache tini \ && true USER minicontrol @@ -32,11 +32,11 @@ COPY --chown=minicontrol ../ /minicontrol/ RUN true \ && set -eux \ - && bun install --production \ + && npm install --production \ && true HEALTHCHECK --interval=5s --timeout=5s --start-period=5s --retries=3 \ CMD [ "/bin/sh", "-c", "echo 'ping' | nc -w1 127.0.0.1 3000 | grep -qF '0' || exit 1" ] -ENTRYPOINT ["/sbin/tini", "--", "bun"] -CMD [ "start" ] \ No newline at end of file +ENTRYPOINT ["/sbin/tini", "--", "npm", "run"] +CMD [ "docker" ] \ No newline at end of file diff --git a/package.json b/package.json index af442e0..b1aa985 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "start": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", "start2": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", "up": "drizzle-kit up", - "daemon": "drizzle-kit generate --config=drizzle.config.js && pm2 start core/minicontrol.ts" + "daemon": "drizzle-kit generate --config=drizzle.config.js && pm2 start core/minicontrol.ts", + "docker": "drizzle-kit generate --config=drizzle.config.js && tsx core/minicontrol.ts" }, "type": "module", "dependencies": { From 0d61f0e72de840b391fae347cd033f9f17fe2cfe Mon Sep 17 00:00:00 2001 From: reaby Date: Mon, 1 Jul 2024 20:58:20 +0300 Subject: [PATCH 11/35] change ORM from drizzle to sequelize --- .env.example | 8 + core/plugins/announces/index.ts | 17 +- core/plugins/chat/index.ts | 2 +- core/plugins/database/index.ts | 88 +- core/plugins/maplikes/index.ts | 40 +- core/plugins/records/index.ts | 168 +- core/plugins/widgets/records/index.ts | 6 +- core/schemas/map.model.ts | 35 + core/schemas/map.ts | 19 - core/schemas/maplikes.model.ts | 25 + core/schemas/maplikes.ts | 18 - core/schemas/players.model.ts | 26 + core/schemas/players.ts | 16 - core/schemas/scores.model.ts | 29 + core/schemas/scores.ts | 21 - drizzle.config.js | 14 - migrate.ts | 37 + migrations/00-create-map.ts | 42 + migrations/00-create-maplikes.ts | 36 + migrations/00-create-player.ts | 36 + migrations/00-create-scores.ts | 35 + package-lock.json | 2018 ++++++++++++++++++++----- package.json | 32 +- tsconfig.json | 4 +- 24 files changed, 2088 insertions(+), 684 deletions(-) create mode 100644 core/schemas/map.model.ts delete mode 100644 core/schemas/map.ts create mode 100644 core/schemas/maplikes.model.ts delete mode 100644 core/schemas/maplikes.ts create mode 100644 core/schemas/players.model.ts delete mode 100644 core/schemas/players.ts create mode 100644 core/schemas/scores.model.ts delete mode 100644 core/schemas/scores.ts delete mode 100644 drizzle.config.js create mode 100644 migrate.ts create mode 100644 migrations/00-create-map.ts create mode 100644 migrations/00-create-maplikes.ts create mode 100644 migrations/00-create-player.ts create mode 100644 migrations/00-create-scores.ts diff --git a/.env.example b/.env.example index 3d7eb45..853ea79 100644 --- a/.env.example +++ b/.env.example @@ -4,6 +4,14 @@ XMLRPC_PORT=5000 XMLRPC_USER="SuperAdmin" XMLRPC_PASS="SuperAdmin" +# database connection string examples: + +# DATABASE="postgres://user:pass@127.0.0.1:5432/databaseName" +# DATABASE="mysql://user:pass@127.0.0.1:3306/databaseName" +# DATABASE="sqlite://userdata/local.sqlite" + +DATABASE="sqlite://userdata/local.sqlite" + ## Controller # comma separated list of admins for the server diff --git a/core/plugins/announces/index.ts b/core/plugins/announces/index.ts index 98e1b6f..6787a2e 100644 --- a/core/plugins/announces/index.ts +++ b/core/plugins/announces/index.ts @@ -1,6 +1,5 @@ import type { Player } from "../../playermanager"; import Plugin from "../index"; -import type { Record } from "../records"; import { formatTime } from '../../utils'; export default class Announces extends Plugin { @@ -30,7 +29,7 @@ export default class Announces extends Plugin { } async onPlayerConnect(player: Player) { - tmc.chat(`¤info¤Welcome to ¤white¤${tmc.server.name} ¤info¤(${tmc.brand} ¤info¤version ¤white¤${tmc.version}¤info¤)`, player.login); + tmc.chat(`${tmc.brand} ¤info¤version ¤white¤${tmc.version}`, player.login); const msg = `¤white¤${player.nickname}¤info¤ from ¤white¤${player.path.replace("World|", "").replaceAll("|", ", ")} ¤info¤joins!`; tmc.chat(msg); tmc.cli(msg); @@ -42,12 +41,12 @@ export default class Announces extends Plugin { tmc.cli(msg); } - async onNewRecord(data: any, records: Record[]) { + async onNewRecord(data: any, records: any[]) { const newRecord = data.record; - tmc.chat(`¤white¤${newRecord.nickname}¤rec¤ has set a new $fff1. ¤rec¤server record ¤white¤${formatTime(newRecord.time)}¤rec¤!`); + tmc.chat(`¤white¤${newRecord.player.nickname}¤rec¤ has set a new $fff1. ¤rec¤server record ¤white¤${formatTime(newRecord.time)}¤rec¤!`); } - async onUpdateRecord(data: any, records: Record[]) { + async onUpdateRecord(data: any, records: any[]) { const newRecord = data.record; const oldRecord = data.oldRecord; let extrainfo = ""; @@ -60,21 +59,21 @@ export default class Announces extends Plugin { } if (oldRecord.time == newRecord.time) { - tmc.chat(`¤white¤${newRecord.nickname}¤rec¤ equalled their ¤white¤${newRecord.rank}. ¤rec¤server record ¤white¤${formatTime(newRecord.time)}¤rec¤!`, newRecord.login); + tmc.chat(`¤white¤${newRecord.player.nickname}¤rec¤ equalled their ¤white¤${newRecord.rank}. ¤rec¤server record ¤white¤${formatTime(newRecord.time)}¤rec¤!`, newRecord.login); return; } - tmc.chat(`¤white¤${newRecord.nickname}¤rec¤ improved ¤white¤${newRecord.rank}. ¤rec¤server record ¤white¤${formatTime(newRecord.time)}¤rec¤ ${extrainfo}!`, recipient); + tmc.chat(`¤white¤${newRecord.player.nickname}¤rec¤ improved ¤white¤${newRecord.rank}. ¤rec¤server record ¤white¤${formatTime(newRecord.time)}¤rec¤ ${extrainfo}!`, recipient); } async onSyncRecord(data: any) { const map = tmc.maps.getMap(data.mapUid); - const records: Record[] = data.records; + const records: any[] = data.records; if (records.length === 0) { tmc.chat(`¤rec¤No server records for ¤white¤${map?.Name} ¤rec¤!`); return; } - const msg = `¤rec¤Server record for ¤white¤${map?.Name} ¤rec¤by ¤white¤${records[0].nickname}`; // ¤rec¤ time ¤white¤${formatTime(records[0].time)} + const msg = `¤rec¤Server record for ¤white¤${map?.Name} ¤rec¤by ¤white¤${records[0].player.nickname}`; // ¤rec¤ time ¤white¤${formatTime(records[0].time)} tmc.chat(msg); } } diff --git a/core/plugins/chat/index.ts b/core/plugins/chat/index.ts index 906079f..02b7ae7 100644 --- a/core/plugins/chat/index.ts +++ b/core/plugins/chat/index.ts @@ -18,7 +18,7 @@ export default class Chat extends Plugin { try { await tmc.server.call("ChatEnableManualRouting", false, false); } catch (e: any) { - console.log(e.message); + tmc.cli(e.message); } tmc.server.removeListener("Trackmania.PlayerChat", this.onPlayerChat.bind(this)); this.enabled = false; diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index f58e8e0..f383686 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -1,47 +1,37 @@ -import { drizzle, type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; -import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; -import Database from 'better-sqlite3'; -import { eq, inArray, sql } from "drizzle-orm"; -import type { Logger } from 'drizzle-orm/logger'; +import { Sequelize } from 'sequelize-typescript'; import type { Player as PlayerType } from '../../playermanager'; -import { Player } from '../../schemas/players'; import Plugin from '../../plugins'; -import { Map as DbMap } from '../../schemas/map'; import { chunkArray } from '../../utils'; +import Map from '../../schemas/map.model'; +import Player from '../../schemas/players.model'; -class SqliteLogger implements Logger { - logQuery(query: string, params: unknown[]): void { - tmc.debug(`$d7c${query}`); - } -} - -export default class SqliteDb extends Plugin { +export default class GenericDb extends Plugin { async onLoad() { - const sqlite = new Database(process.cwd() + '/userdata/local.sqlite'); - const client = drizzle(sqlite, { - logger: new SqliteLogger() - }); - console.log("Running Migrates..."); try { - migrate(client, { - migrationsFolder: "./userdata/drizzle" + const sequelize = new Sequelize(process.env['DATABASE'] ?? "", { + logging(sql, timing) { + tmc.debug(`$d7c${sql}`); + }, }); + + sequelize.addModels([Map, Player]); + await sequelize.authenticate(); + tmc.storage['db'] = sequelize; + + tmc.cli("¤success¤Database connected."); + tmc.server.addListener("TMC.PlayerConnect", this.onPlayerConnect, this); + tmc.server.addListener("Trackmania.MapListModified", this.onMapListModified, this); } catch (e: any) { - tmc.cli("¤error¤Error running migrations: ¤white¤" + e.message); + tmc.cli("¤error¤" + e.message); process.exit(1); } - - tmc.storage['sqlite'] = client; - tmc.cli("¤success¤Database connected."); - tmc.server.addListener("TMC.PlayerConnect", this.onPlayerConnect, this); - tmc.server.addListener("Trackmania.MapListModified", this.onMapListModified, this); } async onUnload() { - if (tmc.storage['sqlite']) { - await tmc.storage['sqlite'].close(); - delete (tmc.storage['sqlite']); + if (tmc.storage['db']) { + await tmc.storage['db'].close(); + delete (tmc.storage['db']); } tmc.server.removeListener("TMC.PlayerConnect", this.onPlayerConnect.bind(this)); } @@ -56,26 +46,26 @@ export default class SqliteDb extends Plugin { } async syncPlayer(player: PlayerType) { - if (!tmc.storage['sqlite']) return; - const db: BetterSQLite3Database = tmc.storage['sqlite']; - const query = await db.select().from(Player).where(eq(Player.login, player.login)); - if (query.length == 0) { - await db.insert(Player).values({ + let dbPlayer = await Player.findByPk(player.login); + if (dbPlayer == null) { + dbPlayer = await Player.create({ login: player.login, nickname: player.nickname, + path: player.path, }); } else { - await db.update(Player).set({ + dbPlayer.update({ nickname: player.nickname, - }).where(eq(Player.login, player.login)); - - if (query[0] && query[0].customNick) { - tmc.cli("Setting nickname to " + query[0].customNick); - player.set("nickname", query[0].customNick); - } + path: player.path + }); + } + if (dbPlayer && dbPlayer.customNick) { + tmc.cli("Setting nickname to " + dbPlayer.customNick); + player.set("nickname", dbPlayer.customNick); } } + async syncPlayers() { const players = tmc.players.getAll(); for (const player of players) { @@ -90,14 +80,11 @@ export default class SqliteDb extends Plugin { } async syncMaps() { - if (!tmc.storage['sqlite']) return; - const db: BetterSQLite3Database = tmc.storage['sqlite']; - const serverUids = tmc.maps.getUids(); - const result = await db.select().from(DbMap).where(inArray(DbMap.uuid, serverUids)).all(); - const dbUids = result.map((value) => value.uuid); + const result = await Map.findAll(); + const dbUids = result.map((value: any) => value.uuid); const missingUids = chunkArray(serverUids.filter(item => dbUids.indexOf(item) < 0), 50); - for (const groups of missingUids) { + for (const groups of missingUids) { let missingMaps: any[] = []; for (const uid of groups) { const map = tmc.maps.getMap(uid); @@ -109,15 +96,12 @@ export default class SqliteDb extends Plugin { authorNickname: map.AuthorNickname ?? "", authorTime: map.AuthorTime, environment: map.Environnement, - created_at: sql`CURRENT_TIMESTAMP`, - updated_at: sql`CURRENT_TIMESTAMP`, }; missingMaps.push(outMap); } try { - if (missingMaps.length > 0) - await db.insert(DbMap).values(missingMaps); + Map.bulkCreate(missingMaps); } catch (e: any) { tmc.cli(`¤error¤` + e.message); } diff --git a/core/plugins/maplikes/index.ts b/core/plugins/maplikes/index.ts index 163943e..29f5851 100644 --- a/core/plugins/maplikes/index.ts +++ b/core/plugins/maplikes/index.ts @@ -1,7 +1,6 @@ +import { Sequelize } from "sequelize-typescript"; import Plugin from "../../plugins"; -import type {BetterSQLite3Database} from "drizzle-orm/better-sqlite3"; -import {and, eq} from "drizzle-orm"; -import {MapLikes as Likes} from "../../schemas/maplikes"; +import Likes from "../../schemas/maplikes.model"; export interface Like { login: string; @@ -14,6 +13,7 @@ export default class MapLikes extends Plugin { votes: Like[] = []; async onLoad() { + tmc.storage['db'].addModels([Likes]); tmc.addCommand("/++", this.onLike.bind(this), "Like a map"); tmc.addCommand("/--", this.onDislike.bind(this), "Dislike a map"); tmc.server.addListener("Trackmania.BeginMap", this.syncVotes, this); @@ -29,17 +29,15 @@ export default class MapLikes extends Plugin { tmc.removeCommand("/--"); tmc.server.removeListener("Trackmania.BeginMap", this.syncVotes); tmc.server.removeListener("Trackmania.PlayerChat", this.onPlayerChat); - this.votes = []; + this.votes = []; } async syncVotes() { - if (!tmc.storage['sqlite']) return; if (!tmc.maps.currentMap) return; - const db: BetterSQLite3Database = tmc.storage['sqlite']; - const votes = await db.select().from(Likes).where(eq(Likes.mapUuid, tmc.maps.currentMap.UId)); + const votes = await Likes.findAll({ where: { mapUuid: tmc.maps.currentMap.UId } }); this.votes = []; for (const vote of votes) { - this.votes.push({login: vote.login, vote: vote.vote, updatedAt: vote.updatedAt || ""}); + this.votes.push({ login: vote.login, vote: vote.vote, updatedAt: vote.updatedAt || "" }); } tmc.server.emit("Plugin.MapLikes.onSync", this.votes); } @@ -53,10 +51,10 @@ export default class MapLikes extends Plugin { if (text === "++") { await this.updateVote(login, 1); } - + if (text === "--") { await this.updateVote(login, -1); - } + } } async onLike(login: string) { @@ -68,22 +66,22 @@ export default class MapLikes extends Plugin { } async updateVote(login: string, value: number = 0) { - if (!tmc.storage['sqlite']) return; if (!tmc.maps.currentMap) return; - const db: BetterSQLite3Database = tmc.storage['sqlite']; - const query = await db.select().from(Likes).where(and(eq(Likes.mapUuid, tmc.maps.currentMap.UId), eq(Likes.login, login))); - if (query.length == 0) { - await db.insert(Likes).values({ + let mapLike = await Likes.findOne( + { + where: { + mapUuid: tmc.maps.currentMap.UId, + login: login, + } + }); + if (!mapLike) { + mapLike = await Likes.create({ mapUuid: tmc.maps.currentMap.UId, login: login, vote: value - }); - } else { - await db.update(Likes).set({ - vote: value, - updatedAt: new Date().toISOString(), - }).where(and(eq(Likes.mapUuid, tmc.maps.currentMap.UId), eq(Likes.login, login))); + }) } + await mapLike.update({ vote: value }); await this.syncVotes(); } diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index 4b77179..fea5bd4 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -1,59 +1,25 @@ -import { type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; import Plugin from "../../plugins"; -import { Score } from "../../schemas/scores"; -import { Player } from "../../schemas/players"; -import { eq, asc, and } from "drizzle-orm"; +import Score from "../../schemas/scores.model"; +import Player from "../../schemas/players.model"; import { clone, escape, removeLinks, formatTime } from "../../utils"; - import RecordsWindow from "./recordsWindow"; - -export class Record { - login: string = ""; - nickname: string = ""; - rank: number = 0; - time: number = 0; - avgTime: number = 0; - totalFinishes: number = 0; - checkpoints: string = ""; - createdAt: string = ""; - updatedAt: string = ""; - - fromScore(score: any) { - if (score.rank) { - this.rank = score.rank; - } - this.login = score.login; - if (score.nickname) { - this.nickname = score.nickname; - } - this.time = score.time; - this.avgTime = score.avgTime; - this.totalFinishes = score.totalFinishes; - this.checkpoints = score.checkpoints; - this.createdAt = score.createdAt; - this.updatedAt = score.updatedAt; - return this; - } -} +import { Op } from "sequelize"; export default class Records extends Plugin { static depends: string[] = ["database"]; - db: BetterSQLite3Database | null = null; - records: Record[] = []; + records: Score[] = []; currentMapUid: string = ""; limit: number = 100; async onLoad() { - if (!tmc.storage['sqlite']) return; - this.db = tmc.storage['sqlite']; + tmc.storage['db'].addModels([Score]); tmc.server.addListener("Trackmania.BeginMap", this.onBeginMap, this); tmc.server.addListener("TMC.PlayerFinish", this.onPlayerFinish, this); tmc.chatCmd.addCommand("/records", this.cmdRecords.bind(this), "Display records"); } async onUnload() { - this.db = null; tmc.server.removeListener("Trackmania.BeginMap", this.onBeginMap.bind(this)); tmc.server.removeListener("TMC.PlayerFinish", this.onPlayerFinish.bind(this)); tmc.chatCmd.removeCommand("/records"); @@ -68,12 +34,9 @@ export default class Records extends Plugin { action: "/records" }); } - if (!this.db) return; if (!tmc.maps.currentMap?.UId) return; this.currentMapUid = tmc.maps.currentMap.UId; await this.syncRecords(tmc.maps.currentMap.UId); - - } async onBeginMap(data: any) { @@ -84,13 +47,13 @@ export default class Records extends Plugin { async cmdRecords(login: string, args: string[]) { let records = []; - for (let record of this.records) { + for (const record of this.records) { records.push( { rank: record.rank, - nickname: escape(record.nickname), + nickname: escape(record.player.nickname??""), login: record.login, - time: "$o" + formatTime(record.time), + time: "$o" + formatTime(record.time??0), }); } const window = new RecordsWindow(login, this); @@ -110,23 +73,23 @@ export default class Records extends Plugin { } async syncRecords(mapUuid: string) { - if (!this.db) return; - const scores: any = this.db.select({ - login: Score.login, - nickname: Player.nickname, - time: Score.time, - avgTime: Score.avgTime, - totalFinishes: Score.totalFinishes, - checkpoints: Score.checkpoints, - createdAt: Score.createdAt, - updatedAt: Score.updatedAt, - }).from(Score).leftJoin(Player, eq(Score.login, Player.login)).where(eq(Score.mapUuid, mapUuid)).orderBy(asc(Score.time), asc(Score.updatedAt)).all(); + const scores = await Score.findAll({ + where: { + mapUuid: mapUuid + }, + order: [ + // Will escape title and validate DESC against a list of valid direction parameters + ['time', 'ASC'], + ['updatedAt', 'ASC'], + ], + include: [Player], + }); this.records = []; let rank = 1; for (const score of scores) { score.rank = rank; - this.records.push(new Record().fromScore(score)); + this.records.push(score); rank += 1; } @@ -137,13 +100,20 @@ export default class Records extends Plugin { } async deleteRecord(login: string, data: any) { - if (!this.db) return; if (!tmc.admins.includes(login)) return; const msg = (`¤info¤Deleting map record for ¤white¤${data.nickname} ¤info¤(¤white¤${data.login}¤info¤)`); tmc.cli(msg); tmc.chat(msg, login); try { - await this.db?.delete(Score).where(and(eq(Score.login, data.login), eq(Score.mapUuid, this.currentMapUid))); + await Score.destroy({ + where: { + [Op.and]: { + login: data.login, + mapUuid: this.currentMapUid + } + } + }); + this.records = this.records.filter(r => r.login !== data.login); tmc.server.emit("Plugin.Records.onRefresh", { records: clone(this.records), @@ -176,28 +146,17 @@ export default class Records extends Plugin { const login = data[0]; if (this.records.length == 0) { let ranking = await this.getRankingsForLogin(data); - const newRecord = new Record().fromScore({ + + const newRecord: Score = await Score.create({ login: login, - nickname: removeLinks(ranking.NickName), time: ranking.BestTime, - avgTime: ranking.BestTime, - totalFinishes: 1, checkpoints: ranking.BestCheckpoints.join(","), - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), + mapUuid: this.currentMapUid, }); + await newRecord.reload({include: Player}); newRecord.rank = 1; + this.records.push(newRecord); - await this.db?.insert(Score).values({ - login: newRecord.login, - time: newRecord.time, - avgTime: newRecord.avgTime, - totalFinishes: newRecord.totalFinishes, - checkpoints: newRecord.checkpoints, - createdAt: newRecord.createdAt, - updatedAt: newRecord.updatedAt, - mapUuid: this.currentMapUid - }); tmc.server.emit("Plugin.Records.onNewRecord", { oldRecord: null, record: clone(newRecord || {}), @@ -213,48 +172,25 @@ export default class Records extends Plugin { if (lastIndex >= this.limit && ranking.BestTime >= lastRecord.time) return; const time = ranking.BestTime; - const oldRecord = this.records.find(r => r.login === login); - if (oldRecord) { - if (ranking.BestTime >= oldRecord.time) return; - if (time < oldRecord.time) { - const newRecord = clone(oldRecord); - newRecord.nickname = removeLinks(ranking.NickName); - newRecord.avgTime = newRecord.avgTime + (time - newRecord.avgTime) / newRecord.totalFinishes; - newRecord.time = ranking.BestTime; - newRecord.checkpoints = ranking.BestCheckpoints.join(","); - newRecord.totalFinishes++; - newRecord.updatedAt = new Date().toISOString(); - await this.db?.update(Score).set({ - time: newRecord.time, - avgTime: newRecord.avgTime, - checkpoints: newRecord.checkpoints, - totalFinishes: newRecord.totalFinishes, - updatedAt: newRecord.updatedAt - }).where(and(eq(Score.login, login), eq(Score.mapUuid, this.currentMapUid))); - this.records[this.records.findIndex(r => r.login === login)] = newRecord; + const record = this.records.find(r => r.login === login); + let oldRecord = clone(record); + if (record) { + if (ranking.BestTime >= record.time) return; + if (time < record.time) { + record.update({ + time: ranking.BestTime, + checkpoints: ranking.BestCheckpoints.join(",") + }); + this.records[this.records.findIndex(r => r.login === login)] = record; } } else { - const newRecord = new Record().fromScore({ + const newRecord: Score = await Score.create({ login: login, - nickname: removeLinks(ranking.NickName), time: ranking.BestTime, - avgTime: ranking.BestTime, - totalFinishes: 1, checkpoints: ranking.BestCheckpoints.join(","), - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), + mapUuid: this.currentMapUid, }); this.records.push(newRecord); - await this.db?.insert(Score).values({ - login: newRecord.login, - time: newRecord.time, - avgTime: newRecord.avgTime, - totalFinishes: newRecord.totalFinishes, - checkpoints: newRecord.checkpoints, - createdAt: newRecord.createdAt, - updatedAt: newRecord.updatedAt, - mapUuid: this.currentMapUid - }); } // Sort records this.records.sort((a, b) => { @@ -272,12 +208,19 @@ export default class Records extends Plugin { } if (i >= this.limit) { tmc.cli(`Deleting record ${i} because it's out of limit.`); - await this.db?.delete(Score).where(and(eq(Score.login, this.records[i].login), eq(Score.mapUuid, this.currentMapUid))); + await Score.destroy({ + where: { + [Op.and]: { + login: this.records[i].login, + mapUuid: this.currentMapUid + } + } + }); } } this.records = this.records.slice(0, this.limit); tmc.server.emit("Plugin.Records.onUpdateRecord", { - oldRecord: clone(oldRecord || {}), + oldRecord: oldRecord || {}, record: clone(newRecord), records: clone(this.records) }); @@ -285,5 +228,4 @@ export default class Records extends Plugin { console.log(e); } } - } \ No newline at end of file diff --git a/core/plugins/widgets/records/index.ts b/core/plugins/widgets/records/index.ts index e667d4d..46ffceb 100644 --- a/core/plugins/widgets/records/index.ts +++ b/core/plugins/widgets/records/index.ts @@ -45,12 +45,12 @@ export default class RecordsWidget extends Plugin { async updateWidget() { let outRecords = []; let x = 0; - for (let record of this.records) { + for (const record of this.records) { if (x >= 10) break; outRecords.push( { rank: record.rank, - nickname: escape(record.nickname), + nickname: escape(record.player.nickname), time: formatTime(record.time).replace(/^0:/, ""), }); x += 1; @@ -60,7 +60,7 @@ export default class RecordsWidget extends Plugin { outRecords.push( { rank: lastRecord.Rank, - nickname: escape(lastRecord.NickName), + nickname: escape(lastRecord.player.nickname), time: formatTime(lastRecord.time).replace(/^0:/, ""), } ) diff --git a/core/schemas/map.model.ts b/core/schemas/map.model.ts new file mode 100644 index 0000000..7b966db --- /dev/null +++ b/core/schemas/map.model.ts @@ -0,0 +1,35 @@ + +import { Table, Column, Model, HasMany, PrimaryKey, Unique, Index, DataType, NotNull, AllowNull } from 'sequelize-typescript'; + +@Table({ tableName: "maps", timestamps: true }) +class Map extends Model { + @PrimaryKey + @Unique + @Column(DataType.STRING) + uuid: string | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + name: string | undefined; + + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + author: string |undefined; + + @Column(DataType.STRING) + authorNickname?: string | null; + + @NotNull + @AllowNull(false) + @Column(DataType.INTEGER) + authorTime: number |undefined; + + @Column(DataType.STRING) + environment?: string | null; + +} + +export default Map; \ No newline at end of file diff --git a/core/schemas/map.ts b/core/schemas/map.ts deleted file mode 100644 index 450017e..0000000 --- a/core/schemas/map.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { sql } from "drizzle-orm"; -import { index } from "drizzle-orm/sqlite-core"; -import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core"; - - -export const Map = sqliteTable("map", { - uuid: text("uuid").primaryKey().unique(), - name: text("name").notNull(), - author: text("author").notNull(), - authorNickname: text("author_nickname"), - authorTime: integer("author_time").notNull(), - environment: text("environment"), - createdAt: text("created_at").default(sql`CURRENT_TIMESTAMP`), - updatedAt: text("updated_at").default(sql`CURRENT_TIMESTAMP`), -}, (table) => { - return { - nameIdx: index("name_idx").on(table.name), - }; -}); \ No newline at end of file diff --git a/core/schemas/maplikes.model.ts b/core/schemas/maplikes.model.ts new file mode 100644 index 0000000..9627451 --- /dev/null +++ b/core/schemas/maplikes.model.ts @@ -0,0 +1,25 @@ +import { Table, Column, Model, HasMany, PrimaryKey, Unique, Index, DataType, NotNull, BelongsTo, HasOne, AllowNull } from 'sequelize-typescript'; + +@Table({ tableName: "maplikes", timestamps: true }) +class MapLikes extends Model { + @PrimaryKey + @Column(DataType.INTEGER) + id: number | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + mapUuid: string | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + login: string | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.FLOAT) + vote: number | undefined; +} + +export default MapLikes; diff --git a/core/schemas/maplikes.ts b/core/schemas/maplikes.ts deleted file mode 100644 index e45f3df..0000000 --- a/core/schemas/maplikes.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { sql } from "drizzle-orm"; -import { index } from "drizzle-orm/sqlite-core"; -import { sqliteTable, text, integer, real } from "drizzle-orm/sqlite-core"; -import { Map } from "./map"; -import { Player } from "./players"; - -export const MapLikes = sqliteTable("maplikes", { - id: integer("id").primaryKey(), - mapUuid: text("uuid").notNull().references(() => Map.uuid), - login: text("login").notNull().references(() => Player.login), - vote: real("vote").notNull(), - createdAt: text("created_at").default(sql`CURRENT_TIMESTAMP`), - updatedAt: text("updated_at").default(sql`CURRENT_TIMESTAMP`), -}, (table) => { - return { - - }; -}); \ No newline at end of file diff --git a/core/schemas/players.model.ts b/core/schemas/players.model.ts new file mode 100644 index 0000000..2446089 --- /dev/null +++ b/core/schemas/players.model.ts @@ -0,0 +1,26 @@ +import { Table, Column, Model, HasMany, PrimaryKey, Unique, Index, DataType, NotNull, AllowNull } from 'sequelize-typescript'; + + +@Table({ tableName: "players", timestamps: true }) +class Player extends Model { + @PrimaryKey + @Column(DataType.STRING) + login: string | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + nickname: string | undefined; + + @Column(DataType.STRING) + customNick?: string | null; + + @Column(DataType.BOOLEAN) + allowOverride?: boolean | null = true; + + @Column(DataType.STRING) + zone?: string | null; + +} + +export default Player; \ No newline at end of file diff --git a/core/schemas/players.ts b/core/schemas/players.ts deleted file mode 100644 index dc42e17..0000000 --- a/core/schemas/players.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { sql } from "drizzle-orm"; -import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core"; - -export const Player = sqliteTable("player", { - login: text("login").primaryKey().unique(), - nickname: text("nickname"), - customNick: text("custom_nick").default(""), - allowOverride: integer("nick_override").default(1), - createdAt: text("created_at").default(sql`CURRENT_TIMESTAMP`), - updatedAt: text("updated_at").default(sql`CURRENT_TIMESTAMP`) -}, (table) => { - return { - - }; -}); - diff --git a/core/schemas/scores.model.ts b/core/schemas/scores.model.ts new file mode 100644 index 0000000..108465f --- /dev/null +++ b/core/schemas/scores.model.ts @@ -0,0 +1,29 @@ +import { Table, Column, Model, PrimaryKey, Unique, Index, DataType, NotNull, AllowNull, HasOne, ForeignKey } from 'sequelize-typescript'; +import Player from './players.model'; + +@Table({ tableName: "scores", timestamps: true }) +class Score extends Model { + @PrimaryKey + @Unique + @Column(DataType.STRING) + mapUuid: string | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + @HasOne(() => Player, { as: "player", sourceKey: "login", foreignKey: "login" }) + login: string | undefined; + + @NotNull + @AllowNull(false) + @Column(DataType.STRING) + time: number | undefined; + + @Column(DataType.STRING) + checkpoints: string | undefined; + + @Column(DataType.VIRTUAL) + rank: number | null = null; +} + +export default Score; diff --git a/core/schemas/scores.ts b/core/schemas/scores.ts deleted file mode 100644 index e4e40db..0000000 --- a/core/schemas/scores.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { sql } from "drizzle-orm"; -import { index, foreignKey } from "drizzle-orm/sqlite-core"; -import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core"; -import { Player as player } from "./players"; -import { Map } from "./map"; - -export const Score = sqliteTable("records", { - mapUuid: text("map_uuid").notNull().references(() => Map.uuid), - login: text("login").notNull().references(() => player.login), - time: integer("time").notNull(), - checkpoints: text("checkpoints").notNull(), - avgTime: integer("avg_time").default(0), - totalFinishes: integer("finishes").default(1), - createdAt: text("created_at").default(sql`CURRENT_TIMESTAMP`), - updatedAt: text("updated_at").default(sql`CURRENT_TIMESTAMP`) -}, (table) => { - return { - uuidIdx: index("uuid_idx").on(table.mapUuid), - loginIdx: index("login_idx").on(table.login), - }; -}); \ No newline at end of file diff --git a/drizzle.config.js b/drizzle.config.js deleted file mode 100644 index 6b0c5a8..0000000 --- a/drizzle.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Config } from "drizzle-kit"; - -/** @type { import("drizzle-kit").Config } */ -export default { - dialect: "sqlite", - schema: ["./core/schemas/*.ts", "./userdata/schemas/*.ts"], - out: "./userdata/drizzle", - dbCredentials: { - url: "sqlite://userdata/local.sqlite", - }, - migration: { - table: "migrations" - } -} \ No newline at end of file diff --git a/migrate.ts b/migrate.ts new file mode 100644 index 0000000..5ee272a --- /dev/null +++ b/migrate.ts @@ -0,0 +1,37 @@ +import { Umzug, SequelizeStorage } from 'umzug'; +import { Sequelize } from 'sequelize'; +import log from './core/log'; + +const sequelize = new Sequelize(process.env['DATABASE'] ?? "", { + logging(sql, timing) { + log.info("$d7c" + sql); + }, +}); + +export const migrator = new Umzug({ + migrations: { + glob: ['migrations/*.ts', { cwd: process.cwd() }], + }, + context: sequelize, + storage: new SequelizeStorage({ + sequelize, + }), + logger: { + debug: (message) => { }, + error: (message) => { log.info("$f00" + message) }, + warn: (message) => { log.info("$fa0" + message) }, + info: (message) => { log.info("$5bf" + message.event + " $fff" + message.name) }, + } +}); + +export type Migration = typeof migrator._types.migration; + +(async () => { + try { + log.info("$fffMigrating:") + await migrator.up() + log.info("$fffMigrating ends!"); + } catch (e: any) { + log.error("$f00error occurred"); + } +})(); \ No newline at end of file diff --git a/migrations/00-create-map.ts b/migrations/00-create-map.ts new file mode 100644 index 0000000..a7172c7 --- /dev/null +++ b/migrations/00-create-map.ts @@ -0,0 +1,42 @@ +import { DataTypes } from 'sequelize'; +import type { Migration } from '../migrate'; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().createTable('maps', { + uuid: { + type: DataTypes.STRING, + allowNull: false, + primaryKey: true, + unique: true + }, + name: { + type: DataTypes.STRING, + allowNull: false, + }, + author: { + type: DataTypes.STRING, + allowNull: false + }, + authorNickname: { + type: DataTypes.STRING + }, + authorTime: { + type: DataTypes.INTEGER, + allowNull:false + }, + environment: { + type:DataTypes.STRING + }, + updatedAt: { + type: DataTypes.DATE + }, + createdAt: + { + type: DataTypes.DATE + } + }); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().dropTable('players'); +}; \ No newline at end of file diff --git a/migrations/00-create-maplikes.ts b/migrations/00-create-maplikes.ts new file mode 100644 index 0000000..aa7546c --- /dev/null +++ b/migrations/00-create-maplikes.ts @@ -0,0 +1,36 @@ +import { DataTypes } from 'sequelize'; +import type { Migration } from '../migrate'; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().createTable('maplikes', { + id: { + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + unique: true + }, + login: { + type: DataTypes.STRING, + allowNull: false, + }, + mapUuid: { + type: DataTypes.STRING, + allowNull:false + }, + vote: { + type: DataTypes.FLOAT, + allowNull: false + }, + updatedAt: { + type: DataTypes.DATE + }, + createdAt: + { + type: DataTypes.DATE + } + }); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().dropTable('players'); +}; \ No newline at end of file diff --git a/migrations/00-create-player.ts b/migrations/00-create-player.ts new file mode 100644 index 0000000..8aeb89e --- /dev/null +++ b/migrations/00-create-player.ts @@ -0,0 +1,36 @@ +import { DataTypes } from 'sequelize'; +import type { Migration } from '../migrate'; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().createTable('players', { + login: { + type: DataTypes.STRING, + allowNull: false, + primaryKey: true, + }, + nickname: { + type: DataTypes.STRING, + allowNull: false, + }, + customNick: { + type: DataTypes.STRING + }, + allowOverride: { + type: DataTypes.BOOLEAN + }, + zone: { + type:DataTypes.STRING + }, + updatedAt: { + type: DataTypes.DATE + }, + createdAt: + { + type: DataTypes.DATE + } + }); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().dropTable('players'); +}; \ No newline at end of file diff --git a/migrations/00-create-scores.ts b/migrations/00-create-scores.ts new file mode 100644 index 0000000..3b19443 --- /dev/null +++ b/migrations/00-create-scores.ts @@ -0,0 +1,35 @@ +import { DataTypes } from 'sequelize'; +import type { Migration } from '../migrate'; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().createTable('scores', { + mapUuid: { + type: DataTypes.STRING, + allowNull: false, + primaryKey: true, + unique: true + }, + login: { + type: DataTypes.STRING, + allowNull: false, + }, + time: { + type: DataTypes.INTEGER, + allowNull: false + }, + checkpoints: { + type: DataTypes.STRING + }, + updatedAt: { + type: DataTypes.DATE + }, + createdAt: + { + type: DataTypes.DATE + } + }); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().dropTable('players'); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 31d02e7..21bc2ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,28 +5,33 @@ "packages": { "": { "dependencies": { - "better-sqlite3": "11.1.1", "dependency-graph": "1.0.0", - "drizzle-kit": "0.22.8", - "drizzle-orm": "0.31.2", "iomem": "1.5.10", + "mysql2": "3.10.2", + "pg": "8.12.0", + "pg-hstore": "2.3.4", + "reflect-metadata": "^0.2.2", + "sequelize": "^6.37.3", + "sequelize-typescript": "^2.1.6", + "sqlite3": "5.1.7", "tm-essentials": "1.0.5", "tsx": "4.16.0", "twig": "1.17.1", + "umzug": "3.8.1", "xmlrpc": "1.3.2" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.10", - "@types/node": "^20.14.9", + "@types/better-sqlite3": "7.6.10", + "@types/node": "20.14.9", "@types/twig": "1.12.16", - "@types/xmlrpc": "^1.3.10", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@types/xmlrpc": "1.3.10", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "eslint": "8.57.0", - "eslint-plugin-drizzle": "^0.2.3" + "eslint-plugin-drizzle": "0.2.3" }, "peerDependencies": { - "typescript": "^5.5.2" + "typescript": "5.5.2" } }, "node_modules/@babel/runtime": { @@ -41,95 +46,6 @@ "node": ">=6.9.0" } }, - "node_modules/@esbuild-kit/core-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "license": "MIT", - "dependencies": { - "esbuild": "~0.18.20", - "source-map-support": "^0.5.21" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "license": "MIT", - "dependencies": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -214,6 +130,12 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -280,7 +202,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -294,7 +215,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -304,7 +224,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -314,16 +233,198 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.4.1.tgz", + "integrity": "sha512-WNnwdS8r9NZ/2K3u29tNoSRldscFa7SxU0RT+82B6Dy2I4Hl2MeCSKm4EXLXPKeNzLGvJ1cqbUhTLviSF8E6iA==", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.13.0.tgz", + "integrity": "sha512-Ou44Q2s81BqJu3dpYedAX54am9vn245F0HzqVrfJCMQk5pGgoKKOBOjkbfZC9QKcGNaECh6pwH2s5noJt7X6ew==", + "dependencies": { + "@rushstack/node-core-library": "5.4.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.22.0.tgz", + "integrity": "sha512-Qj28t6MO3HRgAZ72FDeFsrpdE6wBWxF3VENgvrXh7JF2qIT+CrXiOJIesW80VFZB9QwObSpkB1ilx794fGQg6g==", + "dependencies": { + "@rushstack/terminal": "0.13.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" + }, "node_modules/@types/better-sqlite3": { "version": "7.6.10", "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz", "integrity": "sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -331,11 +432,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -355,6 +460,11 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==" + }, "node_modules/@types/xmlrpc": { "version": "1.3.10", "resolved": "https://registry.npmjs.org/@types/xmlrpc/-/xmlrpc-1.3.10.tgz", @@ -570,6 +680,12 @@ "dev": true, "license": "ISC" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, "node_modules/acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", @@ -593,6 +709,43 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -610,11 +763,47 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -636,6 +825,26 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -679,17 +888,6 @@ ], "license": "MIT" }, - "node_modules/better-sqlite3": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.1.1.tgz", - "integrity": "sha512-bAlQQb7gwCgxNpDYafK0O4AaIOiTwA7srfqRtBbw0Nsiq6P+qxEYGl3hLw+9C5jX2FVjKW7oxkSouxlJ+3VX8A==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -724,7 +922,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -757,11 +954,55 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/callsites": { "version": "3.1.0", @@ -779,6 +1020,15 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -799,6 +1049,15 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -811,6 +1070,12 @@ "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==", "license": "MIT" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -874,6 +1139,20 @@ "dev": true, "license": "MIT" }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/dependency-graph": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", @@ -918,130 +1197,35 @@ "node": ">=6.0.0" } }, - "node_modules/drizzle-kit": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.22.8.tgz", - "integrity": "sha512-VjI4wsJjk3hSqHSa3TwBf+uvH6M6pRHyxyoVbt935GUzP9tUR/BRZ+MhEJNgryqbzN2Za1KP0eJMTgKEPsalYQ==", - "dependencies": { - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.19.7", - "esbuild-register": "^3.5.0" + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" }, - "bin": { - "drizzle-kit": "bin.cjs" + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/drizzle-orm": { - "version": "0.31.2", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.31.2.tgz", - "integrity": "sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg==", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=3", - "@electric-sql/pglite": ">=0.1.1", - "@libsql/client": "*", - "@neondatabase/serverless": ">=0.1", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/react": ">=18", - "@types/sql.js": "*", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=13.2.0", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "react": ">=18", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "react": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" } }, "node_modules/end-of-stream": { @@ -1053,56 +1237,21 @@ "once": "^1.4.0" } }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/esbuild-register": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", - "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" + "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1330,14 +1479,12 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1354,7 +1501,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -1381,7 +1527,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -1410,7 +1555,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -1470,13 +1614,72 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, "license": "ISC" }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-tsconfig": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", @@ -1495,6 +1698,27 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "license": "MIT" }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "devOptional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1508,6 +1732,28 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -1545,6 +1791,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -1556,12 +1807,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, "node_modules/hashring": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", @@ -1572,6 +1828,70 @@ "simple-lru-cache": "0.0.x" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1619,22 +1939,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "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.", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -1665,21 +2015,55 @@ "node": ">=16.0.0" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -1688,11 +2072,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -1708,13 +2097,23 @@ "node": ">=8" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, + "devOptional": true, "license": "ISC" }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1728,6 +2127,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1749,6 +2154,14 @@ "dev": true, "license": "MIT" }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -1799,6 +2212,11 @@ "yarn": ">= 1" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1806,11 +2224,62 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -1820,7 +2289,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -1867,18 +2335,173 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, + "node_modules/mysql2": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.2.tgz", + "integrity": "sha512-KCXPEvAkO0RcHPr362O5N8tFY2fXvbjfkPvRY/wGumh4EOemo9Hm5FjQZqv/pCmrnuxGu5OxnSENG0gTXqKMgQ==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -1892,6 +2515,15 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-abi": { "version": "3.65.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", @@ -1904,6 +2536,69 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1963,6 +2658,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1990,7 +2700,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2006,6 +2715,11 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2016,11 +2730,102 @@ "node": ">=8" } }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + }, + "node_modules/pg-hstore": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz", + "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==", + "dependencies": { + "underscore": "^1.13.1" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -2029,6 +2834,49 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pony-cause": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", + "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prebuild-install": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", @@ -2065,6 +2913,25 @@ "node": ">= 0.8.0" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -2079,7 +2946,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -2089,7 +2955,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -2144,12 +3009,41 @@ "node": ">= 6" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2169,11 +3063,24 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -2185,7 +3092,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -2197,57 +3104,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -2287,6 +3147,11 @@ ], "license": "MIT" }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -2305,6 +3170,143 @@ "node": ">=10" } }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/sequelize": { + "version": "6.37.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", + "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize-typescript": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/sequelize-typescript/-/sequelize-typescript-2.1.6.tgz", + "integrity": "sha512-Vc2N++3en346RsbGjL3h7tgAl2Y7V+2liYTAOZ8XL0KTw3ahFHsyAUzOwct51n+g70I1TOUDgs06Oh6+XGcFkQ==", + "dependencies": { + "glob": "7.2.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "@types/validator": "*", + "reflect-metadata": "*", + "sequelize": ">=6.20.1" + } + }, + "node_modules/sequelize-typescript/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sequelize-typescript/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sequelize-typescript/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2328,6 +3330,12 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -2388,23 +3396,99 @@ "node": ">=8" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "optional": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" } }, "node_modules/string_decoder": { @@ -2416,11 +3500,33 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -2455,6 +3561,33 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -2483,6 +3616,22 @@ "node": ">=6" } }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2500,7 +3649,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -2509,6 +3657,11 @@ "node": ">=8.0" } }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -2687,18 +3840,73 @@ "node": ">=14.17" } }, + "node_modules/umzug": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.1.tgz", + "integrity": "sha512-k0HjOc3b/s8vH24BUTvnaFiKhfWI9UQAGpqHDG+3866CGlBTB83Xs5wZ1io1mwYLj/GHvQ34AxKhbpYnWtkRJg==", + "dependencies": { + "@rushstack/ts-command-line": "^4.12.2", + "emittery": "^0.13.0", + "fast-glob": "^3.3.2", + "pony-cause": "^2.1.4", + "type-fest": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/umzug/node_modules/type-fest": { + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", + "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "devOptional": true, "license": "MIT" }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -2710,6 +3918,22 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/walk": { "version": "2.3.15", "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", @@ -2723,7 +3947,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2735,6 +3959,23 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -2774,6 +4015,19 @@ "npm": ">=1.0.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index af442e0..06deb76 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,27 @@ { "scripts": { - "dev": "drizzle-kit generate --config=drizzle.config.js && tsx --tsconfig ./tsconfig.json --env-file=.env --watch ./core/minicontrol.ts", - "dev2": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env2 --watch run core/minicontrol.ts", - "start": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env core/minicontrol.ts", - "start2": "drizzle-kit generate --config=drizzle.config.js && tsx --env-file=.env2 core/minicontrol.ts", - "up": "drizzle-kit up", - "daemon": "drizzle-kit generate --config=drizzle.config.js && pm2 start core/minicontrol.ts" + "dev": "tsx --tsconfig ./tsconfig.json --env-file=.env --watch ./core/minicontrol.ts", + "dev2": "tsx --env-file=.env2 --watch run core/minicontrol.ts", + "start": "tsx --env-file=.env core/minicontrol.ts", + "start2": "tsx --env-file=.env2 core/minicontrol.ts", + "migrate": "tsx --env-file=.env migrate.ts" }, "type": "module", "dependencies": { - "better-sqlite3": "11.1.1", "dependency-graph": "1.0.0", - "drizzle-kit": "0.22.8", - "drizzle-orm": "0.31.2", "iomem": "1.5.10", + "mysql2": "3.10.2", + "pg": "8.12.0", + "pg-hstore": "2.3.4", + "reflect-metadata": "^0.2.2", + "sequelize": "^6.37.3", + "sequelize-typescript": "^2.1.6", + "umzug": "3.8.1", + "sqlite3": "5.1.7", "tm-essentials": "1.0.5", + "tsx": "4.16.0", "twig": "1.17.1", - "xmlrpc": "1.3.2", - "tsx": "4.16.0" + "xmlrpc": "1.3.2" }, "devDependencies": { "@types/better-sqlite3": "7.6.10", @@ -33,7 +37,7 @@ "typescript": "5.5.2" }, "imports": { - "core": "./core/", - "schemas": "./core/schemas/" + "core": "./core/", + "schemas": "./core/schemas/" } -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json index 79af240..1063d4f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,11 @@ { "compilerOptions": { "lib": ["ESNext"], - "target": "ESNext", "module": "ESNext", "moduleDetection": "force", + "target": "es6", // or a more recent ecmascript version + "experimentalDecorators": true, + "emitDecoratorMetadata": true, "jsx": "react-jsx", "allowJs": true, "preserveSymlinks": true, From cdca13abf38a8a5ea23edb1dcb19c63c46931e3a Mon Sep 17 00:00:00 2001 From: reaby Date: Mon, 1 Jul 2024 21:26:56 +0300 Subject: [PATCH 12/35] fix --- core/plugins/records/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index fea5bd4..64204d5 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -51,9 +51,9 @@ export default class Records extends Plugin { records.push( { rank: record.rank, - nickname: escape(record.player.nickname??""), + nickname: escape(record.player.nickname ?? ""), login: record.login, - time: "$o" + formatTime(record.time??0), + time: "$o" + formatTime(record.time ?? 0), }); } const window = new RecordsWindow(login, this); @@ -153,9 +153,9 @@ export default class Records extends Plugin { checkpoints: ranking.BestCheckpoints.join(","), mapUuid: this.currentMapUid, }); - await newRecord.reload({include: Player}); + await newRecord.reload({ include: Player }); newRecord.rank = 1; - + this.records.push(newRecord); tmc.server.emit("Plugin.Records.onNewRecord", { oldRecord: null, @@ -190,6 +190,7 @@ export default class Records extends Plugin { checkpoints: ranking.BestCheckpoints.join(","), mapUuid: this.currentMapUid, }); + await newRecord.reload({ include: Player }); this.records.push(newRecord); } // Sort records From 94d9a39aa4fb58e95d8e24cb17f1cd1bcc9958e9 Mon Sep 17 00:00:00 2001 From: reaby Date: Mon, 1 Jul 2024 21:47:08 +0300 Subject: [PATCH 13/35] automatically migrate on database connect --- core/plugins/database/index.ts | 34 ++++++++++++++++++++++++++++++---- migrate.ts | 1 + 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index f383686..638cb09 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -4,22 +4,48 @@ import Plugin from '../../plugins'; import { chunkArray } from '../../utils'; import Map from '../../schemas/map.model'; import Player from '../../schemas/players.model'; +import { MigrationError, SequelizeStorage, Umzug } from 'umzug'; export default class GenericDb extends Plugin { async onLoad() { + let sequelize; try { - const sequelize = new Sequelize(process.env['DATABASE'] ?? "", { + sequelize = new Sequelize(process.env['DATABASE'] ?? "", { logging(sql, timing) { tmc.debug(`$d7c${sql}`); }, }); + tmc.cli("¤info¤Trying to connect database...") + await sequelize.authenticate(); + tmc.cli("¤success¤Success!"); + } catch (e: any) { + tmc.cli("¤error¤" + e.message); + process.exit(1); + } + try { + const migrator = new Umzug({ + migrations: { + glob: ['migrations/*.ts', { cwd: process.cwd() }], + }, + context: sequelize, + storage: new SequelizeStorage({ + sequelize, + }), + logger: { + debug: (message) => { }, + error: (message) => { tmc.cli("$f00" + message) }, + warn: (message) => { tmc.cli("$fa0" + message) }, + info: (message) => { tmc.cli("$5bf" + message.event + " $fff" + message.name) }, + } + }); + tmc.cli("¤info¤Running migrates..."); + await migrator.up(); + tmc.cli("¤success¤Success!"); + sequelize.addModels([Map, Player]); - await sequelize.authenticate(); tmc.storage['db'] = sequelize; - - tmc.cli("¤success¤Database connected."); tmc.server.addListener("TMC.PlayerConnect", this.onPlayerConnect, this); tmc.server.addListener("Trackmania.MapListModified", this.onMapListModified, this); } catch (e: any) { diff --git a/migrate.ts b/migrate.ts index 5ee272a..8584330 100644 --- a/migrate.ts +++ b/migrate.ts @@ -31,6 +31,7 @@ export type Migration = typeof migrator._types.migration; log.info("$fffMigrating:") await migrator.up() log.info("$fffMigrating ends!"); + process.exit(0); } catch (e: any) { log.error("$f00error occurred"); } From 80a12a6978db332812fab93f821e15ce5ab3ca89 Mon Sep 17 00:00:00 2001 From: reaby Date: Wed, 3 Jul 2024 16:57:50 +0300 Subject: [PATCH 14/35] add migrate userdata/migrations and few fixes --- .gitignore | 5 +++- core/log.ts | 3 ++- core/minicontrol.ts | 27 ++++++++++++-------- core/plugins/database/index.ts | 42 ++++++++++++++++--------------- core/plugins/healthcheck/index.ts | 8 +++++- core/utils.ts | 28 ++++++++++++++++++++- userdata/migrations/.gitkeep | 0 7 files changed, 78 insertions(+), 35 deletions(-) create mode 100644 userdata/migrations/.gitkeep diff --git a/.gitignore b/.gitignore index 3c46017..4cdf53d 100644 --- a/.gitignore +++ b/.gitignore @@ -136,6 +136,9 @@ userdata/*.sqlite userdata/*.log userdata/*.json userdata/plugins/* -userdata/drizzle/* +userdata/migrations/* +userdata/schemas/* +!userdata/schemas/.gitkeep +!userdata/migrations/.gitkeep !userdata/plugins/.gitkeep docker-compose.yml diff --git a/core/log.ts b/core/log.ts index 6224faa..b77de40 100644 --- a/core/log.ts +++ b/core/log.ts @@ -75,7 +75,8 @@ class log { console.log(Tm2Console(str, this.ansiLevel)); } info(str: string) { - console.log(Tm2Console(str, this.ansiLevel)); + const date = new Date(); + console.log(Tm2Console(`$555[${date.toISOString()}] $z` + str, this.ansiLevel)); } warn(str: string) { console.log(Tm2Console(str, this.ansiLevel)); diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 963eb1b..7e7c931 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -152,7 +152,7 @@ class MiniControl { return; } let plugin = null; - if(process.platform === "win32") { + if (process.platform === "win32") { plugin = await import("file:///" + process.cwd() + "/" + pluginPath); } else { plugin = await import(process.cwd() + "/" + pluginPath); @@ -201,14 +201,19 @@ class MiniControl { } // load and init the plugin - const cls = new plugin.default(); - this.plugins[name] = cls; - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ loaded.`; - await cls.onLoad(); - this.cli(msg); - if (this.startComplete) { - this.chat(msg); - await cls.onStart(); + try { + tmc.cli(`¤gray¤Loading ¤cmd¤${name}¤white¤...`) + const cls = new plugin.default(); + this.plugins[name] = cls; + await cls.onLoad(); + if (this.startComplete) { + await cls.onStart(); + this.chat(`¤gray¤Plugin ¤cmd¤${name} ¤white¤loaded!`); + } + this.cli("¤gray¤Success."); + } catch (e: any) { + tmc.cli("¤gray¤Error while starting plugin ¤cmd¤" + name); + console.log(e); } } else { const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ already loaded.`; @@ -279,7 +284,7 @@ class MiniControl { * @param object The object to log. */ debug(object: any) { - if (process.env.DEBUG == "true") log.info(processColorString(object.toString())); + if (process.env.DEBUG == "true") log.debug(processColorString(object.toString())); } /** @@ -380,7 +385,7 @@ class MiniControl { continue; } let cls = null; - if(process.platform === "win32") { + if (process.platform === "win32") { cls = await import("file:///" + process.cwd() + "/" + pluginName); } else { cls = await import(process.cwd() + "/" + pluginName); diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index 638cb09..7e17101 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -5,6 +5,7 @@ import { chunkArray } from '../../utils'; import Map from '../../schemas/map.model'; import Player from '../../schemas/players.model'; import { MigrationError, SequelizeStorage, Umzug } from 'umzug'; +import { removeColors } from '../../utils'; export default class GenericDb extends Plugin { @@ -13,7 +14,7 @@ export default class GenericDb extends Plugin { try { sequelize = new Sequelize(process.env['DATABASE'] ?? "", { logging(sql, timing) { - tmc.debug(`$d7c${sql}`); + tmc.debug(`$d7c${removeColors(sql)}`); }, }); tmc.cli("¤info¤Trying to connect database...") @@ -25,25 +26,26 @@ export default class GenericDb extends Plugin { } try { - const migrator = new Umzug({ - migrations: { - glob: ['migrations/*.ts', { cwd: process.cwd() }], - }, - context: sequelize, - storage: new SequelizeStorage({ - sequelize, - }), - logger: { - debug: (message) => { }, - error: (message) => { tmc.cli("$f00" + message) }, - warn: (message) => { tmc.cli("$fa0" + message) }, - info: (message) => { tmc.cli("$5bf" + message.event + " $fff" + message.name) }, - } - }); - tmc.cli("¤info¤Running migrates..."); - await migrator.up(); - tmc.cli("¤success¤Success!"); - + for (const path of ["./migrations/", "./userdata/migrations/"]) { + const migrator = new Umzug({ + migrations: { + glob: [path + '*.ts', { cwd: process.cwd() }], + }, + context: sequelize, + storage: new SequelizeStorage({ + sequelize, + }), + logger: { + debug: (message) => { }, + error: (message) => { tmc.cli("$f00" + message) }, + warn: (message) => { tmc.cli("$fa0" + message) }, + info: (message) => { tmc.cli("$5bf" + message.event + " $fff" + message.name) }, + } + }); + tmc.cli("¤info¤Running migrations for " + path); + await migrator.up(); + tmc.cli("¤success¤Success!"); + } sequelize.addModels([Map, Player]); tmc.storage['db'] = sequelize; tmc.server.addListener("TMC.PlayerConnect", this.onPlayerConnect, this); diff --git a/core/plugins/healthcheck/index.ts b/core/plugins/healthcheck/index.ts index 185c581..1a6de3b 100644 --- a/core/plugins/healthcheck/index.ts +++ b/core/plugins/healthcheck/index.ts @@ -1,13 +1,19 @@ import { Server, type Socket } from "net"; import Plugin from ".."; +import { isDocker } from "../../utils"; export default class HealthCheck extends Plugin { server: Server | null = null; async onLoad() { - this.server = new Server((socket: Socket) => { + if (!isDocker()) { + tmc.cli("¤info¤HealthCheck: disabled, docker not detected."); + return; + } + tmc.cli("¤info¤HealthCheck: enabled, docker detected."); + this.server = new Server((socket: Socket) => { socket.on("error", (error: any) => { tmc.cli(`¤error¤HealthCheck: ${error.message}`); }) diff --git a/core/utils.ts b/core/utils.ts index 617dc4b..4807751 100644 --- a/core/utils.ts +++ b/core/utils.ts @@ -1,4 +1,5 @@ import tm from 'tm-essentials'; +import fs from 'fs'; export function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); @@ -127,4 +128,29 @@ export function memInfo(section = "") { const out = section + "¤white¤" + memMB.toFixed(1) + "Mb " + prefix + Math.abs(memMB - prevValueMem).toFixed(1) + 'Mb ¤white¤(' + (memMB - startValueMem).toFixed(1) + "Mb)"; prevValueMem = memMB; return processColorString(out); -} \ No newline at end of file +} + +export function isDocker() { + const hasEnv = () => { + try { + fs.statSync('/.dockerenv'); + return true; + } catch { + return false; + } + }; + const hasGroup = () => { + try { + return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); + } catch { + return false; + } + } + + return hasEnv() || hasGroup(); +} + + + + + diff --git a/userdata/migrations/.gitkeep b/userdata/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 From 3415b13bfdf4e656a463d45dd37ca58f0020c35c Mon Sep 17 00:00:00 2001 From: reaby Date: Thu, 4 Jul 2024 19:24:31 +0300 Subject: [PATCH 15/35] fix xaseco migrate --- tools/xaseco.ts | 62 --------------- xaseco.ts | 201 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+), 62 deletions(-) delete mode 100644 tools/xaseco.ts create mode 100644 xaseco.ts diff --git a/tools/xaseco.ts b/tools/xaseco.ts deleted file mode 100644 index b4ee513..0000000 --- a/tools/xaseco.ts +++ /dev/null @@ -1,62 +0,0 @@ - -import Database from 'better-sqlite3'; -import { readFileSync } from 'fs'; - -async function main() { - const sqlite = new Database(__dirname + '/../userdata/local.sqlite'); - sqlite.pragma('journal_mode = WAL'); - const xasecoDb = new Database(":memory:"); - if (process.argv.length < 3) { - console.log("Usage: bun xaseco.ts "); - return; - } - if (!process.argv[2].endsWith(".sql")) { - console.log("Invalid file extension. Must be a .sql file."); - return; - } - let sql = readFileSync(process.argv[2], 'utf-8'); - sql = sql.replaceAll("int(11) NOT NULL AUTO_INCREMENT", "INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT").replaceAll("mediumint(9) NOT NULL AUTO_INCREMENT", "INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT").replaceAll(/PRIMARY KEY \(`.*?`\),/g, ""); - sql = sql.replaceAll(/UNIQUE KEY `.*?` \((.*?)\),?/g, 'UNIQUE ($1)').replaceAll(/KEY `(.*?)` \(`.*?`\),?/g, ""); - sql = sql.replaceAll(/(UN)?LOCK TABLES.*?;/g, "").replaceAll(/ENGINE=.*?;/g, ";").replaceAll(/[\\]'(?!,)/g, '`').replaceAll("unsigned", ""); - sql = sql.replaceAll("CHARACTER SET utf8 COLLATE utf8_bin", "").replaceAll(/COMMENT .*?,/g, ",").replaceAll("enum('true','false')", "text"); - sql = sql.replaceAll(/,(\s*?)(\)|$)/g, "$2").replaceAll(/,(\s*?)$/g, "").replaceAll(/,(\s*?)\)/g, ")"); - xasecoDb.exec(sql); - - let maps: any = {}; - let players: any = {}; - console.log("Migrating XAseco database to MINIcontrol..."); - console.log("Please wait and do not interrupt the process..."); - console.log("Processing maps...") - const dbMaps: any = xasecoDb.prepare("SELECT * FROM challenges").all(); - console.log("Total: " + dbMaps.length); - for (const map of dbMaps) { - maps[map.Id] = map.Uid; - sqlite.exec(`INSERT OR IGNORE INTO map ("uuid", "name", "author", "author_time", "environment") VALUES ('${map.Uid}', '${map.Name}', '${map.Author}', -1, '${map.Environment}')`); - } - console.log("Processing players..."); - const dbPlayers: any = xasecoDb.prepare("SELECT * FROM players").all(); - console.log("Total: " + dbPlayers.length); - for (const player of dbPlayers) { - players[player.Id] = player.Login; - sqlite.exec(`INSERT OR IGNORE INTO player (login, nickname, custom_nick, nick_override, created_at, updated_at) VALUES ('${player.Login}', '${player.NickName}', '', 1, '${player.UpdatedAt}', '${player.UpdatedAt}')`); - } - console.log("Processing records..."); - const dbRecords: any = xasecoDb.prepare("SELECT * FROM records").all(); - console.log("Total: " + dbRecords.length); - for (const record of dbRecords) { - if (!players[record.PlayerId]) continue; - sqlite.exec(`INSERT OR IGNORE INTO records (map_uuid, player, time, checkpoints, avg_time, finishes, created_at, updated_at) VALUES ('${maps[record.ChallengeId]}', '${players[record.PlayerId]}', ${record.Score}, '${record.Checkpoints}', 0, 1, '${record.CreatedAt}', '${record.UpdatedAt}')`); - } - console.log("Processing karma..."); - const dbKarma: any = xasecoDb.prepare("SELECT * FROM rs_karma").all(); - console.log("Total: " + dbKarma.length); - for (const k of dbKarma) { - if (!players[k.PlayerId]) continue; - let value = 0; - k.Score > 0 ? value = 1.0 : value = -1.0; - sqlite.exec(`INSERT OR IGNORE INTO maplikes (uuid, login, vote, created_at, updated_at) VALUES ('${maps[k.ChallengeId]}', '${players[k.PlayerId]}', ${value}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`); - } - console.log("Migration complete."); -} - -main(); diff --git a/xaseco.ts b/xaseco.ts new file mode 100644 index 0000000..6731553 --- /dev/null +++ b/xaseco.ts @@ -0,0 +1,201 @@ + +import sqlite3 from 'sqlite3'; +import { readFileSync } from 'fs'; +import { Sequelize } from 'sequelize-typescript'; +import { removeColors, chunkArray } from './core/utils'; +import log from './core/log'; +import Map from './core/schemas/map.model'; +import Player from './core/schemas/players.model'; +import MapLikes from './core/schemas/maplikes.model'; +import Score from './core/schemas/scores.model'; +import { SequelizeStorage, Umzug } from 'umzug'; + +const sqlite = sqlite3.verbose() +const xasecoDb = new sqlite.Database(":memory:"); + +async function query(sql: string): Promise { + const res = await new Promise((resolve, reject) => { + xasecoDb.all(sql, (err: any, rows: any) => { + if (err) { + reject(err); + } else { + resolve(rows); + } + }); + }); + return res; +} + + +async function init() { + let sequelize; + try { + sequelize = new Sequelize(process.env['DATABASE'] ?? "", { + logging(sql, timing) { + log.info(`$d7c${removeColors(sql)}`); + }, + }); + log.info("$5bfTrying to connect migrate database...") + await sequelize.authenticate(); + log.info("$0f0Success!"); + } catch (e: any) { + log.info("$f00" + e.message); + process.exit(1); + } + + try { + for (const path of ["./migrations/", "./userdata/migrations/"]) { + const migrator = new Umzug({ + migrations: { + glob: [path + '*.ts', { cwd: process.cwd() }], + }, + context: sequelize, + storage: new SequelizeStorage({ + sequelize, + }), + logger: { + debug: (message) => { }, + error: (message) => { log.info("$f00" + message) }, + warn: (message) => { log.info("$fa0" + message) }, + info: (message) => { log.info("$5bf" + message.event + " $fff" + message.name) }, + } + }); + log.info("$5bfRunning migrations for " + path); + await migrator.up(); + log.info("$0f0Success!"); + } + sequelize.addModels([Map, Player, MapLikes, Score]); + } catch (e: any) { + log.info("$f00" + e.message); + process.exit(1); + } +} +async function main() { + if (process.argv.length < 3) { + log.info("Usage: tsx --env-file=.env xaseco.ts "); + return; + } + + if (!process.argv[2].endsWith(".sql")) { + log.info("Invalid file extension. Must be a .sql file."); + return; + } + + await init(); + let sql = readFileSync(process.argv[2], 'utf-8'); + sql = sql.replaceAll("int(11) NOT NULL AUTO_INCREMENT", "INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT").replaceAll("mediumint(9) NOT NULL AUTO_INCREMENT", "INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT").replaceAll(/PRIMARY KEY \(`.*?`\),/g, ""); + sql = sql.replaceAll(/UNIQUE KEY `.*?` \((.*?)\),?/g, 'UNIQUE ($1)').replaceAll(/KEY `(.*?)` \(`.*?`\),?/g, ""); + sql = sql.replaceAll(/(UN)?LOCK TABLES.*?;/g, "").replaceAll(/ENGINE=.*?;/g, ";").replaceAll(/[\\]'(?!,)/g, '`').replaceAll("unsigned", ""); + sql = sql.replaceAll("CHARACTER SET utf8 COLLATE utf8_bin", "").replaceAll(/COMMENT .*?,/g, ",").replaceAll("enum('true','false')", "text"); + sql = sql.replaceAll(/,(\s*?)(\)|$)/g, "$2").replaceAll(/,(\s*?)$/g, "").replaceAll(/,(\s*?)\)/g, ")"); + + const answer: any = await new Promise((resolve, reject) => { + xasecoDb.exec(sql, (err: any) => { + if (err) { + reject(err); + } else { + resolve(null); + } + }); + }); + + let maps: any = {}; + let players: any = {}; + log.info("$5bfMigrating $fffXAseco $5bfdatabase to $fffMINIcontrol..."); + log.info("$5bfPlease wait and do not interrupt the process..."); + log.info("$5bfProcessing maps...") + const dbMaps: any = await query("SELECT * FROM challenges;"); + log.info("Total: " + dbMaps.length); + let outMaps = []; + for (const map of dbMaps) { + maps[map.Id] = map.Uid; + outMaps.push({ + uuid: map.Uid, + name: map.Name, + author: map.Author, + authorTime: -1, + environment: map.Environment + }); + } + try { + for (const maps of chunkArray(outMaps, 500)) { + await Map.bulkCreate(maps); + } + } catch (e: any) { + log.info("$f00Error " + e.message); + process.exit(1); + } + outMaps = []; + + log.info("$5bfProcessing players..."); + const dbPlayers: any = await query("SELECT DISTINCT Login, NickName, UpdatedAt FROM players;"); + log.info("Total: " + dbPlayers.length); + let outPlayers = []; + for (const player of dbPlayers) { + players[player.Id] = player.Login; + outPlayers.push({ + login: player.Login, + nickname: player.NickName, + createdAt: player.UpdatedAt, + updatedAt: player.UpdatedAt + }); + } + try { + for (const tempPlayers of chunkArray(outPlayers, 500)) { + await Player.bulkCreate(tempPlayers); + } + } catch (e: any) { + log.info("$f00Error " + e.message); + process.exit(1); + } + outPlayers = []; + log.info("$5bfProcessing records..."); + const dbRecords: any = await query("SELECT * FROM records;"); + log.info("Total: " + dbRecords.length); + let outRecords = []; + for (const record of dbRecords) { + if (!players[record.PlayerId]) continue; + outRecords.push({ + mapUuid: maps[record.ChallengeId], + login: players[record.PlayerId], + time: record.Score, + checkpoints: record.Checkpoints, + createdAt: record.CreatedAt, + updatedAt: record.UpdatedAt + }); + } + try { + for (const tempRecords of chunkArray(outRecords, 500)) { + await Player.bulkCreate(tempRecords); + } + } catch (e: any) { + log.info("$f00Error " + e.message); + process.exit(1); + } + outRecords = []; + log.info("$5bfProcessing karma..."); + const dbKarma: any = await query("SELECT * FROM rs_karma;"); + log.info("Total: " + dbKarma.length); + let outKarma = []; + for (const k of dbKarma) { + if (!players[k.PlayerId]) continue; + let value = 0; + k.Score > 0 ? value = 1.0 : value = -1.0; + outKarma.push({ + uuid: maps[k.ChallengeId], + login: players[k.PlayerId], + vote: value + }); + } + try { + for (const tempKarma of chunkArray(outKarma, 500)) { + await MapLikes.bulkCreate(tempKarma); + } + } catch (e: any) { + log.info("$f00Error " + e.message); + process.exit(1); + } + log.info("$5bfMigration $0f0complete"); +} + +main(); From 69edd6cc19748f6daa222b9b3bacc6dd21c8e791 Mon Sep 17 00:00:00 2001 From: reaby Date: Fri, 5 Jul 2024 02:20:47 +0300 Subject: [PATCH 16/35] fix plugin unload --- core/minicontrol.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 7e7c931..59c8123 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -10,6 +10,7 @@ import fs from 'fs'; import Plugin from './plugins'; import path from 'path'; import { DepGraph } from "dependency-graph"; +import { require } from 'tsx/cjs/api' export interface GameStruct { Name: string; @@ -17,6 +18,7 @@ export interface GameStruct { Build?: string; } + /** * MiniControl class */ From 6f4f898ddd671930b5ba0fe940dedb490b53104d Mon Sep 17 00:00:00 2001 From: reaby Date: Fri, 5 Jul 2024 13:39:18 +0300 Subject: [PATCH 17/35] fix scores migration --- migrations/00-create-scores.ts | 3 +-- xaseco.ts | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/migrations/00-create-scores.ts b/migrations/00-create-scores.ts index 3b19443..775cf20 100644 --- a/migrations/00-create-scores.ts +++ b/migrations/00-create-scores.ts @@ -6,8 +6,7 @@ export const up: Migration = async ({ context: sequelize }) => { mapUuid: { type: DataTypes.STRING, allowNull: false, - primaryKey: true, - unique: true + primaryKey: true, }, login: { type: DataTypes.STRING, diff --git a/xaseco.ts b/xaseco.ts index 6731553..18f36e7 100644 --- a/xaseco.ts +++ b/xaseco.ts @@ -160,7 +160,6 @@ async function main() { login: players[record.PlayerId], time: record.Score, checkpoints: record.Checkpoints, - createdAt: record.CreatedAt, updatedAt: record.UpdatedAt }); } From ebd06625d5cca064e955090c7fe08d7eb5f08ccd Mon Sep 17 00:00:00 2001 From: reaby Date: Fri, 5 Jul 2024 13:39:53 +0300 Subject: [PATCH 18/35] fix migrate down --- migrations/00-create-map.ts | 2 +- migrations/00-create-maplikes.ts | 2 +- migrations/00-create-scores.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/migrations/00-create-map.ts b/migrations/00-create-map.ts index a7172c7..09abd01 100644 --- a/migrations/00-create-map.ts +++ b/migrations/00-create-map.ts @@ -38,5 +38,5 @@ export const up: Migration = async ({ context: sequelize }) => { }; export const down: Migration = async ({ context: sequelize }) => { - await sequelize.getQueryInterface().dropTable('players'); + await sequelize.getQueryInterface().dropTable('maps'); }; \ No newline at end of file diff --git a/migrations/00-create-maplikes.ts b/migrations/00-create-maplikes.ts index aa7546c..cf56679 100644 --- a/migrations/00-create-maplikes.ts +++ b/migrations/00-create-maplikes.ts @@ -32,5 +32,5 @@ export const up: Migration = async ({ context: sequelize }) => { }; export const down: Migration = async ({ context: sequelize }) => { - await sequelize.getQueryInterface().dropTable('players'); + await sequelize.getQueryInterface().dropTable('maplikes'); }; \ No newline at end of file diff --git a/migrations/00-create-scores.ts b/migrations/00-create-scores.ts index 775cf20..56bd594 100644 --- a/migrations/00-create-scores.ts +++ b/migrations/00-create-scores.ts @@ -30,5 +30,5 @@ export const up: Migration = async ({ context: sequelize }) => { }; export const down: Migration = async ({ context: sequelize }) => { - await sequelize.getQueryInterface().dropTable('players'); + await sequelize.getQueryInterface().dropTable('scores'); }; \ No newline at end of file From 991a41f0651a76aee4d2cad59cf9ec566b0e22cd Mon Sep 17 00:00:00 2001 From: reaby Date: Fri, 5 Jul 2024 14:12:58 +0300 Subject: [PATCH 19/35] fixes for xaseco migration --- migrations/00-create-map.ts | 3 +-- migrations/00-create-maplikes.ts | 4 ++-- migrations/00-create-scores.ts | 6 +++++- xaseco.ts | 22 +++++++++++++--------- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/migrations/00-create-map.ts b/migrations/00-create-map.ts index 09abd01..e2a7399 100644 --- a/migrations/00-create-map.ts +++ b/migrations/00-create-map.ts @@ -6,8 +6,7 @@ export const up: Migration = async ({ context: sequelize }) => { uuid: { type: DataTypes.STRING, allowNull: false, - primaryKey: true, - unique: true + primaryKey: true, }, name: { type: DataTypes.STRING, diff --git a/migrations/00-create-maplikes.ts b/migrations/00-create-maplikes.ts index cf56679..3f587ee 100644 --- a/migrations/00-create-maplikes.ts +++ b/migrations/00-create-maplikes.ts @@ -5,9 +5,9 @@ export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('maplikes', { id: { type: DataTypes.INTEGER, + autoIncrement: true, allowNull: false, - primaryKey: true, - unique: true + primaryKey: true, }, login: { type: DataTypes.STRING, diff --git a/migrations/00-create-scores.ts b/migrations/00-create-scores.ts index 56bd594..91f39bc 100644 --- a/migrations/00-create-scores.ts +++ b/migrations/00-create-scores.ts @@ -3,10 +3,14 @@ import type { Migration } from '../migrate'; export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('scores', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, mapUuid: { type: DataTypes.STRING, allowNull: false, - primaryKey: true, }, login: { type: DataTypes.STRING, diff --git a/xaseco.ts b/xaseco.ts index 18f36e7..dbea148 100644 --- a/xaseco.ts +++ b/xaseco.ts @@ -1,7 +1,7 @@ import sqlite3 from 'sqlite3'; import { readFileSync } from 'fs'; -import { Sequelize } from 'sequelize-typescript'; +import { Sequelize, UpdatedAt } from 'sequelize-typescript'; import { removeColors, chunkArray } from './core/utils'; import log from './core/log'; import Map from './core/schemas/map.model'; @@ -75,7 +75,7 @@ async function main() { log.info("Usage: tsx --env-file=.env xaseco.ts "); return; } - + if (!process.argv[2].endsWith(".sql")) { log.info("Invalid file extension. Must be a .sql file."); return; @@ -104,7 +104,7 @@ async function main() { log.info("$5bfMigrating $fffXAseco $5bfdatabase to $fffMINIcontrol..."); log.info("$5bfPlease wait and do not interrupt the process..."); log.info("$5bfProcessing maps...") - const dbMaps: any = await query("SELECT * FROM challenges;"); + const dbMaps: any = await query("SELECT Id, * FROM challenges;"); log.info("Total: " + dbMaps.length); let outMaps = []; for (const map of dbMaps) { @@ -118,17 +118,16 @@ async function main() { }); } try { - for (const maps of chunkArray(outMaps, 500)) { - await Map.bulkCreate(maps); + for (const mapp of chunkArray(outMaps, 500)) { + await Map.bulkCreate(mapp); } } catch (e: any) { log.info("$f00Error " + e.message); process.exit(1); } outMaps = []; - log.info("$5bfProcessing players..."); - const dbPlayers: any = await query("SELECT DISTINCT Login, NickName, UpdatedAt FROM players;"); + const dbPlayers: any = await query("SELECT DISTINCT Login, Id, NickName, UpdatedAt FROM players;"); log.info("Total: " + dbPlayers.length); let outPlayers = []; for (const player of dbPlayers) { @@ -165,7 +164,7 @@ async function main() { } try { for (const tempRecords of chunkArray(outRecords, 500)) { - await Player.bulkCreate(tempRecords); + await Score.bulkCreate(tempRecords); } } catch (e: any) { log.info("$f00Error " + e.message); @@ -176,13 +175,18 @@ async function main() { const dbKarma: any = await query("SELECT * FROM rs_karma;"); log.info("Total: " + dbKarma.length); let outKarma = []; + const date = Date.now(); for (const k of dbKarma) { if (!players[k.PlayerId]) continue; + if (!maps[k.ChallengeId]) continue; let value = 0; k.Score > 0 ? value = 1.0 : value = -1.0; + if (k.Score == 0) value = 0.; outKarma.push({ - uuid: maps[k.ChallengeId], + mapUuid: maps[k.ChallengeId], login: players[k.PlayerId], + createdAt: date, + updatedAt: date, vote: value }); } From f57599bc4a368c02bf0308267fa3c2431805ecf8 Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 6 Jul 2024 17:15:30 +0300 Subject: [PATCH 20/35] fix records --- core/plugins/database/index.ts | 6 ++++++ core/plugins/records/index.ts | 36 +++++++++++++++++++++++----------- core/schemas/scores.model.ts | 4 +++- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index 7e17101..a82131d 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -11,6 +11,12 @@ export default class GenericDb extends Plugin { async onLoad() { let sequelize; + const dbString = (process.env['DATABASE'] ?? "").split("://", 1)[0]; + if (!["sqlite", "mysql", "postgres"].includes(dbString)) { + tmc.cli("¤error¤Seems you .env is missing 'DATABASE=' define or the database not sqlite, mysql or postgres"); + process.exit(1); + } + try { sequelize = new Sequelize(process.env['DATABASE'] ?? "", { logging(sql, timing) { diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index 64204d5..9e82de4 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -142,11 +142,10 @@ export default class Records extends Plugin { } async onPlayerFinish(data: any) { + const login = data[0]; try { - const login = data[0]; if (this.records.length == 0) { let ranking = await this.getRankingsForLogin(data); - const newRecord: Score = await Score.create({ login: login, time: ranking.BestTime, @@ -170,7 +169,7 @@ export default class Records extends Plugin { let ranking = await this.getRankingsForLogin(data); - if (lastIndex >= this.limit && ranking.BestTime >= lastRecord.time) return; + if (lastIndex >= this.limit && lastRecord && ranking.BestTime >= lastRecord.time) return; const time = ranking.BestTime; const record = this.records.find(r => r.login === login); let oldRecord = clone(record); @@ -184,28 +183,42 @@ export default class Records extends Plugin { this.records[this.records.findIndex(r => r.login === login)] = record; } } else { - const newRecord: Score = await Score.create({ + await Score.create({ + mapUuid: this.currentMapUid, login: login, time: ranking.BestTime, checkpoints: ranking.BestCheckpoints.join(","), - mapUuid: this.currentMapUid, }); - await newRecord.reload({ include: Player }); + const newRecord = await Score.findOne( + { + where: { + [Op.and]: { + login: login, + mapUuid: this.currentMapUid + } + }, + include: Player + } + ); this.records.push(newRecord); } // Sort records this.records.sort((a, b) => { + if (a.time === b.time) { - return a.updatedAt.localeCompare(b.updatedAt); + const str = a.updatedAt.toString(); + return str.localeCompare(b.updatedAt.toString()); } return a.time - b.time; }); + // Update ranks - let newRecord = {}; + let outRecord = {}; for (let i = 0; i < this.records.length; i++) { this.records[i].rank = i + 1; - if (this.records[i].login === login) { - newRecord = this.records[i]; + console.log(this.records[i].login); + if (this.records[i].login == login) { + outRecord = this.records[i]; } if (i >= this.limit) { tmc.cli(`Deleting record ${i} because it's out of limit.`); @@ -219,10 +232,11 @@ export default class Records extends Plugin { }); } } + console.log(outRecord); this.records = this.records.slice(0, this.limit); tmc.server.emit("Plugin.Records.onUpdateRecord", { oldRecord: oldRecord || {}, - record: clone(newRecord), + record: clone(outRecord), records: clone(this.records) }); } catch (e: any) { diff --git a/core/schemas/scores.model.ts b/core/schemas/scores.model.ts index 108465f..dfd8745 100644 --- a/core/schemas/scores.model.ts +++ b/core/schemas/scores.model.ts @@ -4,7 +4,9 @@ import Player from './players.model'; @Table({ tableName: "scores", timestamps: true }) class Score extends Model { @PrimaryKey - @Unique + @Column(DataType.INTEGER) + id: number |undefined; + @Column(DataType.STRING) mapUuid: string | undefined; From 15f695d04a9f576b31ac50d3d9dbed2a09744f83 Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 6 Jul 2024 17:30:39 +0300 Subject: [PATCH 21/35] fix new record --- core/plugins/records/index.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index 9e82de4..8740cf8 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -146,13 +146,22 @@ export default class Records extends Plugin { try { if (this.records.length == 0) { let ranking = await this.getRankingsForLogin(data); - const newRecord: Score = await Score.create({ + await Score.create({ login: login, time: ranking.BestTime, checkpoints: ranking.BestCheckpoints.join(","), mapUuid: this.currentMapUid, }); - await newRecord.reload({ include: Player }); + const newRecord = await Score.findOne( + { + where: { + [Op.and]: { + login: login, + mapUuid: this.currentMapUid + } + }, + include: Player + }); newRecord.rank = 1; this.records.push(newRecord); @@ -199,7 +208,7 @@ export default class Records extends Plugin { }, include: Player } - ); + ); this.records.push(newRecord); } // Sort records From a6f92a458d07ef527a7827ff57d4a4c301ab4ada Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 6 Jul 2024 17:39:14 +0300 Subject: [PATCH 22/35] remove debug --- core/plugins/records/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index 8740cf8..abab52f 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -224,8 +224,7 @@ export default class Records extends Plugin { // Update ranks let outRecord = {}; for (let i = 0; i < this.records.length; i++) { - this.records[i].rank = i + 1; - console.log(this.records[i].login); + this.records[i].rank = i + 1; if (this.records[i].login == login) { outRecord = this.records[i]; } @@ -240,8 +239,7 @@ export default class Records extends Plugin { } }); } - } - console.log(outRecord); + } this.records = this.records.slice(0, this.limit); tmc.server.emit("Plugin.Records.onUpdateRecord", { oldRecord: oldRecord || {}, From b7ec9362a656a5c640b9d9e42a6370d13af9d310 Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 6 Jul 2024 17:41:34 +0300 Subject: [PATCH 23/35] fix confirm dialog --- core/ui/confirm.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/ui/confirm.ts b/core/ui/confirm.ts index 3cb9c92..5f97e84 100644 --- a/core/ui/confirm.ts +++ b/core/ui/confirm.ts @@ -9,7 +9,8 @@ export default class Confirm extends Widget { size = { width: 90, height: 40 }; constructor(login: string, question: string, callback: CallableFunction, params: any) { - super(login); + super(); + this.recipient = login; this.pos = { x: 0, y: 20, z: 10 }; this.callback = callback; this.params = params; From 718a6a535c3e05a557b43ea5114bca0f73710665 Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 6 Jul 2024 17:49:37 +0300 Subject: [PATCH 24/35] fixes... --- core/plugins/records/index.ts | 13 +++++++++++-- core/ui/confirm.ts | 3 +-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/plugins/records/index.ts b/core/plugins/records/index.ts index abab52f..63c9638 100644 --- a/core/plugins/records/index.ts +++ b/core/plugins/records/index.ts @@ -115,6 +115,13 @@ export default class Records extends Plugin { }); this.records = this.records.filter(r => r.login !== data.login); + + let rank = 1; + for (const score of this.records) { + score.rank = rank; + rank += 1; + } + tmc.server.emit("Plugin.Records.onRefresh", { records: clone(this.records), }); @@ -224,7 +231,8 @@ export default class Records extends Plugin { // Update ranks let outRecord = {}; for (let i = 0; i < this.records.length; i++) { - this.records[i].rank = i + 1; + this.records[i].rank = i + 1; + if (this.records[i].login == login) { outRecord = this.records[i]; } @@ -239,7 +247,8 @@ export default class Records extends Plugin { } }); } - } + } + this.records = this.records.slice(0, this.limit); tmc.server.emit("Plugin.Records.onUpdateRecord", { oldRecord: oldRecord || {}, diff --git a/core/ui/confirm.ts b/core/ui/confirm.ts index 5f97e84..40d5817 100644 --- a/core/ui/confirm.ts +++ b/core/ui/confirm.ts @@ -2,14 +2,13 @@ import Widget from './widget'; import { escape } from '../utils'; export default class Confirm extends Widget { - template = "core/templates/confirm.twig"; callback: CallableFunction; params: any; title = "Confirm required"; size = { width: 90, height: 40 }; constructor(login: string, question: string, callback: CallableFunction, params: any) { - super(); + super("core/templates/confirm.twig"); this.recipient = login; this.pos = { x: 0, y: 20, z: 10 }; this.callback = callback; From 87699eb57b0673359152781a0f208937ce74d565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christopher=20Fl=C3=BCgel?= Date: Sat, 6 Jul 2024 17:41:46 +0200 Subject: [PATCH 25/35] Add opt-in error reporting via sentry.io --- .env.example | 87 ++-- core/minicontrol.ts | 949 ++++++++++++++++++++++---------------------- core/sentry.ts | 17 + package-lock.json | 783 +++++++++++++++++++++++++++++++++++- package.json | 4 +- 5 files changed, 1321 insertions(+), 519 deletions(-) create mode 100644 core/sentry.ts diff --git a/.env.example b/.env.example index 853ea79..a7ac44e 100644 --- a/.env.example +++ b/.env.example @@ -1,42 +1,45 @@ -## Server -XMLRPC_HOST="127.0.0.1" -XMLRPC_PORT=5000 -XMLRPC_USER="SuperAdmin" -XMLRPC_PASS="SuperAdmin" - -# database connection string examples: - -# DATABASE="postgres://user:pass@127.0.0.1:5432/databaseName" -# DATABASE="mysql://user:pass@127.0.0.1:3306/databaseName" -# DATABASE="sqlite://userdata/local.sqlite" - -DATABASE="sqlite://userdata/local.sqlite" - -## Controller - -# comma separated list of admins for the server -ADMINS="" - -EXCLUDED_PLUGINS="tmnf/freezone, tmnf/dedimania" - -# set ansilevel: -# 0 = no color, 1 = 4bit color (console), 2 = 24bit color (rgb) -ANSILEVEL=1 - -# Debug info.. or not -DEBUG=false - -## Plugins -FREEZONE_PASS="" -DEDIMANIA_PASS="" - -TALIMIT=300 -VOTE_TIMEOUT=30 -VOTE_RATIO=0.55 - -## Theme - -# COLOR_TITLE_BG="0ad" -# COLOR_TITLE_FG="fff" -# COLOR_BG="026" -# COLOR_INFO="abc" +## Server +XMLRPC_HOST="127.0.0.1" +XMLRPC_PORT=5000 +XMLRPC_USER="SuperAdmin" +XMLRPC_PASS="SuperAdmin" + +# database connection string examples: + +# DATABASE="postgres://user:pass@127.0.0.1:5432/databaseName" +# DATABASE="mysql://user:pass@127.0.0.1:3306/databaseName" +# DATABASE="sqlite://userdata/local.sqlite" + +DATABASE="sqlite://userdata/local.sqlite" + +## Controller + +# comma separated list of admins for the server +ADMINS="" + +EXCLUDED_PLUGINS="tmnf/freezone, tmnf/dedimania" + +# set ansilevel: +# 0 = no color, 1 = 4bit color (console), 2 = 24bit color (rgb) +ANSILEVEL=1 + +# Debug info.. or not +DEBUG=false + +# Enable anonymous error reporting via sentry.io +OPTIN_ERROR_REPORTING=false + +## Plugins +FREEZONE_PASS="" +DEDIMANIA_PASS="" + +TALIMIT=300 +VOTE_TIMEOUT=30 +VOTE_RATIO=0.55 + +## Theme + +# COLOR_TITLE_BG="0ad" +# COLOR_TITLE_FG="fff" +# COLOR_BG="026" +# COLOR_INFO="abc" diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 59c8123..f166edd 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -1,474 +1,475 @@ -import PlayerManager, { Player } from './playermanager'; -import Server from './server'; -import UiManager from './uimanager'; -import MapManager from './mapmanager'; -import CommandManager from './commandmanager'; -import SettingsManager from './settingsmanager'; -import { processColorString } from './utils'; -import log from './log'; -import fs from 'fs'; -import Plugin from './plugins'; -import path from 'path'; -import { DepGraph } from "dependency-graph"; -import { require } from 'tsx/cjs/api' - -export interface GameStruct { - Name: string; - Version?: string; - Build?: string; -} - - -/** - * MiniControl class - */ -class MiniControl { - /** - * The version of MiniControl. - */ - readonly brand: string = "$n$o$eeeMINI$o$z$s$abccontrol$z$s¤white¤"; - readonly version: string = "0.4.0"; - /** - * The start time of MiniControl. - */ - readonly startTime: string = Date.now().toString(); - /** - * The admins of MiniControl. - */ - admins: string[] = []; - /** - * The server object. - */ - server: Server; - /** - * The command manager. - */ - chatCmd: CommandManager; - /** - * The map manager. - */ - maps: MapManager; - /** - * The player manager. - */ - players: PlayerManager; - /** - * The UI manager. - */ - ui: UiManager; - /** - * The settings - */ - settings: any = {}; - /** - * The settings manager. - */ - settingsMgr: SettingsManager; - /** - * The colors - */ - colors: { [key: string]: string } = {}; - /** - * The plugins. - */ - plugins: { [key: string]: Plugin } = {}; - pluginDependecies: DepGraph = new DepGraph(); - /** - * The game object. - */ - game: GameStruct; - mapsPath: string = ""; - storage: { [key: string]: any } = {}; - startComplete: boolean = false; - - constructor() { - console.time("Startup"); - this.server = new Server(); - this.maps = new MapManager(); - this.players = new PlayerManager(); - this.ui = new UiManager(); - this.chatCmd = new CommandManager(); - this.settingsMgr = new SettingsManager(); - this.settingsMgr.load(); - this.settings = this.settingsMgr.settings; - this.colors = this.settingsMgr.colors; - this.admins = this.settingsMgr.admins; - this.game = { Name: "" }; - } - - /** - * Gets a player object from the player manager. - * @param login The login of the player. - * @returns A promise that resolves to the player object. - */ - async getPlayer(login: string): Promise { - return await this.players.getPlayer(login); - } - - /** - * Adds chat command - * @param command The command name, should start with / for public or // for admin only - * @param callback The callback function to execute when the command is triggered. - * @param help The help text for the command. - */ - addCommand(command: string, callback: CallableFunction, help: string = "") { - this.chatCmd.addCommand(command, callback, help); - } - - /** - * Removes chat command - * @param command The command name to remove. - */ - removeCommand(command: string) { - this.chatCmd.removeCommand(command); - } - - /** - * @param name name of the plugin folder in ./plugins - * @returns - */ - findPlugin(name: string): string | null { - const dirsToCheck = ["./core/plugins/", "./userdata/plugins/"]; - for (const dir of dirsToCheck) { - if (fs.existsSync(dir + name + "/index.ts")) { - return (dir + name).replaceAll("\\", "/"); - } - } - return null; - } - - /** - * Loads a plugin to runtime - * @param name name of the plugin folder in ./plugins - * @returns - */ - async loadPlugin(name: string) { - if (!this.plugins[name]) { - const pluginPath = this.findPlugin(name); - if (pluginPath == null) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ does not exist.`; - if (this.startComplete) { - this.cli(msg); - this.chat(msg); - } - return; - } - let plugin = null; - if (process.platform === "win32") { - plugin = await import("file:///" + process.cwd() + "/" + pluginPath); - } else { - plugin = await import(process.cwd() + "/" + pluginPath); - } - - if (plugin.default == undefined) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤error¤ failed to load. Plugin has no default export.`; - this.cli(msg); - this.chat(msg); - return; - } - if (!(plugin.default.prototype instanceof Plugin)) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ is not a valid plugin.`; - this.cli(msg); - this.chat(msg); - return; - } - - if (!this.pluginDependecies.hasNode(name)) { - this.pluginDependecies.addNode(name); - if (Reflect.has(plugin.default, "depends")) { - for (const dependency of plugin.default.depends) { - if (!dependency.startsWith("game:")) { - this.pluginDependecies.addDependency(name, dependency) - } - } - } - } - - for (const depend of plugin.default.depends) { - if (depend.startsWith("game:")) { - const game = depend.split(":")[1]; - if (game != this.game.Name) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ not loaded. Game is not ¤cmd¤${game}¤white¤.`; - this.cli(msg); - if (this.startComplete) this.chat(msg); - return; - } - } - if (!this.pluginDependecies.hasNode(depend)) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ failed to load. Missing dependency ¤cmd¤${depend}¤white¤.`; - this.cli(msg); - if (this.startComplete) this.chat(msg); - return; - } - } - - // load and init the plugin - try { - tmc.cli(`¤gray¤Loading ¤cmd¤${name}¤white¤...`) - const cls = new plugin.default(); - this.plugins[name] = cls; - await cls.onLoad(); - if (this.startComplete) { - await cls.onStart(); - this.chat(`¤gray¤Plugin ¤cmd¤${name} ¤white¤loaded!`); - } - this.cli("¤gray¤Success."); - } catch (e: any) { - tmc.cli("¤gray¤Error while starting plugin ¤cmd¤" + name); - console.log(e); - } - } else { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ already loaded.`; - this.chat(msg) - this.cli(msg); - } - } - - /** - * unloads plugin from runtime, also checks for dependecies, runs onUnload and removes require cache - * @param unloadName name of the plugin folder in ./plugins - * @returns - */ - async unloadPlugin(unloadName: string) { - if (this.plugins[unloadName]) { - const deps = this.pluginDependecies.dependantsOf(unloadName); - if (deps.length > 0) { - const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ cannot be unloaded. It has a dependency of ¤cmd¤${deps.join(", ")}¤white¤.`; - this.cli(msg); - this.chat(msg); - return; - } - const pluginPath = this.findPlugin(unloadName); - if (pluginPath == null) { - const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ does not exist.`; - this.cli(msg); - this.chat(msg); - return; - } - - // unload - await this.plugins[unloadName].onUnload(); - // remove from dependecies - for (const dep of this.plugins[unloadName].getDepends()) { - this.pluginDependecies.removeDependency(unloadName, dep); - } - this.pluginDependecies.removeNode(unloadName); - - delete this.plugins[unloadName]; - const file = path.resolve(process.cwd() + "/" + pluginPath + "/index.ts"); - if (require.cache[file]) { - // eslint-disable-next-line drizzle/enforce-delete-with-where - // Loader.registry.delete(file); // @TODO check how to do this in tsx - delete require.cache[file]; - } else { - this.cli(`$fffFailed to remove require cache for ¤cmd¤${unloadName}¤white¤, hotreload will not work right.`); - } - const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ unloaded.`; - this.cli(msg); - this.chat(msg); - } else { - const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ not loaded.` - this.cli(msg); - this.chat(msg); - } - } - - /** - * send message to console - * @param object The object to log. - */ - cli(object: any) { - log.info(processColorString(object.toString())); - } - - /** - * log command to console if debug is enabled - * @param object The object to log. - */ - debug(object: any) { - if (process.env.DEBUG == "true") log.debug(processColorString(object.toString())); - } - - /** - * Sends chat message to server - * @param text string to send to chat - * @param login {string | string[]} login(s) to send message to, if undefined sends to all players - */ - chat(text: string, login: undefined | string | string[] = undefined) { - if (login !== undefined) { - const msg = "$9ab$n>$z$s " + text.toString(); - this.server.send("ChatSendServerMessageToLogin", processColorString(msg, "$z$s"), (typeof login == "string") ? login : login.join(",")); - } else { - const msg = "$9ab» ¤info¤" + text.toString(); - this.server.send("ChatSendServerMessage", processColorString(msg, "$z$s")); - } - } - - /** - * Runs MiniControl. - * @ignore Should not be called directly - */ - async run() { - if (this.startComplete) return; - const port = Number.parseInt(process.env.XMLRPC_PORT || "5000"); - this.cli("¤info¤Starting MiniControl..."); - this.cli(`¤info¤Using Node ¤white¤${process.version}`); - this.cli("¤info¤Connecting to Trackmania Dedicated server at ¤white¤" + (process.env.XMLRPC_HOST ?? "127.0.0.1") + ":" + port); - const status = await this.server.connect(process.env.XMLRPC_HOST ?? "127.0.0.1", port); - if (!status) { - this.cli("¤error¤Couldn't connect to server."); - process.exit(); - } - this.cli("¤info¤Connected to Trackmania Dedicated server."); - try { - await this.server.call("Authenticate", process.env.XMLRPC_USER ?? "SuperAdmin", process.env.XMLRPC_PASS ?? "SuperAdmin"); - } catch (e: any) { - this.cli("¤error¤Authenticate to server failed."); - this.cli(e.message); - process.exit(); - } - this.server.send("EnableCallbacks", true); - this.server.send("SendHideManialinkPage"); - this.game = await this.server.call("GetVersion"); - - if (this.game.Name == "Trackmania") { - await this.server.call("SetApiVersion", "2023-04-16"); - this.mapsPath = await this.server.call("GetMapsDirectory"); - await this.server.callScript("XmlRpc.EnableCallbacks", "true"); - } else { - this.mapsPath = await this.server.call("GetTracksDirectory"); - } - - await this.maps.init(); - await this.players.init(); - await this.ui.init(); - await this.beforeInit(); - console.timeEnd("Startup"); - } - - /** - * Executes tasks before MiniControl initialization. - * @ignore Shouldn't be called directly - */ - async beforeInit() { - await this.chatCmd.beforeInit(); - // load plugins - let plugins = fs.readdirSync(process.cwd().replaceAll("\\", "/") + "/core/plugins", { withFileTypes: true, recursive: true }); - plugins = plugins.concat(fs.readdirSync(process.cwd().replaceAll("\\", "/") + "/userdata/plugins", { withFileTypes: true, recursive: true })); - const exclude = process.env.EXCLUDED_PLUGINS?.split(",") || []; - let loadList = []; - for (const plugin of plugins) { - let include = plugin && plugin.isDirectory(); - const directory = plugin.parentPath.replaceAll("\\", "/").replace(path.resolve("core", "plugins").replaceAll("\\", "/"), "").replace(path.resolve("userdata", "plugins").replaceAll("\\", "/"), ""); - if (include) { - let pluginName = plugin.name; - if (directory != "") { - pluginName = (directory + "/" + plugin.name).replaceAll("\\", "/"); - if (pluginName.startsWith("/")) pluginName = pluginName.substring(1); - } - for (const excludeName of exclude) { - if (excludeName == "") continue; - if (pluginName.startsWith(excludeName.trim())) { - include = false; - } - } - if (include) { - loadList.push(pluginName); - } - } - } - - // load metadata - for (const name of loadList) { - const pluginName = this.findPlugin(name); - if (pluginName == null) { - const msg = `¤error¤Didn't find a plugin. resolved plugin name is null.`; - this.cli(msg); - continue; - } - let cls = null; - if (process.platform === "win32") { - cls = await import("file:///" + process.cwd() + "/" + pluginName); - } else { - cls = await import(process.cwd() + "/" + pluginName); - } - const plugin = cls.default; - if (plugin == undefined) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤error¤ failed to load. Plugin has no default export.`; - this.cli(msg); - continue; - } - if (!(plugin.prototype instanceof Plugin)) { - const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ is not a valid plugin.`; - this.cli(msg); - continue; - } - - this.pluginDependecies.addNode(name); - if (Reflect.has(plugin, "depends")) { - for (const dependency of plugin.depends) { - if (dependency.startsWith("game:")) { - if (dependency != "game:" + this.game.Name) { - this.pluginDependecies.removeNode(name); - break - } - } - if (!this.pluginDependecies.hasNode(dependency)) { - this.pluginDependecies.addNode(dependency); - } - this.pluginDependecies.addDependency(name, dependency) - } - } - } - - for (const plugin of this.pluginDependecies.overallOrder()) { - if (loadList.includes(plugin)) { - await this.loadPlugin(plugin) - } - } - - this.server.send("Echo", this.startTime, "MiniControl"); - } - - /** - * Executes tasks after MiniControl initialization. - * @ignore Should not be called directly - * - */ - async afterStart() { - tmc.cli("¤success¤MiniControl started successfully."); - this.players.afterInit(); - await this.chatCmd.afterInit(); - await this.ui.afterInit(); - const msg = `¤info¤Welcome to ${this.brand} ¤info¤version ¤white¤${this.version}¤info¤!`; - this.chat(msg); - this.cli(msg); - this.startComplete = true; - for (const plugin of Object.values(this.plugins)) { - await plugin.onStart(); - } - } -} - -export const tmc = new MiniControl(); - -declare global { - const tmc: MiniControl -} -(global as any).tmc = tmc; - -(async () => { - (global as any).tmc = tmc; - await tmc.run() -})(); - -process.on('SIGINT', function () { - tmc.server.send("SendHideManialinkPage", 0, false); - process.exit(0); -}); - -process.on("SIGTERM", () => { - tmc.server.send("SendHideManialinkPage", 0, false); - process.exit(0); -}); - +import "./instrument" +import PlayerManager, { Player } from './playermanager'; +import Server from './server'; +import UiManager from './uimanager'; +import MapManager from './mapmanager'; +import CommandManager from './commandmanager'; +import SettingsManager from './settingsmanager'; +import { processColorString } from './utils'; +import log from './log'; +import fs from 'fs'; +import Plugin from './plugins'; +import path from 'path'; +import { DepGraph } from "dependency-graph"; +import { require } from 'tsx/cjs/api' + +export interface GameStruct { + Name: string; + Version?: string; + Build?: string; +} + + +/** + * MiniControl class + */ +class MiniControl { + /** + * The version of MiniControl. + */ + readonly brand: string = "$n$o$eeeMINI$o$z$s$abccontrol$z$s¤white¤"; + readonly version: string = "0.4.0"; + /** + * The start time of MiniControl. + */ + readonly startTime: string = Date.now().toString(); + /** + * The admins of MiniControl. + */ + admins: string[] = []; + /** + * The server object. + */ + server: Server; + /** + * The command manager. + */ + chatCmd: CommandManager; + /** + * The map manager. + */ + maps: MapManager; + /** + * The player manager. + */ + players: PlayerManager; + /** + * The UI manager. + */ + ui: UiManager; + /** + * The settings + */ + settings: any = {}; + /** + * The settings manager. + */ + settingsMgr: SettingsManager; + /** + * The colors + */ + colors: { [key: string]: string } = {}; + /** + * The plugins. + */ + plugins: { [key: string]: Plugin } = {}; + pluginDependecies: DepGraph = new DepGraph(); + /** + * The game object. + */ + game: GameStruct; + mapsPath: string = ""; + storage: { [key: string]: any } = {}; + startComplete: boolean = false; + + constructor() { + console.time("Startup"); + this.server = new Server(); + this.maps = new MapManager(); + this.players = new PlayerManager(); + this.ui = new UiManager(); + this.chatCmd = new CommandManager(); + this.settingsMgr = new SettingsManager(); + this.settingsMgr.load(); + this.settings = this.settingsMgr.settings; + this.colors = this.settingsMgr.colors; + this.admins = this.settingsMgr.admins; + this.game = { Name: "" }; + } + + /** + * Gets a player object from the player manager. + * @param login The login of the player. + * @returns A promise that resolves to the player object. + */ + async getPlayer(login: string): Promise { + return await this.players.getPlayer(login); + } + + /** + * Adds chat command + * @param command The command name, should start with / for public or // for admin only + * @param callback The callback function to execute when the command is triggered. + * @param help The help text for the command. + */ + addCommand(command: string, callback: CallableFunction, help: string = "") { + this.chatCmd.addCommand(command, callback, help); + } + + /** + * Removes chat command + * @param command The command name to remove. + */ + removeCommand(command: string) { + this.chatCmd.removeCommand(command); + } + + /** + * @param name name of the plugin folder in ./plugins + * @returns + */ + findPlugin(name: string): string | null { + const dirsToCheck = ["./core/plugins/", "./userdata/plugins/"]; + for (const dir of dirsToCheck) { + if (fs.existsSync(dir + name + "/index.ts")) { + return (dir + name).replaceAll("\\", "/"); + } + } + return null; + } + + /** + * Loads a plugin to runtime + * @param name name of the plugin folder in ./plugins + * @returns + */ + async loadPlugin(name: string) { + if (!this.plugins[name]) { + const pluginPath = this.findPlugin(name); + if (pluginPath == null) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ does not exist.`; + if (this.startComplete) { + this.cli(msg); + this.chat(msg); + } + return; + } + let plugin = null; + if (process.platform === "win32") { + plugin = await import("file:///" + process.cwd() + "/" + pluginPath); + } else { + plugin = await import(process.cwd() + "/" + pluginPath); + } + + if (plugin.default == undefined) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤error¤ failed to load. Plugin has no default export.`; + this.cli(msg); + this.chat(msg); + return; + } + if (!(plugin.default.prototype instanceof Plugin)) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ is not a valid plugin.`; + this.cli(msg); + this.chat(msg); + return; + } + + if (!this.pluginDependecies.hasNode(name)) { + this.pluginDependecies.addNode(name); + if (Reflect.has(plugin.default, "depends")) { + for (const dependency of plugin.default.depends) { + if (!dependency.startsWith("game:")) { + this.pluginDependecies.addDependency(name, dependency) + } + } + } + } + + for (const depend of plugin.default.depends) { + if (depend.startsWith("game:")) { + const game = depend.split(":")[1]; + if (game != this.game.Name) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ not loaded. Game is not ¤cmd¤${game}¤white¤.`; + this.cli(msg); + if (this.startComplete) this.chat(msg); + return; + } + } + if (!this.pluginDependecies.hasNode(depend)) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ failed to load. Missing dependency ¤cmd¤${depend}¤white¤.`; + this.cli(msg); + if (this.startComplete) this.chat(msg); + return; + } + } + + // load and init the plugin + try { + tmc.cli(`¤gray¤Loading ¤cmd¤${name}¤white¤...`) + const cls = new plugin.default(); + this.plugins[name] = cls; + await cls.onLoad(); + if (this.startComplete) { + await cls.onStart(); + this.chat(`¤gray¤Plugin ¤cmd¤${name} ¤white¤loaded!`); + } + this.cli("¤gray¤Success."); + } catch (e: any) { + tmc.cli("¤gray¤Error while starting plugin ¤cmd¤" + name); + console.log(e); + } + } else { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ already loaded.`; + this.chat(msg) + this.cli(msg); + } + } + + /** + * unloads plugin from runtime, also checks for dependecies, runs onUnload and removes require cache + * @param unloadName name of the plugin folder in ./plugins + * @returns + */ + async unloadPlugin(unloadName: string) { + if (this.plugins[unloadName]) { + const deps = this.pluginDependecies.dependantsOf(unloadName); + if (deps.length > 0) { + const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ cannot be unloaded. It has a dependency of ¤cmd¤${deps.join(", ")}¤white¤.`; + this.cli(msg); + this.chat(msg); + return; + } + const pluginPath = this.findPlugin(unloadName); + if (pluginPath == null) { + const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ does not exist.`; + this.cli(msg); + this.chat(msg); + return; + } + + // unload + await this.plugins[unloadName].onUnload(); + // remove from dependecies + for (const dep of this.plugins[unloadName].getDepends()) { + this.pluginDependecies.removeDependency(unloadName, dep); + } + this.pluginDependecies.removeNode(unloadName); + + delete this.plugins[unloadName]; + const file = path.resolve(process.cwd() + "/" + pluginPath + "/index.ts"); + if (require.cache[file]) { + // eslint-disable-next-line drizzle/enforce-delete-with-where + // Loader.registry.delete(file); // @TODO check how to do this in tsx + delete require.cache[file]; + } else { + this.cli(`$fffFailed to remove require cache for ¤cmd¤${unloadName}¤white¤, hotreload will not work right.`); + } + const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ unloaded.`; + this.cli(msg); + this.chat(msg); + } else { + const msg = `¤gray¤Plugin ¤cmd¤${unloadName}¤white¤ not loaded.` + this.cli(msg); + this.chat(msg); + } + } + + /** + * send message to console + * @param object The object to log. + */ + cli(object: any) { + log.info(processColorString(object.toString())); + } + + /** + * log command to console if debug is enabled + * @param object The object to log. + */ + debug(object: any) { + if (process.env.DEBUG == "true") log.debug(processColorString(object.toString())); + } + + /** + * Sends chat message to server + * @param text string to send to chat + * @param login {string | string[]} login(s) to send message to, if undefined sends to all players + */ + chat(text: string, login: undefined | string | string[] = undefined) { + if (login !== undefined) { + const msg = "$9ab$n>$z$s " + text.toString(); + this.server.send("ChatSendServerMessageToLogin", processColorString(msg, "$z$s"), (typeof login == "string") ? login : login.join(",")); + } else { + const msg = "$9ab» ¤info¤" + text.toString(); + this.server.send("ChatSendServerMessage", processColorString(msg, "$z$s")); + } + } + + /** + * Runs MiniControl. + * @ignore Should not be called directly + */ + async run() { + if (this.startComplete) return; + const port = Number.parseInt(process.env.XMLRPC_PORT || "5000"); + this.cli("¤info¤Starting MiniControl..."); + this.cli(`¤info¤Using Node ¤white¤${process.version}`); + this.cli("¤info¤Connecting to Trackmania Dedicated server at ¤white¤" + (process.env.XMLRPC_HOST ?? "127.0.0.1") + ":" + port); + const status = await this.server.connect(process.env.XMLRPC_HOST ?? "127.0.0.1", port); + if (!status) { + this.cli("¤error¤Couldn't connect to server."); + process.exit(); + } + this.cli("¤info¤Connected to Trackmania Dedicated server."); + try { + await this.server.call("Authenticate", process.env.XMLRPC_USER ?? "SuperAdmin", process.env.XMLRPC_PASS ?? "SuperAdmin"); + } catch (e: any) { + this.cli("¤error¤Authenticate to server failed."); + this.cli(e.message); + process.exit(); + } + this.server.send("EnableCallbacks", true); + this.server.send("SendHideManialinkPage"); + this.game = await this.server.call("GetVersion"); + + if (this.game.Name == "Trackmania") { + await this.server.call("SetApiVersion", "2023-04-16"); + this.mapsPath = await this.server.call("GetMapsDirectory"); + await this.server.callScript("XmlRpc.EnableCallbacks", "true"); + } else { + this.mapsPath = await this.server.call("GetTracksDirectory"); + } + + await this.maps.init(); + await this.players.init(); + await this.ui.init(); + await this.beforeInit(); + console.timeEnd("Startup"); + } + + /** + * Executes tasks before MiniControl initialization. + * @ignore Shouldn't be called directly + */ + async beforeInit() { + await this.chatCmd.beforeInit(); + // load plugins + let plugins = fs.readdirSync(process.cwd().replaceAll("\\", "/") + "/core/plugins", { withFileTypes: true, recursive: true }); + plugins = plugins.concat(fs.readdirSync(process.cwd().replaceAll("\\", "/") + "/userdata/plugins", { withFileTypes: true, recursive: true })); + const exclude = process.env.EXCLUDED_PLUGINS?.split(",") || []; + let loadList = []; + for (const plugin of plugins) { + let include = plugin && plugin.isDirectory(); + const directory = plugin.parentPath.replaceAll("\\", "/").replace(path.resolve("core", "plugins").replaceAll("\\", "/"), "").replace(path.resolve("userdata", "plugins").replaceAll("\\", "/"), ""); + if (include) { + let pluginName = plugin.name; + if (directory != "") { + pluginName = (directory + "/" + plugin.name).replaceAll("\\", "/"); + if (pluginName.startsWith("/")) pluginName = pluginName.substring(1); + } + for (const excludeName of exclude) { + if (excludeName == "") continue; + if (pluginName.startsWith(excludeName.trim())) { + include = false; + } + } + if (include) { + loadList.push(pluginName); + } + } + } + + // load metadata + for (const name of loadList) { + const pluginName = this.findPlugin(name); + if (pluginName == null) { + const msg = `¤error¤Didn't find a plugin. resolved plugin name is null.`; + this.cli(msg); + continue; + } + let cls = null; + if (process.platform === "win32") { + cls = await import("file:///" + process.cwd() + "/" + pluginName); + } else { + cls = await import(process.cwd() + "/" + pluginName); + } + const plugin = cls.default; + if (plugin == undefined) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤error¤ failed to load. Plugin has no default export.`; + this.cli(msg); + continue; + } + if (!(plugin.prototype instanceof Plugin)) { + const msg = `¤gray¤Plugin ¤cmd¤${name}¤white¤ is not a valid plugin.`; + this.cli(msg); + continue; + } + + this.pluginDependecies.addNode(name); + if (Reflect.has(plugin, "depends")) { + for (const dependency of plugin.depends) { + if (dependency.startsWith("game:")) { + if (dependency != "game:" + this.game.Name) { + this.pluginDependecies.removeNode(name); + break + } + } + if (!this.pluginDependecies.hasNode(dependency)) { + this.pluginDependecies.addNode(dependency); + } + this.pluginDependecies.addDependency(name, dependency) + } + } + } + + for (const plugin of this.pluginDependecies.overallOrder()) { + if (loadList.includes(plugin)) { + await this.loadPlugin(plugin) + } + } + + this.server.send("Echo", this.startTime, "MiniControl"); + } + + /** + * Executes tasks after MiniControl initialization. + * @ignore Should not be called directly + * + */ + async afterStart() { + tmc.cli("¤success¤MiniControl started successfully."); + this.players.afterInit(); + await this.chatCmd.afterInit(); + await this.ui.afterInit(); + const msg = `¤info¤Welcome to ${this.brand} ¤info¤version ¤white¤${this.version}¤info¤!`; + this.chat(msg); + this.cli(msg); + this.startComplete = true; + for (const plugin of Object.values(this.plugins)) { + await plugin.onStart(); + } + } +} + +export const tmc = new MiniControl(); + +declare global { + const tmc: MiniControl +} +(global as any).tmc = tmc; + +(async () => { + (global as any).tmc = tmc; + await tmc.run() +})(); + +process.on('SIGINT', function () { + tmc.server.send("SendHideManialinkPage", 0, false); + process.exit(0); +}); + +process.on("SIGTERM", () => { + tmc.server.send("SendHideManialinkPage", 0, false); + process.exit(0); +}); + diff --git a/core/sentry.ts b/core/sentry.ts new file mode 100644 index 0000000..a792c4b --- /dev/null +++ b/core/sentry.ts @@ -0,0 +1,17 @@ +// Import with `import * as Sentry from "@sentry/node"` if you are using ESM +import * as Sentry from "@sentry/node" +import { nodeProfilingIntegration } from "@sentry/profiling-node" + +if(process.env.OPTIN_ERROR_REPORTING) { + Sentry.init({ + dsn: "https://72d7e2f2ba0eeae97f77b368b70d981a@o4507555499409408.ingest.de.sentry.io/4507555551445072", + integrations: [ + nodeProfilingIntegration(), + ], + // Performance Monitoring + tracesSampleRate: 1.0, // Capture 100% of the transactions + + // Set sampling rate for profiling - this is relative to tracesSampleRate + profilesSampleRate: 1.0, + }); +} diff --git a/package-lock.json b/package-lock.json index 21bc2ea..763a4fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,8 @@ "packages": { "": { "dependencies": { + "@sentry/node": "^8.15.0", + "@sentry/profiling-node": "^8.15.0", "dependency-graph": "1.0.0", "iomem": "1.5.10", "mysql2": "3.10.2", @@ -257,6 +259,399 @@ "node": ">=10" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.37.0.tgz", + "integrity": "sha512-SeQktDIH5rNzjiEiazWiJAIXkmnLOnNV7wwHpahrqE0Ph+Z3heqMfxRtoMtbdJSIYLfcNZYO51AjxZ00IXufdw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.40.1.tgz", + "integrity": "sha512-+RKMvVe2zw3kIXRup9c1jFu3T4d0fs5aKy015TpiMyoCKX1UMu3Z0lfgYtuyiSTANvg5hZnDbWmQmqSPj9VTvg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.37.0.tgz", + "integrity": "sha512-WRjwzNZgupSzbEYvo9s+QuHJRqZJjVdNxSEpGBwWK8RKLlHGwGVAu0gcc2gPamJWUJsGqPGvahAPWM18ZkWj6A==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.41.0.tgz", + "integrity": "sha512-R/gXeljgIhaRDKquVkKYT5QHPnFouM8ooyePZEP0kqyaVAedtR1V7NfAUJbxfTG5fBQa5wdmLjvu63+tzRXZCA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.39.0.tgz", + "integrity": "sha512-ik2nA9Yj2s2ay+aNY+tJsKCsEx6Tsc2g/MK0iWBW5tibwrWKTy1pdVt5sB3kd5Gkimqj23UV5+FH2JFcQLeKug==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.41.0.tgz", + "integrity": "sha512-rxiLloU8VyeJGm5j2fZS8ShVdB82n7VNP8wTwfUQqDwRfHCnkzGr+buKoxuhGD91gtwJ91RHkjHA1Eg6RqsUTg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.41.0.tgz", + "integrity": "sha512-mbPnDt7ELvpM2S0vixYUsde7122lgegLOJQxx8iJQbB8YHal/xnTh9v7IfArSVzIDo+E+080hxZyUZD4boOWkw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.45.0.tgz", + "integrity": "sha512-xnZP9+ayeB1JJyNE9cIiwhOJTzNEsRhXVdLgfzmrs48Chhhk026mQdM5CITfyXSCfN73FGAIB8d91+pflJEfWQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.39.0.tgz", + "integrity": "sha512-J1r66A7zJklPPhMtrFOO7/Ud2p0Pv5u8+r23Cd1JUH6fYPmftNJVsLp2urAt6PHK4jVqpP/YegN8wzjJ2mZNPQ==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.39.0.tgz", + "integrity": "sha512-8snHPh83rhrDf31v9Kq0Nf+ts8hdr7NguuszRqZomZBHgE0+UyXZSkXHAAFZoBPPRMGyM68uaFE5hVtFl+wOcA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.39.0.tgz", + "integrity": "sha512-Iypuq2z6TCfriAXCIZjRq8GTFCKhQv5SpXbmI+e60rYdXw8NHtMH4NXcGF0eKTuoCsC59IYSTUvDQYDKReaszA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.38.0.tgz", + "integrity": "sha512-M381Df1dM8aqihZz2yK+ugvMFK5vlHG/835dc67Sx2hH4pQEQYDA2PpFPTgc9AYYOydQaj7ClFQunESimjXDgg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.42.0.tgz", + "integrity": "sha512-sjgcM8CswYy8zxHgXv4RAZ09DlYhQ+9TdlourUs63Df/ek5RrB1ZbjznqW7PB6c3TyJJmX6AVtPTjAsROovEjA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.40.0.tgz", + "integrity": "sha512-0ieQYJb6yl35kXA75LQUPhHtGjtQU9L85KlWa7d4ohBbk/iQKZ3X3CFl5jC5vNMq/GGPB3+w3IxNvALlHtrp7A==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@prisma/instrumentation": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.16.1.tgz", + "integrity": "sha512-4m5gRFWnQb8s/yTyGbMZkL7A5uJgqOWcWJxapwcAD0T0kh5sGPEVSQl/zTQvE9aduXhFAxOtC3gO+R8Hb5xO1Q==", + "dependencies": { + "@opentelemetry/api": "^1.8", + "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0", + "@opentelemetry/sdk-trace-base": "^1.22" + } + }, "node_modules/@rushstack/node-core-library": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.4.1.tgz", @@ -393,6 +788,117 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/@sentry/core": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.15.0.tgz", + "integrity": "sha512-RjuEq/34VjNmxlfzq+485jG63/Vst90svQapLwVgBZWgM8jxrLyCRXHU0wfBc7/1IhV/T9GYAplrJQAkG4J9Ow==", + "dependencies": { + "@sentry/types": "8.15.0", + "@sentry/utils": "8.15.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/node": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.15.0.tgz", + "integrity": "sha512-GQO9n+M4EldBE3TNWhGzFocpUw1BU5rGfX6KC6I8BDKUeJDPDZpDknmNHzcjE5aXd+SieGiyt0sE5PaT48cGlQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.37.0", + "@opentelemetry/instrumentation-express": "0.40.1", + "@opentelemetry/instrumentation-fastify": "0.37.0", + "@opentelemetry/instrumentation-graphql": "0.41.0", + "@opentelemetry/instrumentation-hapi": "0.39.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.41.0", + "@opentelemetry/instrumentation-koa": "0.41.0", + "@opentelemetry/instrumentation-mongodb": "0.45.0", + "@opentelemetry/instrumentation-mongoose": "0.39.0", + "@opentelemetry/instrumentation-mysql": "0.39.0", + "@opentelemetry/instrumentation-mysql2": "0.39.0", + "@opentelemetry/instrumentation-nestjs-core": "0.38.0", + "@opentelemetry/instrumentation-pg": "0.42.0", + "@opentelemetry/instrumentation-redis-4": "0.40.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.16.1", + "@sentry/core": "8.15.0", + "@sentry/opentelemetry": "8.15.0", + "@sentry/types": "8.15.0", + "@sentry/utils": "8.15.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.0" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.15.0.tgz", + "integrity": "sha512-2ZkmdzvYgb2Ij8656Z3vvu9o9AWFSHeLXQgAHX+1VMvxTz+uc5EXeXv8aTboPnRxVje446DbNJ7j3gxNSD15cA==", + "dependencies": { + "@sentry/core": "8.15.0", + "@sentry/types": "8.15.0", + "@sentry/utils": "8.15.0" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1" + } + }, + "node_modules/@sentry/profiling-node": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-8.15.0.tgz", + "integrity": "sha512-1XVqrBx8sTmxHIrdDgrXQeNRmF6nCeV+AvJnvlTJWoENE5Mtchd29VxkYz8hc649VL8fZn5mZA7A/a8UaroMGw==", + "hasInstallScript": true, + "dependencies": { + "@sentry/core": "8.15.0", + "@sentry/node": "8.15.0", + "@sentry/types": "8.15.0", + "@sentry/utils": "8.15.0", + "detect-libc": "^2.0.2", + "node-abi": "^3.61.0" + }, + "bin": { + "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.js" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/types": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.15.0.tgz", + "integrity": "sha512-AZc9nSHKuNH8P/7ihmq5fbZBiQ7Gr35kJq9Tad9eVuOgL8D+2b6Vqu/61ljVVlMFI0tBGFsSkWJ/00PfBcVKWg==", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/utils": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-1ISmyYFuRHJbGun0gUYscyz1aP6RfILUldNAUwQwF0Ycu8YOi4n8uwJRN0aov6cCi41tnZWOMBagSeLxbJiJgQ==", + "dependencies": { + "@sentry/types": "8.15.0" + }, + "engines": { + "node": ">=14.18" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -402,6 +908,14 @@ "node": ">= 6" } }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -417,6 +931,39 @@ "@types/node": "*" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -425,6 +972,38 @@ "@types/ms": "*" } }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -432,11 +1011,60 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, + "node_modules/@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", @@ -446,6 +1074,34 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -453,6 +1109,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, "node_modules/@types/twig": { "version": "1.12.16", "resolved": "https://registry.npmjs.org/@types/twig/-/twig-1.12.16.tgz", @@ -690,7 +1370,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -699,6 +1378,23 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "optional": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1020,6 +1716,11 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -1939,6 +2640,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-in-the-middle": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz", + "integrity": "sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -2221,7 +2933,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/long": { @@ -2440,6 +3151,11 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -2608,6 +3324,51 @@ "wrappy": "1" } }, + "node_modules/opentelemetry-instrumentation-fetch-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.0.tgz", + "integrity": "sha512-aiSt/4ubOTyb1N5C2ZbGrBvaJOXIZhZvpRPYuUVxQJe27wJZqf/o65iPrqgLcgfeOLaQ8cS2Q+762jrYvniTrA==", + "optional": true, + "dependencies": { + "@opentelemetry/api": "^1.6.0", + "@opentelemetry/instrumentation": "^0.43.0", + "@opentelemetry/semantic-conventions": "^1.17.0" + }, + "engines": { + "node": ">18.0.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.43.0.tgz", + "integrity": "sha512-S1uHE+sxaepgp+t8lvIDuRgyjJWisAb733198kwQTUc9ZtYQ2V2gmyCtR1x21ePGVLoMiX/NWY7WA290hwkjJQ==", + "optional": true, + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "optional": true, + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3028,6 +3789,19 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", + "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -3330,6 +4104,11 @@ "node": ">=8" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", diff --git a/package.json b/package.json index 21b8ee2..83a502d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ }, "type": "module", "dependencies": { + "@sentry/node": "^8.15.0", + "@sentry/profiling-node": "^8.15.0", "dependency-graph": "1.0.0", "iomem": "1.5.10", "mysql2": "3.10.2", @@ -18,11 +20,11 @@ "reflect-metadata": "^0.2.2", "sequelize": "^6.37.3", "sequelize-typescript": "^2.1.6", - "umzug": "3.8.1", "sqlite3": "5.1.7", "tm-essentials": "1.0.5", "tsx": "4.16.0", "twig": "1.17.1", + "umzug": "3.8.1", "xmlrpc": "1.3.2" }, "devDependencies": { From a0e2794f8b076d642d502428f7c8dde65717107c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christopher=20Fl=C3=BCgel?= Date: Sat, 6 Jul 2024 17:57:53 +0200 Subject: [PATCH 26/35] Remove sentry error reporting due to incompatibility with tsx --- .env.example | 3 - core/minicontrol.ts | 1 - core/sentry.ts | 17 - package-lock.json | 783 +------------------------------------------- package.json | 2 - 5 files changed, 2 insertions(+), 804 deletions(-) delete mode 100644 core/sentry.ts diff --git a/.env.example b/.env.example index a7ac44e..95a4c5b 100644 --- a/.env.example +++ b/.env.example @@ -26,9 +26,6 @@ ANSILEVEL=1 # Debug info.. or not DEBUG=false -# Enable anonymous error reporting via sentry.io -OPTIN_ERROR_REPORTING=false - ## Plugins FREEZONE_PASS="" DEDIMANIA_PASS="" diff --git a/core/minicontrol.ts b/core/minicontrol.ts index f166edd..1bf1799 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -1,4 +1,3 @@ -import "./instrument" import PlayerManager, { Player } from './playermanager'; import Server from './server'; import UiManager from './uimanager'; diff --git a/core/sentry.ts b/core/sentry.ts deleted file mode 100644 index a792c4b..0000000 --- a/core/sentry.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Import with `import * as Sentry from "@sentry/node"` if you are using ESM -import * as Sentry from "@sentry/node" -import { nodeProfilingIntegration } from "@sentry/profiling-node" - -if(process.env.OPTIN_ERROR_REPORTING) { - Sentry.init({ - dsn: "https://72d7e2f2ba0eeae97f77b368b70d981a@o4507555499409408.ingest.de.sentry.io/4507555551445072", - integrations: [ - nodeProfilingIntegration(), - ], - // Performance Monitoring - tracesSampleRate: 1.0, // Capture 100% of the transactions - - // Set sampling rate for profiling - this is relative to tracesSampleRate - profilesSampleRate: 1.0, - }); -} diff --git a/package-lock.json b/package-lock.json index 763a4fe..21bc2ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,8 +5,6 @@ "packages": { "": { "dependencies": { - "@sentry/node": "^8.15.0", - "@sentry/profiling-node": "^8.15.0", "dependency-graph": "1.0.0", "iomem": "1.5.10", "mysql2": "3.10.2", @@ -259,399 +257,6 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.37.0.tgz", - "integrity": "sha512-SeQktDIH5rNzjiEiazWiJAIXkmnLOnNV7wwHpahrqE0Ph+Z3heqMfxRtoMtbdJSIYLfcNZYO51AjxZ00IXufdw==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/connect": "3.4.36" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.40.1.tgz", - "integrity": "sha512-+RKMvVe2zw3kIXRup9c1jFu3T4d0fs5aKy015TpiMyoCKX1UMu3Z0lfgYtuyiSTANvg5hZnDbWmQmqSPj9VTvg==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.37.0.tgz", - "integrity": "sha512-WRjwzNZgupSzbEYvo9s+QuHJRqZJjVdNxSEpGBwWK8RKLlHGwGVAu0gcc2gPamJWUJsGqPGvahAPWM18ZkWj6A==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.41.0.tgz", - "integrity": "sha512-R/gXeljgIhaRDKquVkKYT5QHPnFouM8ooyePZEP0kqyaVAedtR1V7NfAUJbxfTG5fBQa5wdmLjvu63+tzRXZCA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.39.0.tgz", - "integrity": "sha512-ik2nA9Yj2s2ay+aNY+tJsKCsEx6Tsc2g/MK0iWBW5tibwrWKTy1pdVt5sB3kd5Gkimqj23UV5+FH2JFcQLeKug==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", - "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.41.0.tgz", - "integrity": "sha512-rxiLloU8VyeJGm5j2fZS8ShVdB82n7VNP8wTwfUQqDwRfHCnkzGr+buKoxuhGD91gtwJ91RHkjHA1Eg6RqsUTg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.41.0.tgz", - "integrity": "sha512-mbPnDt7ELvpM2S0vixYUsde7122lgegLOJQxx8iJQbB8YHal/xnTh9v7IfArSVzIDo+E+080hxZyUZD4boOWkw==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/koa": "2.14.0", - "@types/koa__router": "12.0.3" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.45.0.tgz", - "integrity": "sha512-xnZP9+ayeB1JJyNE9cIiwhOJTzNEsRhXVdLgfzmrs48Chhhk026mQdM5CITfyXSCfN73FGAIB8d91+pflJEfWQ==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.39.0.tgz", - "integrity": "sha512-J1r66A7zJklPPhMtrFOO7/Ud2p0Pv5u8+r23Cd1JUH6fYPmftNJVsLp2urAt6PHK4jVqpP/YegN8wzjJ2mZNPQ==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.39.0.tgz", - "integrity": "sha512-8snHPh83rhrDf31v9Kq0Nf+ts8hdr7NguuszRqZomZBHgE0+UyXZSkXHAAFZoBPPRMGyM68uaFE5hVtFl+wOcA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/mysql": "2.15.22" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.39.0.tgz", - "integrity": "sha512-Iypuq2z6TCfriAXCIZjRq8GTFCKhQv5SpXbmI+e60rYdXw8NHtMH4NXcGF0eKTuoCsC59IYSTUvDQYDKReaszA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.38.0.tgz", - "integrity": "sha512-M381Df1dM8aqihZz2yK+ugvMFK5vlHG/835dc67Sx2hH4pQEQYDA2PpFPTgc9AYYOydQaj7ClFQunESimjXDgg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.42.0.tgz", - "integrity": "sha512-sjgcM8CswYy8zxHgXv4RAZ09DlYhQ+9TdlourUs63Df/ek5RrB1ZbjznqW7PB6c3TyJJmX6AVtPTjAsROovEjA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.40.0.tgz", - "integrity": "sha512-0ieQYJb6yl35kXA75LQUPhHtGjtQU9L85KlWa7d4ohBbk/iQKZ3X3CFl5jC5vNMq/GGPB3+w3IxNvALlHtrp7A==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sql-common": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", - "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", - "dependencies": { - "@opentelemetry/core": "^1.1.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0" - } - }, - "node_modules/@prisma/instrumentation": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.16.1.tgz", - "integrity": "sha512-4m5gRFWnQb8s/yTyGbMZkL7A5uJgqOWcWJxapwcAD0T0kh5sGPEVSQl/zTQvE9aduXhFAxOtC3gO+R8Hb5xO1Q==", - "dependencies": { - "@opentelemetry/api": "^1.8", - "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0", - "@opentelemetry/sdk-trace-base": "^1.22" - } - }, "node_modules/@rushstack/node-core-library": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.4.1.tgz", @@ -788,117 +393,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "node_modules/@sentry/core": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.15.0.tgz", - "integrity": "sha512-RjuEq/34VjNmxlfzq+485jG63/Vst90svQapLwVgBZWgM8jxrLyCRXHU0wfBc7/1IhV/T9GYAplrJQAkG4J9Ow==", - "dependencies": { - "@sentry/types": "8.15.0", - "@sentry/utils": "8.15.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/node": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.15.0.tgz", - "integrity": "sha512-GQO9n+M4EldBE3TNWhGzFocpUw1BU5rGfX6KC6I8BDKUeJDPDZpDknmNHzcjE5aXd+SieGiyt0sE5PaT48cGlQ==", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.25.1", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/instrumentation-connect": "0.37.0", - "@opentelemetry/instrumentation-express": "0.40.1", - "@opentelemetry/instrumentation-fastify": "0.37.0", - "@opentelemetry/instrumentation-graphql": "0.41.0", - "@opentelemetry/instrumentation-hapi": "0.39.0", - "@opentelemetry/instrumentation-http": "0.52.1", - "@opentelemetry/instrumentation-ioredis": "0.41.0", - "@opentelemetry/instrumentation-koa": "0.41.0", - "@opentelemetry/instrumentation-mongodb": "0.45.0", - "@opentelemetry/instrumentation-mongoose": "0.39.0", - "@opentelemetry/instrumentation-mysql": "0.39.0", - "@opentelemetry/instrumentation-mysql2": "0.39.0", - "@opentelemetry/instrumentation-nestjs-core": "0.38.0", - "@opentelemetry/instrumentation-pg": "0.42.0", - "@opentelemetry/instrumentation-redis-4": "0.40.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1", - "@prisma/instrumentation": "5.16.1", - "@sentry/core": "8.15.0", - "@sentry/opentelemetry": "8.15.0", - "@sentry/types": "8.15.0", - "@sentry/utils": "8.15.0" - }, - "engines": { - "node": ">=14.18" - }, - "optionalDependencies": { - "opentelemetry-instrumentation-fetch-node": "1.2.0" - } - }, - "node_modules/@sentry/opentelemetry": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.15.0.tgz", - "integrity": "sha512-2ZkmdzvYgb2Ij8656Z3vvu9o9AWFSHeLXQgAHX+1VMvxTz+uc5EXeXv8aTboPnRxVje446DbNJ7j3gxNSD15cA==", - "dependencies": { - "@sentry/core": "8.15.0", - "@sentry/types": "8.15.0", - "@sentry/utils": "8.15.0" - }, - "engines": { - "node": ">=14.18" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1" - } - }, - "node_modules/@sentry/profiling-node": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-8.15.0.tgz", - "integrity": "sha512-1XVqrBx8sTmxHIrdDgrXQeNRmF6nCeV+AvJnvlTJWoENE5Mtchd29VxkYz8hc649VL8fZn5mZA7A/a8UaroMGw==", - "hasInstallScript": true, - "dependencies": { - "@sentry/core": "8.15.0", - "@sentry/node": "8.15.0", - "@sentry/types": "8.15.0", - "@sentry/utils": "8.15.0", - "detect-libc": "^2.0.2", - "node-abi": "^3.61.0" - }, - "bin": { - "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.js" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/types": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.15.0.tgz", - "integrity": "sha512-AZc9nSHKuNH8P/7ihmq5fbZBiQ7Gr35kJq9Tad9eVuOgL8D+2b6Vqu/61ljVVlMFI0tBGFsSkWJ/00PfBcVKWg==", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/utils": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.15.0.tgz", - "integrity": "sha512-1ISmyYFuRHJbGun0gUYscyz1aP6RfILUldNAUwQwF0Ycu8YOi4n8uwJRN0aov6cCi41tnZWOMBagSeLxbJiJgQ==", - "dependencies": { - "@sentry/types": "8.15.0" - }, - "engines": { - "node": ">=14.18" - } - }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -908,14 +402,6 @@ "node": ">= 6" } }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -931,39 +417,6 @@ "@types/node": "*" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", - "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" - }, - "node_modules/@types/cookies": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", - "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -972,38 +425,6 @@ "@types/ms": "*" } }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-assert": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", - "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1011,60 +432,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" - }, - "node_modules/@types/koa": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", - "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__router": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", - "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, - "node_modules/@types/mysql": { - "version": "2.15.22", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", - "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "20.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", @@ -1074,34 +446,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/pg-pool": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", - "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", - "dependencies": { - "@types/pg": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -1109,30 +453,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/shimmer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", - "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" - }, "node_modules/@types/twig": { "version": "1.12.16", "resolved": "https://registry.npmjs.org/@types/twig/-/twig-1.12.16.tgz", @@ -1370,6 +690,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1378,23 +699,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "optional": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1716,11 +1020,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, - "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2640,17 +1939,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-in-the-middle": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz", - "integrity": "sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, "node_modules/import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -2933,6 +2221,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, "license": "MIT" }, "node_modules/long": { @@ -3151,11 +2440,6 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -3324,51 +2608,6 @@ "wrappy": "1" } }, - "node_modules/opentelemetry-instrumentation-fetch-node": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.0.tgz", - "integrity": "sha512-aiSt/4ubOTyb1N5C2ZbGrBvaJOXIZhZvpRPYuUVxQJe27wJZqf/o65iPrqgLcgfeOLaQ8cS2Q+762jrYvniTrA==", - "optional": true, - "dependencies": { - "@opentelemetry/api": "^1.6.0", - "@opentelemetry/instrumentation": "^0.43.0", - "@opentelemetry/semantic-conventions": "^1.17.0" - }, - "engines": { - "node": ">18.0.0" - } - }, - "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.43.0.tgz", - "integrity": "sha512-S1uHE+sxaepgp+t8lvIDuRgyjJWisAb733198kwQTUc9ZtYQ2V2gmyCtR1x21ePGVLoMiX/NWY7WA290hwkjJQ==", - "optional": true, - "dependencies": { - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.4.2", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", - "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", - "optional": true, - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3789,19 +3028,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-in-the-middle": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", - "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4104,11 +3330,6 @@ "node": ">=8" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", diff --git a/package.json b/package.json index 83a502d..70201ba 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,6 @@ }, "type": "module", "dependencies": { - "@sentry/node": "^8.15.0", - "@sentry/profiling-node": "^8.15.0", "dependency-graph": "1.0.0", "iomem": "1.5.10", "mysql2": "3.10.2", From 5cfacf61c7faf5d5735b20809e6898a0ac999d0f Mon Sep 17 00:00:00 2001 From: reaby Date: Sat, 6 Jul 2024 19:41:19 +0300 Subject: [PATCH 27/35] update dependencies --- package-lock.json | 35 +++++++++++++++++++++++------------ package.json | 8 ++++---- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21bc2ea..11fe785 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,11 @@ "pg": "8.12.0", "pg-hstore": "2.3.4", "reflect-metadata": "^0.2.2", - "sequelize": "^6.37.3", - "sequelize-typescript": "^2.1.6", + "sequelize": "6.37.3", + "sequelize-typescript": "2.1.6", "sqlite3": "5.1.7", "tm-essentials": "1.0.5", - "tsx": "4.16.0", + "tsx": "4.16.2", "twig": "1.17.1", "umzug": "3.8.1", "xmlrpc": "1.3.2" @@ -31,7 +31,7 @@ "eslint-plugin-drizzle": "0.2.3" }, "peerDependencies": { - "typescript": "5.5.2" + "typescript": "5.5.3" } }, "node_modules/@babel/runtime": { @@ -1644,6 +1644,19 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3676,10 +3689,9 @@ } }, "node_modules/tsx": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.0.tgz", - "integrity": "sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==", - "license": "MIT", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", + "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", "dependencies": { "esbuild": "~0.21.5", "get-tsconfig": "^4.7.5" @@ -3827,10 +3839,9 @@ } }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", - "license": "Apache-2.0", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "peer": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 21b8ee2..5ed3c26 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,12 @@ "pg": "8.12.0", "pg-hstore": "2.3.4", "reflect-metadata": "^0.2.2", - "sequelize": "^6.37.3", - "sequelize-typescript": "^2.1.6", + "sequelize": "6.37.3", + "sequelize-typescript": "2.1.6", "umzug": "3.8.1", "sqlite3": "5.1.7", "tm-essentials": "1.0.5", - "tsx": "4.16.0", + "tsx": "4.16.2", "twig": "1.17.1", "xmlrpc": "1.3.2" }, @@ -36,7 +36,7 @@ "eslint-plugin-drizzle": "0.2.3" }, "peerDependencies": { - "typescript": "5.5.2" + "typescript": "5.5.3" }, "imports": { "core": "./core/", From 7b25e012e5bea5fe004d8425071e18b22542ba22 Mon Sep 17 00:00:00 2001 From: reaby Date: Sun, 7 Jul 2024 16:29:22 +0300 Subject: [PATCH 28/35] fix #38 --- core/minicontrol.ts | 4 ++-- core/plugins/widgets/bestcps/index.ts | 1 + core/plugins/widgets/checkpoints/index.ts | 15 +++++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/core/minicontrol.ts b/core/minicontrol.ts index 1bf1799..d85de59 100644 --- a/core/minicontrol.ts +++ b/core/minicontrol.ts @@ -209,9 +209,9 @@ class MiniControl { this.plugins[name] = cls; await cls.onLoad(); if (this.startComplete) { - await cls.onStart(); + await cls.onStart(); this.chat(`¤gray¤Plugin ¤cmd¤${name} ¤white¤loaded!`); - } + } this.cli("¤gray¤Success."); } catch (e: any) { tmc.cli("¤gray¤Error while starting plugin ¤cmd¤" + name); diff --git a/core/plugins/widgets/bestcps/index.ts b/core/plugins/widgets/bestcps/index.ts index 15c8e91..1883ddf 100644 --- a/core/plugins/widgets/bestcps/index.ts +++ b/core/plugins/widgets/bestcps/index.ts @@ -48,6 +48,7 @@ export default class BestCps extends Plugin { const time = data[1]; const nb = data[2]; if (nb >= this.maxCp) return; + if (nb >= this.nbCheckpoints - 1) return; if (this.bestTimes[nb] && time < this.bestTimes[nb].time) { this.bestTimes[nb] = { nickname: (await tmc.getPlayer(login)).nickname, time: time, prettyTime: formatTime(time) }; await this.display(); diff --git a/core/plugins/widgets/checkpoints/index.ts b/core/plugins/widgets/checkpoints/index.ts index bddc7bf..e800d7d 100644 --- a/core/plugins/widgets/checkpoints/index.ts +++ b/core/plugins/widgets/checkpoints/index.ts @@ -9,7 +9,7 @@ export default class Checkpoints extends Plugin { async onLoad() { tmc.server.addListener("Trackmania.BeginMap", this.onBeginMap, this); - tmc.server.addListener("Trackmania.EndRace", this.onHideWidget, this); + tmc.server.addListener("Trackmania.EndRace", this.onHideWidget, this); tmc.server.addListener("TMC.PlayerConnect", this.onPlayerConnect, this); tmc.server.addListener("TMC.PlayerDisconnect", this.onPlayerDisconnect, this); tmc.server.addListener("TMC.PlayerCheckpoint", this.onPlayerCheckpoint, this); @@ -40,7 +40,7 @@ export default class Checkpoints extends Plugin { widget.pos = { x: 0, y: -74 }; widget.size = { width: 20, height: 5 }; widget.data = { - totalCheckpoints: tmc.maps.currentMap?.NbCheckpoints || 0, + totalCheckpoints: (tmc.maps.currentMap?.NbCheckpoints || 0) - 1, currentCheckpoint: this.checkpointCounter[login] || 0, }; this.widgets[login] = widget; @@ -76,12 +76,15 @@ export default class Checkpoints extends Plugin { async onPlayerCheckpoint(data: any) { this.checkpointCounter[data[0]] += 1; - await this.displayWidget(data[0]); + if (this.checkpointCounter[data[0]] < (tmc.maps.currentMap?.NbCheckpoints || 0)) { + await this.displayWidget(data[0]); + } + } async onPlayerFinish(data: any) { - // this.checkpointCounter[data[0]] = 0; - // await this.displayWidget(data[0]); + this.checkpointCounter[data[0]] = 0; + await this.displayWidget(data[0]); } async onPlayerGiveup(data: any) { @@ -95,7 +98,7 @@ export default class Checkpoints extends Plugin { await this.onPlayerConnect(player); } this.widgets[login].data = { - totalCheckpoints: tmc.maps.currentMap?.NbCheckpoints || 0, + totalCheckpoints: (tmc.maps.currentMap?.NbCheckpoints || 0) - 1, currentCheckpoint: this.checkpointCounter[login] || 0, }; await this.widgets[login].display(); From cfbbad628a1e55a9d47daae810a0af8916ca2c9f Mon Sep 17 00:00:00 2001 From: reaby Date: Sun, 7 Jul 2024 18:58:31 +0300 Subject: [PATCH 29/35] move migrations folder to core --- {migrations => core/migrations}/00-create-map.ts | 2 +- {migrations => core/migrations}/00-create-maplikes.ts | 2 +- {migrations => core/migrations}/00-create-player.ts | 2 +- {migrations => core/migrations}/00-create-scores.ts | 2 +- core/plugins/database/index.ts | 2 +- xaseco.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename {migrations => core/migrations}/00-create-map.ts (95%) rename {migrations => core/migrations}/00-create-maplikes.ts (94%) rename {migrations => core/migrations}/00-create-player.ts (94%) rename {migrations => core/migrations}/00-create-scores.ts (95%) diff --git a/migrations/00-create-map.ts b/core/migrations/00-create-map.ts similarity index 95% rename from migrations/00-create-map.ts rename to core/migrations/00-create-map.ts index e2a7399..1d81218 100644 --- a/migrations/00-create-map.ts +++ b/core/migrations/00-create-map.ts @@ -1,5 +1,5 @@ import { DataTypes } from 'sequelize'; -import type { Migration } from '../migrate'; +import type { Migration } from '../../migrate'; export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('maps', { diff --git a/migrations/00-create-maplikes.ts b/core/migrations/00-create-maplikes.ts similarity index 94% rename from migrations/00-create-maplikes.ts rename to core/migrations/00-create-maplikes.ts index 3f587ee..5a23dbd 100644 --- a/migrations/00-create-maplikes.ts +++ b/core/migrations/00-create-maplikes.ts @@ -1,5 +1,5 @@ import { DataTypes } from 'sequelize'; -import type { Migration } from '../migrate'; +import type { Migration } from '../../migrate'; export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('maplikes', { diff --git a/migrations/00-create-player.ts b/core/migrations/00-create-player.ts similarity index 94% rename from migrations/00-create-player.ts rename to core/migrations/00-create-player.ts index 8aeb89e..bd29732 100644 --- a/migrations/00-create-player.ts +++ b/core/migrations/00-create-player.ts @@ -1,5 +1,5 @@ import { DataTypes } from 'sequelize'; -import type { Migration } from '../migrate'; +import type { Migration } from '../../migrate'; export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('players', { diff --git a/migrations/00-create-scores.ts b/core/migrations/00-create-scores.ts similarity index 95% rename from migrations/00-create-scores.ts rename to core/migrations/00-create-scores.ts index 91f39bc..dd5fc74 100644 --- a/migrations/00-create-scores.ts +++ b/core/migrations/00-create-scores.ts @@ -1,5 +1,5 @@ import { DataTypes } from 'sequelize'; -import type { Migration } from '../migrate'; +import type { Migration } from '../../migrate'; export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable('scores', { diff --git a/core/plugins/database/index.ts b/core/plugins/database/index.ts index a82131d..02b3026 100644 --- a/core/plugins/database/index.ts +++ b/core/plugins/database/index.ts @@ -32,7 +32,7 @@ export default class GenericDb extends Plugin { } try { - for (const path of ["./migrations/", "./userdata/migrations/"]) { + for (const path of ["./core/migrations/", "./userdata/migrations/"]) { const migrator = new Umzug({ migrations: { glob: [path + '*.ts', { cwd: process.cwd() }], diff --git a/xaseco.ts b/xaseco.ts index dbea148..6f08613 100644 --- a/xaseco.ts +++ b/xaseco.ts @@ -44,7 +44,7 @@ async function init() { } try { - for (const path of ["./migrations/", "./userdata/migrations/"]) { + for (const path of ["./core/migrations/", "./userdata/migrations/"]) { const migrator = new Umzug({ migrations: { glob: [path + '*.ts', { cwd: process.cwd() }], From 26bce7226b6214dab6cf94709c522972f7c56568 Mon Sep 17 00:00:00 2001 From: reaby Date: Sun, 7 Jul 2024 20:42:42 +0300 Subject: [PATCH 30/35] fixes --- core/plugins/debugtool/index.ts | 4 +- core/plugins/tmnf/freezone/index.ts | 2 +- core/plugins/tmnf/talimit/index.ts | 2 +- core/plugins/widgets/dedimania/widget.twig | 2 +- core/plugins/widgets/records/index.ts | 103 +++++++++++------- core/plugins/widgets/records/widget.twig | 7 +- core/plugins/widgets/records/widget_tmnf.twig | 34 ------ core/ui/manialink.ts | 3 +- core/ui/widget.ts | 4 + core/uimanager.ts | 45 ++++++++ 10 files changed, 125 insertions(+), 81 deletions(-) delete mode 100644 core/plugins/widgets/records/widget_tmnf.twig diff --git a/core/plugins/debugtool/index.ts b/core/plugins/debugtool/index.ts index 98f6640..c989773 100644 --- a/core/plugins/debugtool/index.ts +++ b/core/plugins/debugtool/index.ts @@ -5,7 +5,7 @@ import Widget from '../../ui/widget'; export default class DebugTool extends Plugin { widget: Widget | null = null; - intervalId: NodeJS.Timer | null = null; + intervalId: any | null = null; async onLoad() { if (process.env.DEBUG == "true") { @@ -18,7 +18,7 @@ export default class DebugTool extends Plugin { await this.displayMemInfo(); this.intervalId = setInterval(() => { this.displayMemInfo(); - }, 60000) as NodeJS.Timer; + }, 60000) as any; } async onUnload() { diff --git a/core/plugins/tmnf/freezone/index.ts b/core/plugins/tmnf/freezone/index.ts index 312fa3b..f4bf5b2 100644 --- a/core/plugins/tmnf/freezone/index.ts +++ b/core/plugins/tmnf/freezone/index.ts @@ -38,7 +38,7 @@ export default class Freezone extends Plugin { mlHash: string = "6f116833b419fe7cb9c912fdaefb774845f60e79" mlUrl: string = "ws.trackmania.com" mlVersion: string = "239" - heartbeatInterval: Timer | null = null; + heartbeatInterval: any | null = null; onLoad = async () => { if (!this.password) { diff --git a/core/plugins/tmnf/talimit/index.ts b/core/plugins/tmnf/talimit/index.ts index 6d308a7..201dfa3 100644 --- a/core/plugins/tmnf/talimit/index.ts +++ b/core/plugins/tmnf/talimit/index.ts @@ -9,7 +9,7 @@ export default class TAlimitPlugin extends Plugin { active: boolean = false; extend: boolean = false; widget: Widget | null = null; - intervalId: Timer | null = null; + intervalId: any | null = null; async onBeginRound() { this.startTime = Date.now(); diff --git a/core/plugins/widgets/dedimania/widget.twig b/core/plugins/widgets/dedimania/widget.twig index 4775c26..66fb36a 100644 --- a/core/plugins/widgets/dedimania/widget.twig +++ b/core/plugins/widgets/dedimania/widget.twig @@ -3,7 +3,7 @@ {% block content %} {% for item in data.records %} -