diff --git a/package-lock.json b/package-lock.json index e61822b..6874bdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,11 +17,11 @@ "discord.js": "^14.3.0", "dotenv": "^16.0.0", "express": "^4.18.2", + "glob": "^10.3.10", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", "minimatch": "9.0.3", "mysql": "^2.18.1", - "sqlite3": "^5.1.6", "ts-jest": "^29.0.0", "typeorm": "0.3.17" }, @@ -808,7 +808,49 @@ "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 + "optional": true, + "peer": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -1225,6 +1267,8 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "peer": true, "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -1244,6 +1288,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "peer": true, "dependencies": { "semver": "^6.0.0" }, @@ -1258,6 +1304,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -1299,6 +1347,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", "optional": true, + "peer": true, "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -1310,6 +1359,7 @@ "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "deprecated": "This functionality has been moved to @npmcli/fs", "optional": true, + "peer": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -1323,6 +1373,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "optional": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -1330,6 +1381,15 @@ "node": ">=10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "dev": true, @@ -1463,6 +1523,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "optional": true, + "peer": true, "engines": { "node": ">= 6" } @@ -1693,7 +1754,9 @@ "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==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true, + "peer": true }, "node_modules/accepts": { "version": "1.3.8", @@ -1710,6 +1773,8 @@ "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, + "peer": true, "dependencies": { "debug": "4" }, @@ -1721,6 +1786,8 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -1736,13 +1803,16 @@ "node_modules/agent-base/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==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true, + "peer": true }, "node_modules/agentkeepalive": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "optional": true, + "peer": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -1890,12 +1960,16 @@ "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==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true, + "peer": true }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -1908,6 +1982,8 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2338,6 +2414,7 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "optional": true, + "peer": true, "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -2367,6 +2444,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "optional": true, + "peer": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2380,6 +2458,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2390,6 +2469,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -2399,6 +2479,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2419,6 +2500,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -2428,6 +2510,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2440,6 +2523,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2452,6 +2536,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "optional": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -2464,6 +2549,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "optional": true, + "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -2589,6 +2675,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -2920,6 +3008,8 @@ "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, + "peer": true, "bin": { "color-support": "bin.js" } @@ -2989,7 +3079,9 @@ "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==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true, + "peer": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -3361,7 +3453,9 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true, + "peer": true }, "node_modules/depd": { "version": "2.0.0", @@ -3382,6 +3476,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -3471,7 +3567,6 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "dev": true, "license": "MIT" }, "node_modules/ee-first": { @@ -3516,6 +3611,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -3525,6 +3621,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -3545,6 +3642,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -3553,7 +3651,8 @@ "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 + "optional": true, + "peer": true }, "node_modules/error-ex": { "version": "1.3.2", @@ -3835,6 +3934,32 @@ "node": ">=8" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data-encoder": { "version": "2.1.4", "dev": true, @@ -3861,6 +3986,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -3872,6 +3999,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -3905,6 +4034,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "peer": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -3924,6 +4055,8 @@ "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, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3937,6 +4070,8 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3993,6 +4128,27 @@ "dev": true, "license": "MIT" }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "dev": true, @@ -4157,7 +4313,9 @@ "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==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true, + "peer": true }, "node_modules/has-yarn": { "version": "3.0.0", @@ -4224,6 +4382,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "optional": true, + "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -4238,6 +4397,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "optional": true, + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -4254,7 +4414,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true + "optional": true, + "peer": true }, "node_modules/http2-wrapper": { "version": "1.0.3", @@ -4272,6 +4433,8 @@ "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, + "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4284,6 +4447,8 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -4299,7 +4464,9 @@ "node_modules/https-proxy-agent/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==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true, + "peer": true }, "node_modules/human-signals": { "version": "2.1.0", @@ -4313,6 +4480,7 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "optional": true, + "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -4444,7 +4612,8 @@ "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 + "optional": true, + "peer": true }, "node_modules/inflight": { "version": "1.0.6", @@ -4783,7 +4952,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "optional": true + "optional": true, + "peer": true }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -4925,7 +5095,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "optional": true + "optional": true, + "peer": true }, "node_modules/is-name-taken": { "version": "2.0.0", @@ -5170,6 +5341,23 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { "version": "29.7.0", "license": "MIT", @@ -6386,6 +6574,7 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "optional": true, + "peer": true, "dependencies": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", @@ -6413,6 +6602,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6549,11 +6739,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "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, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -6566,6 +6765,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6578,6 +6778,7 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "optional": true, + "peer": true, "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", @@ -6595,6 +6796,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6607,6 +6809,7 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -6619,6 +6822,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6631,6 +6835,7 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -6643,6 +6848,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6655,6 +6861,7 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -6667,6 +6874,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6678,6 +6886,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -6690,6 +6900,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6776,12 +6988,16 @@ "node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "optional": true, + "peer": true }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6802,6 +7018,7 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "optional": true, + "peer": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -6826,6 +7043,7 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "optional": true, + "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -6839,6 +7057,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6849,6 +7068,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "optional": true, + "peer": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -6868,6 +7088,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6888,6 +7109,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6900,6 +7122,7 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "optional": true, + "peer": true, "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -6915,6 +7138,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6929,6 +7153,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "optional": true, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6943,6 +7168,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6962,6 +7188,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "peer": true, "dependencies": { "abbrev": "1" }, @@ -7236,6 +7464,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "peer": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -7793,6 +8023,29 @@ "version": "1.0.7", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "license": "MIT" @@ -7954,13 +8207,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "optional": true + "optional": true, + "peer": 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, + "peer": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -8401,6 +8656,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "optional": true, + "peer": true, "engines": { "node": ">= 4" } @@ -8416,6 +8672,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "devOptional": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -8429,6 +8686,7 @@ }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", + "devOptional": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -8437,6 +8695,7 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "devOptional": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -8455,6 +8714,7 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "devOptional": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8625,7 +8885,9 @@ "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==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true, + "peer": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -8699,6 +8961,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -8709,6 +8972,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "optional": true, + "peer": true, "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -8723,6 +8987,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", "optional": true, + "peer": true, "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -8737,6 +9002,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "optional": true, + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -8753,7 +9019,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true + "optional": true, + "peer": true }, "node_modules/source-map": { "version": "0.6.1", @@ -8807,6 +9074,8 @@ "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", "node-addon-api": "^4.2.0", @@ -8836,6 +9105,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "optional": true, + "peer": true, "dependencies": { "minipass": "^3.1.1" }, @@ -8848,6 +9118,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8914,7 +9185,6 @@ }, "node_modules/string-width": { "version": "5.1.2", - "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -8928,9 +9198,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -8941,12 +9235,10 @@ }, "node_modules/string-width/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, "license": "MIT" }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -8969,6 +9261,18 @@ "node": ">=0.10.0" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi/node_modules/ansi-regex": { "version": "2.1.1", "dev": true, @@ -9045,6 +9349,8 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "optional": true, + "peer": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -9061,6 +9367,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -9069,6 +9377,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -9239,7 +9549,9 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true, + "peer": true }, "node_modules/ts-essentials": { "version": "7.0.3", @@ -9551,6 +9863,7 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "optional": true, + "peer": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -9560,6 +9873,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "optional": true, + "peer": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -9743,12 +10057,16 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true, + "peer": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -9771,6 +10089,8 @@ "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, + "peer": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -9779,6 +10099,8 @@ "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, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9792,6 +10114,8 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9815,7 +10139,6 @@ }, "node_modules/wrap-ansi": { "version": "8.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -9829,9 +10152,49 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9842,7 +10205,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9853,7 +10215,6 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" diff --git a/package.json b/package.json index ad7a30f..a60e28c 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,11 @@ "discord.js": "^14.3.0", "dotenv": "^16.0.0", "express": "^4.18.2", + "glob": "^10.3.10", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", "minimatch": "9.0.3", "mysql": "^2.18.1", - "sqlite3": "^5.1.6", "ts-jest": "^29.0.0", "typeorm": "0.3.17" }, diff --git a/src/Functions/CardMetadataFunction.ts b/src/Functions/CardMetadataFunction.ts new file mode 100644 index 0000000..1d52a27 --- /dev/null +++ b/src/Functions/CardMetadataFunction.ts @@ -0,0 +1,41 @@ +import { readFileSync } from "fs"; +import path from "path"; +import Config from "../database/entities/app/Config"; +import { glob } from "glob"; +import SeriesMetadata from "../contracts/SeriesMetadata"; +import { CoreClient } from "../client/client"; + +export default class CardMetadataFunction { + public static async Execute(overrideSafeMode: boolean = false): Promise { + if (!overrideSafeMode && await Config.GetValue('safemode') == "true") return false; + + try { + CoreClient.Cards = await this.FindMetadataJSONs(); + + console.log(`Loaded ${CoreClient.Cards.flatMap(x => x.cards).length} cards to database`); + } catch (e) { + console.error(e); + + await Config.SetValue('safemode', 'true'); + return false; + } + + return true; + } + + private static async FindMetadataJSONs(): Promise { + const res: SeriesMetadata[] = []; + + const seriesJSONs = await glob(path.join(process.cwd(), 'cards', '/**/*.json')); + + for (let jsonPath of seriesJSONs) { + console.log(`Reading file ${jsonPath}`); + const jsonFile = readFileSync(jsonPath); + const parsedJson: SeriesMetadata[] = JSON.parse(jsonFile.toString()); + + res.push(...parsedJson); + } + + return res; + } +} \ No newline at end of file diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts deleted file mode 100644 index ea8c2c6..0000000 --- a/src/Functions/CardSetupFunction.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { existsSync, readdirSync } from "fs"; -import CardDataSource from "../database/dataSources/cardDataSource"; -import Card from "../database/entities/card/Card"; -import Series from "../database/entities/card/Series"; -import path from "path"; -import { CardRarity, CardRarityToString } from "../constants/CardRarity"; -import Config from "../database/entities/app/Config"; - -export default class CardSetupFunction { - public static async Execute(): Promise { - if (await Config.GetValue('safemode') == "true") return false; - - try { - await this.ClearDatabase(); - await this.ReadSeries(); - await this.ReadCards(); - } catch { - await Config.SetValue('safemode', 'true'); - return false; - } - - return true; - } - - private static async ClearDatabase() { - const cardRepository = CardDataSource.getRepository(Card); - await cardRepository.clear(); - - const seriesRepository = CardDataSource.getRepository(Series); - await seriesRepository.clear(); - } - - private static async ReadSeries() { - const seriesDir = readdirSync(path.join(process.cwd(), 'cards')); - - const seriesRepository = CardDataSource.getRepository(Series); - - const seriesToSave: Series[] = []; - - for (let dir of seriesDir) { - const dirPart = dir.split(' '); - - const seriesId = dirPart.shift(); - const seriesName = dirPart.join(' '); - - const series = new Series(seriesId!, seriesName, dir); - - seriesToSave.push(series); - } - - await seriesRepository.save(seriesToSave); - } - - private static async ReadCards() { - const loadedSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]); - - const cardRepository = CardDataSource.getRepository(Card); - - const cardsToSave: Card[] = []; - - for (let series of loadedSeries) { - const cardDirBronze = this.GetCardFiles(CardRarity.Bronze, series); - const cardDirGold = this.GetCardFiles(CardRarity.Gold, series); - const cardDirLegendary = this.GetCardFiles(CardRarity.Legendary, series); - const cardDirSilver = this.GetCardFiles(CardRarity.Silver, series); - const cardDirManga = this.GetCardFiles(CardRarity.Manga, series); - - cardsToSave.push( - ...this.GenerateCardData(cardDirBronze, CardRarity.Bronze, series), - ...this.GenerateCardData(cardDirGold, CardRarity.Gold, series), - ...this.GenerateCardData(cardDirLegendary, CardRarity.Legendary, series), - ...this.GenerateCardData(cardDirSilver, CardRarity.Silver, series), - ...this.GenerateCardData(cardDirManga, CardRarity.Manga, series) - ); - } - - await cardRepository.save(cardsToSave); - - console.log(`Loaded ${cardsToSave.length} cards to database`); - } - - private static GenerateCardData(files: string[], rarity: CardRarity, series: Series): Card[] { - const result: Card[] = []; - - for (let file of files.filter(x => !x.startsWith('.') && (x.endsWith('.png') || x.endsWith('.jpg') || x.endsWith('.gif')))) { - const filePart = file.split('.'); - - const cardId = filePart[0]; - const cardName = filePart[0]; - - const card = new Card(cardId, cardName, rarity, path.join(process.cwd(), 'cards', series.Path, CardRarityToString(rarity).toUpperCase(), file), file, series); - - result.push(card); - } - - return result; - } - - private static GetCardFiles(rarity: CardRarity, series: Series): string[] { - const folder = path.join(process.cwd(), 'cards', series.Path, CardRarityToString(rarity).toUpperCase()); - const folderExists = existsSync(folder); - - return folderExists ? readdirSync(folder) : []; - } -} \ No newline at end of file diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index 38cae08..274c846 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -1,11 +1,12 @@ import { AttachmentBuilder, ButtonInteraction, DiscordAPIError } from "discord.js"; import { ButtonEvent } from "../type/buttonEvent"; -import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; import { v4 } from "uuid"; import { CoreClient } from "../client/client"; import Inventory from "../database/entities/app/Inventory"; import Config from "../database/entities/app/Config"; +import CardDropHelperMetadata from "../helpers/CardDropHelperMetadata"; +import path from "path"; export default class Reroll extends ButtonEvent { public override async execute(interaction: ButtonInteraction) { @@ -14,34 +15,40 @@ export default class Reroll extends ButtonEvent { return; } - if (await Config.GetValue('safemode') == "true") - { - await interaction.reply('Safe Mode has been activated, please resync to contunue.'); + if (await Config.GetValue('safemode') == "true") { + await interaction.reply('Safe Mode has been activated, please resync to continue.'); return; } - if (!interaction.guild || !interaction.guildId) return; + const randomCard = CardDropHelperMetadata.GetRandomCard(); - let randomCard = await CardDropHelper.GetRandomCard(); - - if (process.env.DROP_RARITY && Number(process.env.DROP_RARITY) > 0) { - randomCard = await CardDropHelper.GetRandomCardByRarity(Number(process.env.DROP_RARITY)); + if (!randomCard) { + await interaction.reply('Unable to fetch card, please try again.'); + return; } - const image = readFileSync(randomCard.Path); + let image: Buffer; + const imageFileName = randomCard.card.path.split("/").pop()!; + + try { + image = readFileSync(path.join(process.cwd(), 'cards', randomCard.card.path)); + } catch { + await interaction.reply(`Unable to fetch image for card ${randomCard.card.id}`); + return; + } await interaction.deferReply(); - const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); + const attachment = new AttachmentBuilder(image, { name: imageFileName }); - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); const quantityClaimed = inventory ? inventory.Quantity : 0; - const embed = CardDropHelper.GenerateDropEmbed(randomCard, quantityClaimed || 0); + const embed = CardDropHelperMetadata.GenerateDropEmbed(randomCard, quantityClaimed, imageFileName); const claimId = v4(); - const row = CardDropHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); + const row = CardDropHelperMetadata.GenerateDropButtons(randomCard, claimId, interaction.user.id); try { await interaction.editReply({ diff --git a/src/client/client.ts b/src/client/client.ts index f909d19..643036d 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -7,13 +7,13 @@ import { Command } from "../type/command"; import { Events } from "./events"; import { Util } from "./util"; -import CardSetupFunction from "../Functions/CardSetupFunction"; -import CardDataSource from "../database/dataSources/cardDataSource"; import IButtonEventItem from "../contracts/IButtonEventItem"; import { ButtonEvent } from "../type/buttonEvent"; import AppDataSource from "../database/dataSources/appDataSource"; import { Environment } from "../constants/Environment"; import Webhooks from "../webhooks"; +import CardMetadataFunction from "../Functions/CardMetadataFunction"; +import SeriesMetadata from "../contracts/SeriesMetadata"; export class CoreClient extends Client { private static _commandItems: ICommandItem[]; @@ -27,6 +27,7 @@ export class CoreClient extends Client { public static ClaimId: string; public static Environment: Environment; public static AllowDrops: boolean; + public static Cards: SeriesMetadata[]; public static get commandItems(): ICommandItem[] { return this._commandItems; @@ -68,14 +69,10 @@ export class CoreClient extends Client { .then(() => console.log("App Data Source Initialised")) .catch(err => console.error("Error initialising App Data Source", err)); - await CardDataSource.initialize() - .then(() => console.log("Card Data Source Initialised")) - .catch(err => console.error("Error initialising Card Data Source", err)); - super.on("interactionCreate", this._events.onInteractionCreate); super.on("ready", this._events.onReady); - await CardSetupFunction.Execute(); + await CardMetadataFunction.Execute(true); this._util.loadEvents(this, CoreClient._eventItems); this._util.loadSlashCommands(this); diff --git a/src/commands/drop.ts b/src/commands/drop.ts index bebe581..9c6646a 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -1,11 +1,12 @@ import { AttachmentBuilder, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; -import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; import { v4 } from "uuid"; import Inventory from "../database/entities/app/Inventory"; import Config from "../database/entities/app/Config"; +import CardDropHelperMetadata from "../helpers/CardDropHelperMetadata"; +import path from "path"; export default class Drop extends Command { constructor() { @@ -22,28 +23,40 @@ export default class Drop extends Command { return; } - if (await Config.GetValue('safemode') == "true") - { - await interaction.reply('Safe Mode has been activated, please resync to contunue.'); + if (await Config.GetValue('safemode') == "true") { + await interaction.reply('Safe Mode has been activated, please resync to continue.'); return; } - const randomCard = await CardDropHelper.GetRandomCard(); + const randomCard = CardDropHelperMetadata.GetRandomCard(); - const image = readFileSync(randomCard.Path); + if (!randomCard) { + await interaction.reply('Unable to fetch card, please try again.'); + return; + } + + let image: Buffer; + const imageFileName = randomCard.card.path.split("/").pop()!; + + try { + image = readFileSync(path.join(process.cwd(), 'cards', randomCard.card.path)); + } catch { + await interaction.reply(`Unable to fetch image for card ${randomCard.card.id}`); + return; + } await interaction.deferReply(); - const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); + const attachment = new AttachmentBuilder(image, { name: imageFileName }); - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); const quantityClaimed = inventory ? inventory.Quantity : 0; - const embed = CardDropHelper.GenerateDropEmbed(randomCard, quantityClaimed || 0); + const embed = CardDropHelperMetadata.GenerateDropEmbed(randomCard, quantityClaimed, imageFileName); const claimId = v4(); - const row = CardDropHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); + const row = CardDropHelperMetadata.GenerateDropButtons(randomCard, claimId, interaction.user.id); try { await interaction.editReply({ diff --git a/src/commands/gdrivesync.ts b/src/commands/gdrivesync.ts index 97009a2..8b60722 100644 --- a/src/commands/gdrivesync.ts +++ b/src/commands/gdrivesync.ts @@ -1,9 +1,9 @@ import { CacheType, CommandInteraction, PermissionsBitField, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; import { ExecException, exec } from "child_process"; -import CardSetupFunction from "../Functions/CardSetupFunction"; import { CoreClient } from "../client/client"; import Config from "../database/entities/app/Config"; +import CardMetadataFunction from "../Functions/CardMetadataFunction"; export default class Gdrivesync extends Command { constructor() { @@ -34,7 +34,8 @@ export default class Gdrivesync extends Command { await interaction.editReply(`Error while running sync command. Safe Mode has been activated. Code: ${error.code}`); await Config.SetValue('safemode', 'true'); } else { - await CardSetupFunction.Execute(); + await CardMetadataFunction.Execute(); + await interaction.editReply('Synced successfully.'); CoreClient.AllowDrops = true; diff --git a/src/commands/resync.ts b/src/commands/resync.ts index a3ea823..f1684b6 100644 --- a/src/commands/resync.ts +++ b/src/commands/resync.ts @@ -1,7 +1,7 @@ import { CacheType, CommandInteraction, PermissionsBitField, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; -import CardSetupFunction from "../Functions/CardSetupFunction"; import Config from "../database/entities/app/Config"; +import CardMetadataFunction from "../Functions/CardMetadataFunction"; export default class Resync extends Command { constructor() { @@ -23,7 +23,9 @@ export default class Resync extends Command { return; } - if (await CardSetupFunction.Execute()) { + let result = await CardMetadataFunction.Execute(true); + + if (result) { if (await Config.GetValue('safemode') == "true") { await Config.SetValue('safemode', 'false'); await interaction.reply("Resynced database and disabled safe mode."); diff --git a/src/commands/stage/dropnumber.ts b/src/commands/stage/dropnumber.ts index dd42a43..d311f33 100644 --- a/src/commands/stage/dropnumber.ts +++ b/src/commands/stage/dropnumber.ts @@ -1,11 +1,11 @@ import { AttachmentBuilder, CacheType, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../../type/command"; -import Card from "../../database/entities/card/Card"; import { readFileSync } from "fs"; import Inventory from "../../database/entities/app/Inventory"; -import CardDropHelper from "../../helpers/CardDropHelper"; import { v4 } from "uuid"; import { CoreClient } from "../../client/client"; +import path from "path"; +import CardDropHelperMetadata from "../../helpers/CardDropHelperMetadata"; export default class Dropnumber extends Command { constructor() { @@ -31,29 +31,42 @@ export default class Dropnumber extends Command { return; } - const card = await Card.FetchOneByCardNumber(cardNumber.value.toString(), [ - "Series" - ]); + const series = CoreClient.Cards.find(x => x.cards.find(y => y.id == cardNumber.toString())); + + if (!series) { + await interaction.reply('Card not found'); + return; + } + + const card = series.cards.find(x => x.id == cardNumber.toString()); if (!card) { await interaction.reply('Card not found'); return; } - const image = readFileSync(card.Path); + let image: Buffer; + const imageFileName = card.path.split("/").pop()!; + + try { + image = readFileSync(path.join(process.cwd(), 'cards', card.path)); + } catch { + await interaction.reply(`Unable to fetch image for card ${card.id}`); + return; + } await interaction.deferReply(); - const attachment = new AttachmentBuilder(image, { name: card.FileName }); + const attachment = new AttachmentBuilder(image, { name: imageFileName }); - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.CardNumber); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.id); const quantityClaimed = inventory ? inventory.Quantity : 0; - const embed = CardDropHelper.GenerateDropEmbed(card, quantityClaimed || 0); + const embed = CardDropHelperMetadata.GenerateDropEmbed({ card, series }, quantityClaimed, imageFileName); const claimId = v4(); - const row = CardDropHelper.GenerateDropButtons(card, claimId, interaction.user.id); + const row = CardDropHelperMetadata.GenerateDropButtons({ card, series }, claimId, interaction.user.id); try { await interaction.editReply({ @@ -67,7 +80,7 @@ export default class Dropnumber extends Command { if (e instanceof DiscordAPIError) { await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. Code: ${e.code}`); } else { - await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening.Code: UNKNOWN`); + await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. Code: UNKNOWN`); } } diff --git a/src/commands/stage/droprarity.ts b/src/commands/stage/droprarity.ts index fa11b78..efe431f 100644 --- a/src/commands/stage/droprarity.ts +++ b/src/commands/stage/droprarity.ts @@ -1,11 +1,12 @@ import { AttachmentBuilder, CacheType, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../../type/command"; import { CardRarity, CardRarityParse } from "../../constants/CardRarity"; -import CardDropHelper from "../../helpers/CardDropHelper"; import { readFileSync } from "fs"; import Inventory from "../../database/entities/app/Inventory"; import { v4 } from "uuid"; import { CoreClient } from "../../client/client"; +import CardDropHelperMetadata from "../../helpers/CardDropHelperMetadata"; +import path from "path"; export default class Droprarity extends Command { constructor() { @@ -38,27 +39,35 @@ export default class Droprarity extends Command { return; } - const card = await CardDropHelper.GetRandomCardByRarity(rarityType); + const card = await CardDropHelperMetadata.GetRandomCardByRarity(rarityType); if (!card) { await interaction.reply('Card not found'); return; } - const image = readFileSync(card.Path); + let image: Buffer; + const imageFileName = card.card.path.split("/").pop()!; + + try { + image = readFileSync(path.join(process.cwd(), 'cards', card.card.path)); + } catch { + await interaction.reply(`Unable to fetch image for card ${card.card.id}`); + return; + } await interaction.deferReply(); - const attachment = new AttachmentBuilder(image, { name: card.FileName }); + const attachment = new AttachmentBuilder(image, { name: imageFileName }); - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.CardNumber); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.card.id); const quantityClaimed = inventory ? inventory.Quantity : 0; - const embed = CardDropHelper.GenerateDropEmbed(card, quantityClaimed || 0); + const embed = CardDropHelperMetadata.GenerateDropEmbed(card, quantityClaimed, imageFileName); const claimId = v4(); - const row = CardDropHelper.GenerateDropButtons(card, claimId, interaction.user.id); + const row = CardDropHelperMetadata.GenerateDropButtons(card, claimId, interaction.user.id); try { await interaction.editReply({ diff --git a/src/contracts/CardBaseEntity.ts b/src/contracts/CardBaseEntity.ts deleted file mode 100644 index d498405..0000000 --- a/src/contracts/CardBaseEntity.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Column, DeepPartial, EntityTarget, PrimaryColumn, ObjectLiteral, FindOptionsWhere } from "typeorm"; -import { v4 } from "uuid"; -import AppDataSource from "../database/dataSources/appDataSource"; -import CardDataSource from "../database/dataSources/cardDataSource"; - -export default class CardBaseEntity { - constructor() { - this.Id = v4(); - - this.WhenCreated = new Date(); - this.WhenUpdated = new Date(); - } - - @PrimaryColumn() - Id: string; - - @Column() - WhenCreated: Date; - - @Column() - WhenUpdated: Date; - - public async Save(target: EntityTarget, entity: DeepPartial): Promise { - this.WhenUpdated = new Date(); - - const repository = CardDataSource.getRepository(target); - - await repository.save(entity); - } - - public static async Remove(target: EntityTarget, entity: T): Promise { - const repository = CardDataSource.getRepository(target); - - await repository.remove(entity); - } - - public static async FetchAll(target: EntityTarget, relations?: string[]): Promise { - const repository = CardDataSource.getRepository(target); - - const all = await repository.find({ relations: relations || [] }); - - return all; - } - - public static async FetchOneById(target: EntityTarget, id: string, relations?: string[]): Promise { - const repository = CardDataSource.getRepository(target); - - const single = await repository.findOne({ where: ({ Id: id } as FindOptionsWhere), relations: relations || {} }); - - return single; - } - - public static async Any(target: EntityTarget): Promise { - const repository = CardDataSource.getRepository(target); - - const any = await repository.find(); - - return any.length > 0; - } -} \ No newline at end of file diff --git a/src/contracts/SeriesMetadata.ts b/src/contracts/SeriesMetadata.ts new file mode 100644 index 0000000..3ef95c0 --- /dev/null +++ b/src/contracts/SeriesMetadata.ts @@ -0,0 +1,19 @@ +import { CardRarity } from "../constants/CardRarity"; + +export default interface SeriesMetadata { + id: number, + name: string, + cards: CardMetadata[], +} + +export interface CardMetadata { + id: string, + name: string, + type: CardRarity, + path: string, +} + +export interface DropResult { + series: SeriesMetadata, + card: CardMetadata, +} \ No newline at end of file diff --git a/src/database/dataSources/cardDataSource.ts b/src/database/dataSources/cardDataSource.ts deleted file mode 100644 index f32a7f2..0000000 --- a/src/database/dataSources/cardDataSource.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { DataSource } from "typeorm"; -import * as dotenv from "dotenv"; - -dotenv.config(); - -const CardDataSource = new DataSource({ - type: "sqlite", - database: process.env.DB_CARD_FILE!, - synchronize: true, - logging: process.env.DB_LOGGING == "true", - entities: [ - "dist/database/entities/card/**/*.js", - ], - migrations: [ - "dist/database/migrations/card/**/*.js", - ], - subscribers: [ - "dist/database/subscribers/card/**/*.js", - ], -}); - -export default CardDataSource; \ No newline at end of file diff --git a/src/database/entities/card/Card.ts b/src/database/entities/card/Card.ts deleted file mode 100644 index 295c310..0000000 --- a/src/database/entities/card/Card.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Column, Entity, ManyToOne } from "typeorm"; -import CardBaseEntity from "../../../contracts/CardBaseEntity"; -import { CardRarity } from "../../../constants/CardRarity"; -import Series from "./Series"; -import CardDataSource from "../../dataSources/cardDataSource"; - -@Entity() -export default class Card extends CardBaseEntity { - constructor(cardNumber: string, name: string, rarity: CardRarity, path: string, fileName: string, series: Series) { - super(); - - this.CardNumber = cardNumber; - this.Name = name; - this.Rarity = rarity; - this.Path = path; - this.FileName = fileName; - this.Series = series; - } - - @Column() - CardNumber: string; - - @Column() - Name: string; - - @Column() - Rarity: CardRarity; - - @Column() - Path: string; - - @Column() - FileName: string; - - @ManyToOne(() => Series, x => x.Cards) - Series: Series; - - public static async FetchOneByCardNumber(cardNumber: string, relations?: string[]): Promise { - const repository = CardDataSource.getRepository(Card); - - const single = await repository.findOne({ where: { CardNumber: cardNumber }, relations: relations || [] }); - - return single; - } - - public static async FetchAllByRarity(rarity: CardRarity, relations?: string[]): Promise { - const repository = CardDataSource.getRepository(Card); - - const all = await repository.find({ where: { Rarity: rarity }, relations: relations || [] }); - - return all; - } -} \ No newline at end of file diff --git a/src/database/entities/card/Series.ts b/src/database/entities/card/Series.ts deleted file mode 100644 index eb990cc..0000000 --- a/src/database/entities/card/Series.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Column, Entity, OneToMany } from "typeorm"; -import CardBaseEntity from "../../../contracts/CardBaseEntity"; -import Card from "./Card"; - -@Entity() -export default class Series extends CardBaseEntity { - constructor(id: string, name: string, path: string) { - super(); - - this.Id = id; - this.Name = name; - this.Path = path; - } - - @Column() - Name: string; - - @Column() - Path: string; - - @OneToMany(() => Card, x => x.Series) - Cards: Card[]; -} \ No newline at end of file diff --git a/src/database/migrations/card/.gitkeep b/src/database/migrations/card/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/helpers/CardDropHelper.ts b/src/helpers/CardDropHelperMetadata.ts similarity index 55% rename from src/helpers/CardDropHelper.ts rename to src/helpers/CardDropHelperMetadata.ts index 9f65d69..9d26609 100644 --- a/src/helpers/CardDropHelper.ts +++ b/src/helpers/CardDropHelperMetadata.ts @@ -1,10 +1,11 @@ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; import { CardRarity, CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; import CardRarityChances from "../constants/CardRarityChances"; -import Card from "../database/entities/card/Card"; +import { DropResult } from "../contracts/SeriesMetadata"; +import { CoreClient } from "../client/client"; -export default class CardDropHelper { - public static async GetRandomCard(): Promise { +export default class CardDropHelperMetadata { + public static GetRandomCard(): DropResult | undefined { const randomRarity = Math.random() * 100; let cardRarity: CardRarity; @@ -20,39 +21,50 @@ export default class CardDropHelper { else if (randomRarity < mangaChance) cardRarity = CardRarity.Manga; else cardRarity = CardRarity.Legendary; - const randomCard = await this.GetRandomCardByRarity(cardRarity); + const randomCard = this.GetRandomCardByRarity(cardRarity); return randomCard; } - public static async GetRandomCardByRarity(rarity: CardRarity): Promise { - const allCards = await Card.FetchAllByRarity(rarity, [ "Series" ]); + public static GetRandomCardByRarity(rarity: CardRarity): DropResult | undefined { + const allCards = CoreClient.Cards + .flatMap(x => x.cards) + .filter(x => x.type == rarity); const randomCardIndex = Math.floor(Math.random() * allCards.length); const card = allCards[randomCardIndex]; + const series = CoreClient.Cards + .find(x => x.cards.includes(card)); - return card; + if (!series) { + return undefined; + } + + return { + series: series, + card: card, + }; } - public static GenerateDropEmbed(card: Card, quantityClaimed: Number): EmbedBuilder { + public static GenerateDropEmbed(drop: DropResult, quantityClaimed: Number, imageFileName: string): EmbedBuilder { let description = ""; - description += `Series: ${card.Series.Name}\n`; + description += `Series: ${drop.series.name}\n`; description += `Claimed: ${quantityClaimed}\n`; return new EmbedBuilder() - .setTitle(card.Name) + .setTitle(drop.card.name) .setDescription(description) - .setFooter({ text: CardRarityToString(card.Rarity) }) - .setColor(CardRarityToColour(card.Rarity)) - .setImage(`attachment://${card.FileName}`); + .setFooter({ text: CardRarityToString(drop.card.type) }) + .setColor(CardRarityToColour(drop.card.type)) + .setImage(`attachment://${imageFileName}`); } - public static GenerateDropButtons(card: Card, claimId: string, userId: string): ActionRowBuilder { + public static GenerateDropButtons(drop: DropResult, claimId: string, userId: string): ActionRowBuilder { return new ActionRowBuilder() .addComponents( new ButtonBuilder() - .setCustomId(`claim ${card.CardNumber} ${claimId} ${userId}`) + .setCustomId(`claim ${drop.card.id} ${claimId} ${userId}`) .setLabel("Claim") .setStyle(ButtonStyle.Primary), new ButtonBuilder() diff --git a/src/hooks/ReloadDB.ts b/src/hooks/ReloadDB.ts index 25c6875..72da369 100644 --- a/src/hooks/ReloadDB.ts +++ b/src/hooks/ReloadDB.ts @@ -1,10 +1,10 @@ import { Request, Response } from "express"; -import CardSetupFunction from "../Functions/CardSetupFunction"; +import CardMetadataFunction from "../Functions/CardMetadataFunction"; export default async function ReloadDB(req: Request, res: Response) { console.log('Reloading Card DB...'); - await CardSetupFunction.Execute(); + await CardMetadataFunction.Execute(); res.sendStatus(200); } \ No newline at end of file