From 4260b120e7d861765b35e9ff243898a3fcac564a Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 6 Oct 2023 21:08:08 +0100 Subject: [PATCH 01/25] Update random code to select a card out of a pool of all series (#54) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Update the randomiser code so that instead of selecting a random series, and then selecting by rarity chance, it now selects a rarity chance, then selects a random card out of all - This will instead make it so when getting a rarity of a lower quantity of cards, if it selects a series with only 2 cards in it of that type, it won't tend to only be a 50:50 of what one you get #45 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - This has been tested by making sure that the drop command still works as expected # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/54 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- src/helpers/CardDropHelper.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/helpers/CardDropHelper.ts b/src/helpers/CardDropHelper.ts index d5d8743..6eec120 100644 --- a/src/helpers/CardDropHelper.ts +++ b/src/helpers/CardDropHelper.ts @@ -1,6 +1,5 @@ import { CardRarity } from "../constants/CardRarity"; import Card from "../database/entities/card/Card"; -import Series from "../database/entities/card/Series"; export default class CardDropHelper { public static async GetRandomCard(): Promise { @@ -17,18 +16,7 @@ export default class CardDropHelper { else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; else cardRarity = CardRarity.Legendary; - const allSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]); - const allSeriesWithCards = allSeries.filter(x => x.Cards.length > 0 && x.Cards.find(x => x.Rarity == cardRarity)); - - const randomSeriesIndex = Math.floor(Math.random() * allSeriesWithCards.length); - - const randomSeries = allSeriesWithCards[randomSeriesIndex]; - - const allCards = randomSeries.Cards.filter(x => x.Rarity == cardRarity && x.Path && x.FileName); - - const randomCardIndex = Math.floor(Math.random() * allCards.length); - - const randomCard = allCards[randomCardIndex]; + const randomCard = await this.GetRandomCardByRarity(cardRarity); return randomCard; } From 39710843a610d7030fe8490010f734826c536e64 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Oct 2023 11:55:05 +0100 Subject: [PATCH 02/25] Update dependency minimatch to v9.0.3 (#20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [minimatch](https://github.com/isaacs/minimatch) | dependencies | patch | [`9.0.2` -> `9.0.3`](https://renovatebot.com/diffs/npm/minimatch/9.0.2/9.0.3) | --- ### Release Notes
isaacs/minimatch (minimatch) ### [`v9.0.3`](https://github.com/isaacs/minimatch/compare/b7bd6d6db0b2521c12f654895971cf81790a5257...f8b46a317a7695c342402cde52c8b0f7a47add17) [Compare Source](https://github.com/isaacs/minimatch/compare/b7bd6d6db0b2521c12f654895971cf81790a5257...f8b46a317a7695c342402cde52c8b0f7a47add17)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/20 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package.json | 2 +- yarn.lock | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 505b116..b1a8e69 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "googleapis": "^126.0.0", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", - "minimatch": "9.0.2", + "minimatch": "9.0.3", "mysql": "^2.18.1", "sqlite3": "^5.1.6", "ts-jest": "^29.0.0", diff --git a/yarn.lock b/yarn.lock index e5ab839..a093ba2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3690,10 +3690,10 @@ mimic-response@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== -minimatch@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.2.tgz#397e387fff22f6795844d00badc903a3d5de7057" - integrity sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg== +minimatch@9.0.3, minimatch@^9.0.0: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" @@ -3711,13 +3711,6 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.0: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" From 94c358cfec6e4a963bb8818f860c1fc3c35b2b81 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Oct 2023 11:55:47 +0100 Subject: [PATCH 03/25] Update dependency @discordjs/rest to v2 (#21) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@discordjs/rest](https://discord.js.org) ([source](https://github.com/discordjs/discord.js)) | dependencies | major | [`^1.1.0` -> `^2.0.0`](https://renovatebot.com/diffs/npm/@discordjs%2frest/1.7.1/2.0.1) | --- ### Release Notes
discordjs/discord.js (@​discordjs/rest) ### [`v2.0.1`](https://github.com/discordjs/discord.js/compare/d04987f09be7b4b8a075620afe186f1ccce63ede...84ead6e5540b519d2fcdeb4628be0a7346983d3c) [Compare Source](https://github.com/discordjs/discord.js/compare/d04987f09be7b4b8a075620afe186f1ccce63ede...84ead6e5540b519d2fcdeb4628be0a7346983d3c) ### [`v2.0.0`](https://github.com/discordjs/discord.js/compare/481bbc924fc28b5ac71c12f69afc7d69f77c04ff...d04987f09be7b4b8a075620afe186f1ccce63ede) [Compare Source](https://github.com/discordjs/discord.js/compare/481bbc924fc28b5ac71c12f69afc7d69f77c04ff...d04987f09be7b4b8a075620afe186f1ccce63ede)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/21 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package.json | 2 +- yarn.lock | 79 ++-------------------------------------------------- 2 files changed, 4 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index b1a8e69..b71b0f0 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "homepage": "https://gitea.vylpes.xyz/External/card-drop", "funding": "https://ko-fi.com/vylpes", "dependencies": { - "@discordjs/rest": "^1.1.0", + "@discordjs/rest": "^2.0.0", "@types/jest": "^29.0.0", "@types/uuid": "^9.0.0", "discord.js": "^14.3.0", diff --git a/yarn.lock b/yarn.lock index a093ba2..c3fe357 100644 --- a/yarn.lock +++ b/yarn.lock @@ -326,7 +326,7 @@ ts-mixer "^6.0.3" tslib "^2.6.1" -"@discordjs/collection@^1.5.1", "@discordjs/collection@^1.5.3": +"@discordjs/collection@^1.5.3": version "1.5.3" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== @@ -338,21 +338,7 @@ dependencies: discord-api-types "0.37.50" -"@discordjs/rest@^1.1.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-1.7.1.tgz#eeef0e71a37c95fa27962129729b2aa9de8e3752" - integrity sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ== - dependencies: - "@discordjs/collection" "^1.5.1" - "@discordjs/util" "^0.3.0" - "@sapphire/async-queue" "^1.5.0" - "@sapphire/snowflake" "^3.4.2" - discord-api-types "^0.37.41" - file-type "^18.3.0" - tslib "^2.5.0" - undici "^5.22.0" - -"@discordjs/rest@^2.0.1": +"@discordjs/rest@^2.0.0", "@discordjs/rest@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.0.1.tgz#100c208a964e54b8d7cd418bbaed279c816b8ec5" integrity sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg== @@ -367,11 +353,6 @@ tslib "^2.6.1" undici "5.22.1" -"@discordjs/util@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-0.3.1.tgz#4e8737e1dcff7e9f5eccc3116fb44755b65b1e97" - integrity sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA== - "@discordjs/util@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.1.tgz#7d6f97b65425d3a8b46ea1180150dee6991a88cf" @@ -735,7 +716,7 @@ fast-deep-equal "^3.1.3" lodash "^4.17.21" -"@sapphire/snowflake@^3.4.2", "@sapphire/snowflake@^3.5.1": +"@sapphire/snowflake@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec" integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA== @@ -788,11 +769,6 @@ dependencies: defer-to-connect "^2.0.1" -"@tokenizer/token@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" - integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== - "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1839,11 +1815,6 @@ discord-api-types@0.37.50: resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.50.tgz#6059eb8c0b784ad8194655a8b8b7f540fcfac428" integrity sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg== -discord-api-types@^0.37.41: - version "0.37.54" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.54.tgz#874a597c88ea8eb47ed25c7039a130bf67635ffd" - integrity sha512-xNO6yzEMfpVSVUa6lOOzgLDy3Gyd8yuBAozGQdjpW9VjRq2Ccboz4FhTrd5v4Hw7pbkCKwnHvddjIYrX0INkUQ== - discord.js@^14.3.0: version "14.13.0" resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.13.0.tgz#e7a00bdba70adb9e266a06884ca1acaf9a0b5c20" @@ -2112,15 +2083,6 @@ figures@^5.0.0: escape-string-regexp "^5.0.0" is-unicode-supported "^1.2.0" -file-type@^18.3.0: - version "18.5.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.5.0.tgz#604a001ba0d32577d4c3fa420ee104d656b914d2" - integrity sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ== - dependencies: - readable-web-to-node-stream "^3.0.2" - strtok3 "^7.0.0" - token-types "^5.0.1" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -4296,11 +4258,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -peek-readable@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" - integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4481,13 +4438,6 @@ readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-web-to-node-stream@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" - integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== - dependencies: - readable-stream "^3.6.0" - reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -4956,14 +4906,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strtok3@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5" - integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== - dependencies: - "@tokenizer/token" "^0.3.0" - peek-readable "^5.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -5090,14 +5032,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -token-types@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" - integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== - dependencies: - "@tokenizer/token" "^0.3.0" - ieee754 "^1.2.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -5222,13 +5156,6 @@ undici@5.22.1: dependencies: busboy "^1.6.0" -undici@^5.22.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" - integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== - dependencies: - busboy "^1.6.0" - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" From e030cb37574a25eb01a3aba4aa96b16187fe4388 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Oct 2023 11:56:34 +0100 Subject: [PATCH 04/25] Update dependency @types/node to v20.8.3 (#42) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | devDependencies | minor | [`20.5.1` -> `20.8.3`](https://renovatebot.com/diffs/npm/@types%2fnode/20.5.1/20.8.3) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/42 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index c3fe357..0ca541f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -864,19 +864,19 @@ "@types/node" "*" "@types/node@*", "@types/node@^20.0.0": - version "20.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" - integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== + version "20.8.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" + integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== "@types/normalize-package-data@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" + integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" + integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== dependencies: "@types/node" "*" From 65583f6da2f6df60ea5d801b0291bccec8b1c68a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Oct 2023 18:11:56 +0100 Subject: [PATCH 05/25] Update dependency @types/uuid to v9.0.5 (#31) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/uuid) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | dependencies | patch | [`9.0.2` -> `9.0.5`](https://renovatebot.com/diffs/npm/@types%2fuuid/9.0.2/9.0.5) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/31 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0ca541f..a33cc17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -886,14 +886,14 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/uuid@^9.0.0": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b" - integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.5.tgz#25a71eb73eba95ac0e559ff3dd018fc08294acf6" + integrity sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ== "@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" + integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== dependencies: "@types/node" "*" From ef19adcdfbc99897ffd4feff609efae6c4969821 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Oct 2023 18:12:57 +0100 Subject: [PATCH 06/25] Update dependency typescript to v5.2.2 (#48) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [typescript](https://www.typescriptlang.org/) ([source](https://github.com/Microsoft/TypeScript)) | devDependencies | minor | [`5.1.6` -> `5.2.2`](https://renovatebot.com/diffs/npm/typescript/5.1.6/5.2.2) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/48 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a33cc17..6ae6b32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5145,9 +5145,9 @@ types-pkg-json@^1.1.0: types-json "^1.2.2" typescript@^5.0.0: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== undici@5.22.1: version "5.22.1" From c5fc2760c411ae8c97551af0297ef4b01e507d13 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sat, 14 Oct 2023 17:07:28 +0100 Subject: [PATCH 07/25] Add ability to register commands and events to specific environments (#50) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Add ability to register commands and events to specific environments - These will default to every environment if not specified, so existing commands will still work as is - Environment is a flag so you can specify multiple environments #38 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - This has been tested locally by making sure commands are registered that are specified as the one in the config # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/50 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .dev.env | 3 ++- .prod.env | 3 ++- .stage.env | 3 ++- src/bot.ts | 1 + src/client/client.ts | 34 +++++++++++++++++++++++-------- src/client/util.ts | 26 ++++++++++++++++------- src/constants/Environment.ts | 8 ++++++++ src/contracts/IButtonEventItem.ts | 2 ++ src/contracts/ICommandItem.ts | 2 ++ src/contracts/IEventItem.ts | 2 ++ 10 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 src/constants/Environment.ts diff --git a/.dev.env b/.dev.env index ca791ba..b275229 100644 --- a/.dev.env +++ b/.dev.env @@ -7,10 +7,11 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.4 DEV +BOT_VER=0.2 DEV BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=682942374040961060 +BOT_ENV=4 ABOUT_FUNDING= ABOUT_REPO= diff --git a/.prod.env b/.prod.env index f1a644e..afbba60 100644 --- a/.prod.env +++ b/.prod.env @@ -7,10 +7,11 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.4 +BOT_VER=0.2 BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1093810443589529631 +BOT_ENV=1 ABOUT_FUNDING= ABOUT_REPO= diff --git a/.stage.env b/.stage.env index 60a01fc..c1df020 100644 --- a/.stage.env +++ b/.stage.env @@ -7,10 +7,11 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.4 BETA +BOT_VER=0.2 BETA BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1147976642942214235 +BOT_ENV=2 ABOUT_FUNDING= ABOUT_REPO= diff --git a/src/bot.ts b/src/bot.ts index e8c1dd3..07b919f 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -11,6 +11,7 @@ const requiredConfigs: string[] = [ "BOT_AUTHOR", "BOT_OWNERID", "BOT_CLIENTID", + "BOT_ENV", "DB_HOST", "DB_PORT", "DB_AUTH_USER", diff --git a/src/client/client.ts b/src/client/client.ts index 66907bb..a205a19 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -12,6 +12,7 @@ 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"; export class CoreClient extends Client { private static _commandItems: ICommandItem[]; @@ -23,6 +24,7 @@ export class CoreClient extends Client { private _cardSetupFunc: CardSetupFunction; public static ClaimId: string; + public static Environment: Environment; public static get commandItems(): ICommandItem[] { return this._commandItems; @@ -47,6 +49,9 @@ export class CoreClient extends Client { this._events = new Events(); this._util = new Util(); this._cardSetupFunc = new CardSetupFunction(); + + CoreClient.Environment = Number(process.env.BOT_ENV); + console.log(`Bot Environment: ${CoreClient.Environment}`); } public async start() { @@ -68,37 +73,50 @@ export class CoreClient extends Client { await this._cardSetupFunc.Execute(); - await super.login(process.env.BOT_TOKEN); - this._util.loadEvents(this, CoreClient._eventItems); this._util.loadSlashCommands(this); + + console.log(`Registered Commands: ${CoreClient._commandItems.flatMap(x => x.Name).join(", ")}`); + console.log(`Registered Events: ${CoreClient._eventItems.flatMap(x => x.EventType).join(", ")}`); + console.log(`Registered Buttons: ${CoreClient._buttonEvents.flatMap(x => x.ButtonId).join(", ")}`); + + await super.login(process.env.BOT_TOKEN); } - public static RegisterCommand(name: string, command: Command, serverId?: string) { + public static RegisterCommand(name: string, command: Command, environment: Environment = Environment.All, serverId?: string) { const item: ICommandItem = { Name: name, + Environment: environment, Command: command, ServerId: serverId, }; - CoreClient._commandItems.push(item); + if (environment &= CoreClient.Environment) { + CoreClient._commandItems.push(item); + } } - public static RegisterEvent(eventType: EventType, func: Function) { + public static RegisterEvent(eventType: EventType, func: Function, environment: Environment = Environment.All) { const item: IEventItem = { EventType: eventType, ExecutionFunction: func, + Environment: environment, }; - CoreClient._eventItems.push(item); + if (environment &= CoreClient.Environment) { + CoreClient._eventItems.push(item); + } } - public static RegisterButtonEvent(buttonId: string, event: ButtonEvent) { + public static RegisterButtonEvent(buttonId: string, event: ButtonEvent, environment: Environment = Environment.All) { const item: IButtonEventItem = { ButtonId: buttonId, Event: event, + Environment: environment, }; - CoreClient._buttonEvents.push(item); + if (environment &= CoreClient.Environment) { + CoreClient._buttonEvents.push(item); + } } } diff --git a/src/client/util.ts b/src/client/util.ts index a9c2bad..41b7f27 100644 --- a/src/client/util.ts +++ b/src/client/util.ts @@ -10,9 +10,15 @@ export class Util { const globalCommands = registeredCommands.filter(x => !x.ServerId); const guildCommands = registeredCommands.filter(x => x.ServerId); - const globalCommandData: SlashCommandBuilder[] = globalCommands - .filter(x => x.Command.CommandBuilder) - .flatMap(x => x.Command.CommandBuilder); + const globalCommandData: SlashCommandBuilder[] = []; + + for (let command of globalCommands) { + if (!command.Command.CommandBuilder) continue; + + if (command.Environment &= CoreClient.Environment) { + globalCommandData.push(command.Command.CommandBuilder); + } + } const guildIds: string[] = []; @@ -32,12 +38,18 @@ export class Util { ); for (let guild of guildIds) { - const guildCommandData = guildCommands.filter(x => x.ServerId == guild) - .filter(x => x.Command.CommandBuilder) - .flatMap(x => x.Command.CommandBuilder); + const guildCommandData: SlashCommandBuilder[] = []; + + for (let command of guildCommands.filter(x => x.ServerId == guild)) { + if (!command.Command.CommandBuilder) continue; + + if (command.Environment &= CoreClient.Environment) { + guildCommandData.push(command.Command.CommandBuilder); + } + } if (!client.guilds.cache.has(guild)) continue; - + rest.put( Routes.applicationGuildCommands(process.env.BOT_CLIENTID!, guild), { diff --git a/src/constants/Environment.ts b/src/constants/Environment.ts new file mode 100644 index 0000000..13f5ba3 --- /dev/null +++ b/src/constants/Environment.ts @@ -0,0 +1,8 @@ +export enum Environment { + None = 0, + Production = 1 << 0, + Stage = 1 << 1, + Local = 1 << 2, + + All = Production | Stage | Local, +} \ No newline at end of file diff --git a/src/contracts/IButtonEventItem.ts b/src/contracts/IButtonEventItem.ts index 6be9f6e..061a9c9 100644 --- a/src/contracts/IButtonEventItem.ts +++ b/src/contracts/IButtonEventItem.ts @@ -1,6 +1,8 @@ +import { Environment } from "../constants/Environment"; import { ButtonEvent } from "../type/buttonEvent"; export default interface IButtonEventItem { ButtonId: string, Event: ButtonEvent, + Environment: Environment, } \ No newline at end of file diff --git a/src/contracts/ICommandItem.ts b/src/contracts/ICommandItem.ts index 89acb50..3ebc670 100644 --- a/src/contracts/ICommandItem.ts +++ b/src/contracts/ICommandItem.ts @@ -1,7 +1,9 @@ +import { Environment } from "../constants/Environment"; import { Command } from "../type/command"; export default interface ICommandItem { Name: string, Command: Command, + Environment: Environment, ServerId?: string, } \ No newline at end of file diff --git a/src/contracts/IEventItem.ts b/src/contracts/IEventItem.ts index ea32a3e..b7cc7bf 100644 --- a/src/contracts/IEventItem.ts +++ b/src/contracts/IEventItem.ts @@ -1,7 +1,9 @@ +import { Environment } from "../constants/Environment"; import { EventType } from "../constants/EventType"; export default interface IEventItem { EventType: EventType, ExecutionFunction: Function, + Environment: Environment, } \ No newline at end of file From 53a51fdf9694ad92b3af7a68a1f53dfa1e4e3a15 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sat, 14 Oct 2023 17:09:24 +0100 Subject: [PATCH 08/25] Allow user to be able to see who claimed what card (#57) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Allow user to be able to see who claimed what card #24 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - This has been tested locally by running the claim function and seeing if it mentions me # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/57 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- src/buttonEvents/Claim.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/buttonEvents/Claim.ts b/src/buttonEvents/Claim.ts index 6f9ae58..0db89fe 100644 --- a/src/buttonEvents/Claim.ts +++ b/src/buttonEvents/Claim.ts @@ -40,6 +40,6 @@ export default class Claim extends ButtonEvent { await claim.Save(eClaim, claim); - await interaction.reply('Card claimed'); + await interaction.reply(`Card claimed by ${interaction.user}`); } } \ No newline at end of file From c24cfc3463251076d74f4cd8746daada7d022cc0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Oct 2023 19:19:13 +0100 Subject: [PATCH 09/25] Update dependency jest to v29.7.0 (#41) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [jest](https://jestjs.io/) ([source](https://github.com/jestjs/jest)) | dependencies | minor | [`29.6.2` -> `29.7.0`](https://renovatebot.com/diffs/npm/jest/29.6.2/29.7.0) | | [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jest) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | dependencies | patch | [`29.5.3` -> `29.5.5`](https://renovatebot.com/diffs/npm/@types%2fjest/29.5.3/29.5.5) | --- ### Release Notes
jestjs/jest (jest) ### [`v29.7.0`](https://github.com/jestjs/jest/compare/55cd6a0aaf6f9178199dfa7af7a00fcaa7c421fd...4e56991693da7cd4c3730dc3579a1dd1403ee630) [Compare Source](https://github.com/jestjs/jest/compare/55cd6a0aaf6f9178199dfa7af7a00fcaa7c421fd...4e56991693da7cd4c3730dc3579a1dd1403ee630) ### [`v29.6.4`](https://github.com/jestjs/jest/compare/fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b...55cd6a0aaf6f9178199dfa7af7a00fcaa7c421fd) [Compare Source](https://github.com/jestjs/jest/compare/fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b...55cd6a0aaf6f9178199dfa7af7a00fcaa7c421fd) ### [`v29.6.3`](https://github.com/jestjs/jest/compare/0fd5b1c37555f485c56a6ad2d6b010a72204f9f6...fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b) [Compare Source](https://github.com/jestjs/jest/compare/0fd5b1c37555f485c56a6ad2d6b010a72204f9f6...fb7d95c8af6e0d65a8b65348433d8a0ea0725b5b)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/41 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 1100 +++++++++++++++++++++++++++-------------------------- 1 file changed, 570 insertions(+), 530 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6ae6b32..24c1730 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,73 +10,73 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.22.10" + "@babel/highlight" "^7.22.13" chalk "^2.4.2" "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" - integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.10" - "@babel/parser" "^7.22.10" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" + json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.7.2": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -85,23 +85,23 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -127,38 +127,38 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helpers@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" - integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -265,38 +265,38 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== +"@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -394,109 +394,109 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.2.tgz#bf1d4101347c23e07c029a1b1ae07d550f5cc541" - integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.6.2" - jest-util "^29.6.2" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.2.tgz#6f2d1dbe8aa0265fcd4fb8082ae1952f148209c8" - integrity sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^29.6.2" - "@jest/reporters" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.6.2" - jest-haste-map "^29.6.2" - jest-message-util "^29.6.2" - jest-regex-util "^29.4.3" - jest-resolve "^29.6.2" - jest-resolve-dependencies "^29.6.2" - jest-runner "^29.6.2" - jest-runtime "^29.6.2" - jest-snapshot "^29.6.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" - jest-watcher "^29.6.2" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^29.6.2" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.2.tgz#794c0f769d85e7553439d107d3f43186dc6874a9" - integrity sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.2" + jest-mock "^29.7.0" -"@jest/expect-utils@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.2.tgz#1b97f290d0185d264dd9fdec7567a14a38a90534" - integrity sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" -"@jest/expect@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.2.tgz#5a2ad58bb345165d9ce0a1845bbf873c480a4b28" - integrity sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^29.6.2" - jest-snapshot "^29.6.2" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.2.tgz#fe9d43c5e4b1b901168fe6f46f861b3e652a2df4" - integrity sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.6.2" - jest-mock "^29.6.2" - jest-util "^29.6.2" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.2.tgz#74af81b9249122cc46f1eb25793617eec69bf21a" - integrity sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^29.6.2" - "@jest/expect" "^29.6.2" - "@jest/types" "^29.6.1" - jest-mock "^29.6.2" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" - integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" @@ -505,81 +505,81 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.6.2" - jest-util "^29.6.2" - jest-worker "^29.6.2" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.6.0": - version "29.6.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" - integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^29.6.0": - version "29.6.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.0.tgz#bd34a05b5737cb1a99d43e1957020ac8e5b9ddb1" - integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.2.tgz#fdd11583cd1608e4db3114e8f0cce277bf7a32ed" - integrity sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz#585eff07a68dd75225a7eacf319780cb9f6b9bf4" - integrity sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^29.6.2" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" + jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" - integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" - jest-regex-util "^29.4.3" - jest-util "^29.6.2" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" - integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== +"@jest/types@^29.6.1", "@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.6.0" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -775,9 +775,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -786,24 +786,24 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== dependencies: "@babel/types" "^7.20.7" @@ -818,9 +818,9 @@ "@types/responselike" "^1.0.0" "@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" + integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== dependencies: "@types/node" "*" @@ -835,23 +835,23 @@ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" + integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" + integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.0.0": - version "29.5.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.3.tgz#7a35dc0044ffb8b56325c6802a4781a626b05777" - integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== + version "29.5.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" + integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -863,7 +863,14 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^20.0.0": +"@types/node@*": + version "20.8.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" + integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + dependencies: + undici-types "~5.25.1" + +"@types/node@^20.0.0": version "20.8.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== @@ -898,14 +905,14 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.28" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.28.tgz#d106e4301fbacde3d1796ab27374dd16588ec851" + integrity sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw== dependencies: "@types/yargs-parser" "*" @@ -1103,15 +1110,15 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -babel-jest@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.2.tgz#cada0a59e07f5acaeb11cbae7e3ba92aec9c1126" - integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^29.6.2" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -1127,10 +1134,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1155,12 +1162,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^29.5.0" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -1241,14 +1248,14 @@ braces@^3.0.2: fill-range "^7.0.1" browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" bs-logger@0.x: version "0.2.6" @@ -1402,10 +1409,10 @@ camelcase@^7.0.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== -caniuse-lite@^1.0.30001517: - version "1.0.30001521" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz#e9930cf499f7c1e80334b6c1fbca52e00d889e56" - integrity sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ== +caniuse-lite@^1.0.30001541: + version "1.0.30001549" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz#7d1a3dce7ea78c06ed72c32c2743ea364b3615aa" + integrity sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA== chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" @@ -1456,9 +1463,9 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.2.3" @@ -1652,11 +1659,6 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -1677,6 +1679,19 @@ cosmiconfig@^8.1.3: parse-json "^5.0.0" path-type "^4.0.0" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1798,10 +1813,10 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== dir-glob@^3.0.1: version "3.0.1" @@ -1866,10 +1881,10 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" -electron-to-chromium@^1.4.477: - version "1.4.496" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz#a57534b70d2bdee7e1ad7dbd4c91e560cbd08db1" - integrity sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g== +electron-to-chromium@^1.4.535: + version "1.4.554" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz#04e09c2ee31dc0f1546174033809b54cc372740b" + integrity sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ== elegant-spinner@^1.0.1: version "1.0.1" @@ -1992,17 +2007,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0, expect@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521" - integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.6.2" - "@types/node" "*" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-util "^29.6.2" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" extend@^3.0.2: version "3.0.2" @@ -2132,14 +2146,14 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gauge@^3.0.0: version "3.0.2" @@ -2406,11 +2420,9 @@ has-yarn@^3.0.0: integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== highlight.js@^10.7.1: version "10.7.3" @@ -2890,7 +2902,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -2901,6 +2913,17 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" @@ -2927,180 +2950,180 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.2.tgz#1e6ffca60151ac66cad63fce34f443f6b5bb4258" - integrity sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^29.6.2" - "@jest/expect" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.6.2" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-runtime "^29.6.2" - jest-snapshot "^29.6.2" - jest-util "^29.6.2" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" p-limit "^3.1.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.2.tgz#edb381763398d1a292cd1b636a98bfa5644b8fda" - integrity sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.6.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.2.tgz#c68723f06b31ca5e63030686e604727d406cd7c3" - integrity sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.6.2" - "@jest/types" "^29.6.1" - babel-jest "^29.6.2" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.6.2" - jest-environment-node "^29.6.2" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.6.2" - jest-runner "^29.6.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.2.tgz#c36001e5543e82a0805051d3ceac32e6825c1c46" - integrity sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.6.2" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.2.tgz#c9e4b340bcbe838c73adf46b76817b15712d02ce" - integrity sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.6.2" - pretty-format "^29.6.2" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" -jest-environment-node@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.2.tgz#a9ea2cabff39b08eca14ccb32c8ceb924c8bb1ad" - integrity sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ== +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^29.6.2" - "@jest/fake-timers" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.2" - jest-util "^29.6.2" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" - integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.6.2" - jest-worker "^29.6.2" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz#e2b307fee78cab091c37858a98c7e1d73cdf5b38" - integrity sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.6.2" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz#39de0be2baca7a64eacb27291f0bd834fea3a535" - integrity sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.6.2" - jest-get-type "^29.4.3" - pretty-format "^29.6.2" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-message-util@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.2.tgz#af7adc2209c552f3f5ae31e77cf0a261f23dc2bb" - integrity sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.6.2" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -3111,130 +3134,130 @@ jest-mock-extended@^3.0.0: dependencies: ts-essentials "^7.0.3" -jest-mock@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.2.tgz#ef9c9b4d38c34a2ad61010a021866dad41ce5e00" - integrity sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.6.2" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz#36435269b6672c256bcc85fb384872c134cc4cf2" - integrity sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.6.2" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.2.tgz#f18405fe4b50159b7b6d85e81f6a524d22afb838" - integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.6.2" - jest-validate "^29.6.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.2.tgz#89e8e32a8fef24781a7c4c49cd1cb6358ac7fc01" - integrity sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^29.6.2" - "@jest/environment" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.6.2" - jest-haste-map "^29.6.2" - jest-leak-detector "^29.6.2" - jest-message-util "^29.6.2" - jest-resolve "^29.6.2" - jest-runtime "^29.6.2" - jest-util "^29.6.2" - jest-watcher "^29.6.2" - jest-worker "^29.6.2" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.2.tgz#692f25e387f982e89ab83270e684a9786248e545" - integrity sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg== +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: - "@jest/environment" "^29.6.2" - "@jest/fake-timers" "^29.6.2" - "@jest/globals" "^29.6.2" - "@jest/source-map" "^29.6.0" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" - jest-message-util "^29.6.2" - jest-mock "^29.6.2" - jest-regex-util "^29.4.3" - jest-resolve "^29.6.2" - jest-snapshot "^29.6.2" - jest-util "^29.6.2" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.2.tgz#9b431b561a83f2bdfe041e1cab8a6becdb01af9c" - integrity sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.6.2" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^29.6.2" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-util "^29.6.2" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.0.0, jest-util@^29.6.2: +jest-util@^29.0.0: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.2.tgz#8a052df8fff2eebe446769fd88814521a517664d" integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== @@ -3246,51 +3269,63 @@ jest-util@^29.0.0, jest-util@^29.6.2: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.2.tgz#25d972af35b2415b83b1373baf1a47bb266c1082" - integrity sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^29.6.2" + pretty-format "^29.7.0" -jest-watcher@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.2.tgz#77c224674f0620d9f6643c4cfca186d8893ca088" - integrity sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.6.2" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" - integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.6.2" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^29.0.0: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.2.tgz#3bd55b9fd46a161b2edbdf5f1d1bd0d1eab76c42" - integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.6.2" + jest-cli "^29.7.0" js-tokens@^4.0.0: version "4.0.0" @@ -3334,7 +3369,7 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json5@^2.2.2, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -4287,12 +4322,12 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pretty-format@^29.0.0, pretty-format@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" - integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.6.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -4348,9 +4383,9 @@ pupa@^3.1.0: escape-goat "^4.0.0" pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== qs@^6.7.0: version "6.11.2" @@ -4502,9 +4537,9 @@ resolve.exports@^2.0.0: integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.20.0: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" @@ -4622,7 +4657,7 @@ semver-diff@^4.0.0: dependencies: semver "^7.3.5" -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.1, semver@^7.5.2, semver@^7.5.3: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.1, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -5149,6 +5184,11 @@ typescript@^5.0.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + undici@5.22.1: version "5.22.1" resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" @@ -5182,10 +5222,10 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -5226,13 +5266,13 @@ uuid@^9.0.0: integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + version "9.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" + integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" vali-date@^1.0.0: version "1.0.0" From 6c78c0f74ddae6550a5ddfbdc62eeaaf6b513e54 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Oct 2023 19:21:22 +0100 Subject: [PATCH 10/25] Update dependency googleapis to v127 (#59) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [googleapis](https://github.com/googleapis/google-api-nodejs-client) | dependencies | major | [`^126.0.0` -> `^127.0.0`](https://renovatebot.com/diffs/npm/googleapis/126.0.0/127.0.0) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/59 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b71b0f0..51baa99 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@types/uuid": "^9.0.0", "discord.js": "^14.3.0", "dotenv": "^16.0.0", - "googleapis": "^126.0.0", + "googleapis": "^127.0.0", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", "minimatch": "9.0.3", diff --git a/yarn.lock b/yarn.lock index 24c1730..ff83e89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2322,10 +2322,10 @@ googleapis-common@^7.0.0: url-template "^2.0.8" uuid "^9.0.0" -googleapis@^126.0.0: - version "126.0.0" - resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-126.0.0.tgz#6a6d8b62c86226a825ebcb7d122e941160ef98bf" - integrity sha512-BeCwYJfthEWUgY0ka7msSxyMuRwrwJTqL9yMlnuCxyy1JlRZwaI5ZVVp4ofwiGiNP9UuuR3Yk9CJKWQLg4Tq1A== +googleapis@^127.0.0: + version "127.0.0" + resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-127.0.0.tgz#466e723046eda45b83e4ae6e422e5d62b78ddf52" + integrity sha512-a27VnPktyqm+7TeWOAOV+iPL2fX2DJN0ueS/v9Zh5PN2PQI9sF/JxWGSeM5dAs5FBT+LI4oKcvCJS72AG9u9GQ== dependencies: google-auth-library "^9.0.0" googleapis-common "^7.0.0" From ce75d8fab6ac9c4ccd1c8acbbfff19c06545e9ba Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 20 Oct 2023 17:33:22 +0100 Subject: [PATCH 11/25] Add quantity claimed to drop embed (#61) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Add the quantity which the user has claimed to the drop embed #37 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - This has been tested by running the command for a card which has no claimed card and ensure it says 0 - Then reran the command for that card and ensured it says 1 # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/61 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- src/buttonEvents/Reroll.ts | 10 +++++++++- src/commands/drop.ts | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index bc91c90..7e37a81 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -6,6 +6,7 @@ import { CardRarityToColour, CardRarityToString } from "../constants/CardRarity" import { v4 } from "uuid"; import { CoreClient } from "../client/client"; import Card from "../database/entities/card/Card"; +import Inventory from "../database/entities/app/Inventory"; export default class Reroll extends ButtonEvent { public override async execute(interaction: ButtonInteraction) { @@ -32,9 +33,16 @@ export default class Reroll extends ButtonEvent { const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); + const quantityClaimed = inventory ? inventory.Quantity : 0; + + let embedDescription = ""; + embedDescription += `Series: ${randomCard.Series.Name}\n`; + embedDescription += `Claimed: ${quantityClaimed || 0}\n`; + const embed = new EmbedBuilder() .setTitle(randomCard.Name) - .setDescription(randomCard.Series.Name) + .setDescription(embedDescription) .setFooter({ text: CardRarityToString(randomCard.Rarity) }) .setColor(CardRarityToColour(randomCard.Rarity)) .setImage(`attachment://${randomCard.FileName}`); diff --git a/src/commands/drop.ts b/src/commands/drop.ts index 7503bf7..260f58e 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -6,6 +6,7 @@ import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; import { v4 } from "uuid"; import Card from "../database/entities/card/Card"; +import Inventory from "../database/entities/app/Inventory"; export default class Drop extends Command { constructor() { @@ -38,9 +39,16 @@ export default class Drop extends Command { const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); + const quantityClaimed = inventory ? inventory.Quantity : 0; + + let embedDescription = ""; + embedDescription += `Series: ${randomCard.Series.Name}\n`; + embedDescription += `Claimed: ${quantityClaimed || 0}\n`; + const embed = new EmbedBuilder() .setTitle(randomCard.Name) - .setDescription(randomCard.Series.Name) + .setDescription(embedDescription) .setFooter({ text: CardRarityToString(randomCard.Rarity) }) .setColor(CardRarityToColour(randomCard.Rarity)) .setImage(`attachment://${randomCard.FileName}`); From f38d1ef23a01d2ee32e612e4d6a33b97872dae02 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sat, 21 Oct 2023 17:51:49 +0100 Subject: [PATCH 12/25] Ignore cards.db file --- .gitignore | 3 ++- cards.db | Bin 495616 -> 0 bytes 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 cards.db diff --git a/.gitignore b/.gitignore index 420dcff..a354170 100644 --- a/.gitignore +++ b/.gitignore @@ -107,4 +107,5 @@ config.json .DS_Store ormconfig.json gdrive-credentials.json -cards/ \ No newline at end of file +cards/ +*.db \ No newline at end of file diff --git a/cards.db b/cards.db deleted file mode 100644 index 72edf3f15c735c38f6615f1c81749ac561dcf971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495616 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 z 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

m^QUyJ-|y~ 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 C2p(Mk From 6d1e41d697c7c7db3dc7c61793c3d63e5e5fa27e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Oct 2023 14:30:07 +0100 Subject: [PATCH 13/25] Update dependency @types/node to v20.8.7 (#58) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | devDependencies | patch | [`20.8.3` -> `20.8.7`](https://renovatebot.com/diffs/npm/@types%2fnode/20.8.3/20.8.7) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/58 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index ff83e89..3bf205c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -871,19 +871,21 @@ undici-types "~5.25.1" "@types/node@^20.0.0": - version "20.8.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" - integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" "@types/normalize-package-data@^2.4.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== "@types/responselike@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" - integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.2.tgz#8de1b0477fd7c12df77e50832fa51701a8414bd6" + integrity sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA== dependencies: "@types/node" "*" From ffc3fcaf89ab0414d03f33916eece8f15b32caa7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Oct 2023 14:31:52 +0100 Subject: [PATCH 14/25] Update dependency @types/jest to v29.5.6 (#64) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jest) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | dependencies | patch | [`29.5.5` -> `29.5.6`](https://renovatebot.com/diffs/npm/@types%2fjest/29.5.5/29.5.6) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/64 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3bf205c..625db5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -829,29 +829,34 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== + +"@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" - integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" + integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" - integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" + integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.0.0": - version "29.5.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" - integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== + version "29.5.6" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" + integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -864,9 +869,9 @@ "@types/node" "*" "@types/node@*": - version "20.8.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" - integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== dependencies: undici-types "~5.25.1" @@ -890,9 +895,9 @@ "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" + integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== "@types/uuid@^9.0.0": version "9.0.5" @@ -907,14 +912,14 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" - integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== + version "21.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" + integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== "@types/yargs@^17.0.8": - version "17.0.28" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.28.tgz#d106e4301fbacde3d1796ab27374dd16588ec851" - integrity sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw== + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" + integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== dependencies: "@types/yargs-parser" "*" From 28d745bf5c8aee2f22aae89cd9e207371b834c10 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 23 Oct 2023 14:33:18 +0100 Subject: [PATCH 15/25] Update dependency @types/uuid to v9.0.6 (#65) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/uuid) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | dependencies | patch | [`9.0.5` -> `9.0.6`](https://renovatebot.com/diffs/npm/@types%2fuuid/9.0.5/9.0.6) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/65 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 625db5f..f37c3c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -900,14 +900,14 @@ integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== "@types/uuid@^9.0.0": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.5.tgz#25a71eb73eba95ac0e559ff3dd018fc08294acf6" - integrity sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ== + version "9.0.6" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.6.tgz#c91ae743d8344a54b2b0c691195f5ff5265f6dfb" + integrity sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew== "@types/ws@^8.5.5": - version "8.5.6" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" - integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.8.tgz#13efec7bd439d0bdf2af93030804a94f163b1430" + integrity sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg== dependencies: "@types/node" "*" From ec2b5237029397ae4444c56884d49f66d1c1f13a Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 27 Oct 2023 16:02:02 +0100 Subject: [PATCH 16/25] Add dropnumber test command (#69) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Add `dropnumber` test command, for test servers only - Remove `DROP_CARD` environment variable #39 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - This has been tested locally # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/69 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .dev.env | 1 - .prod.env | 1 - .stage.env | 1 - src/buttonEvents/Reroll.ts | 36 ++------------- src/commands/drop.ts | 36 ++------------- src/commands/stage/dropnumber.ts | 76 ++++++++++++++++++++++++++++++++ src/constants/Environment.ts | 1 + src/helpers/CardDropHelper.ts | 29 +++++++++++- src/registry.ts | 10 +++++ 9 files changed, 121 insertions(+), 70 deletions(-) create mode 100644 src/commands/stage/dropnumber.ts diff --git a/.dev.env b/.dev.env index b275229..d7841d4 100644 --- a/.dev.env +++ b/.dev.env @@ -17,7 +17,6 @@ ABOUT_FUNDING= ABOUT_REPO= DROP_RARITY=-1 -DROP_CARD=-1 DB_HOST=127.0.0.1 DB_PORT=3301 diff --git a/.prod.env b/.prod.env index afbba60..1a29d54 100644 --- a/.prod.env +++ b/.prod.env @@ -17,7 +17,6 @@ ABOUT_FUNDING= ABOUT_REPO= DROP_RARITY=-1 -DROP_CARD=-1 DB_HOST=127.0.0.1 DB_PORT=3321 diff --git a/.stage.env b/.stage.env index c1df020..330e255 100644 --- a/.stage.env +++ b/.stage.env @@ -17,7 +17,6 @@ ABOUT_FUNDING= ABOUT_REPO= DROP_RARITY=-1 -DROP_CARD=-1 DB_HOST=127.0.0.1 DB_PORT=3311 diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index 7e37a81..0f99267 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -1,8 +1,7 @@ -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, DiscordAPIError, EmbedBuilder } from "discord.js"; +import { AttachmentBuilder, ButtonInteraction, DiscordAPIError } from "discord.js"; import { ButtonEvent } from "../type/buttonEvent"; import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; -import { CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; import { v4 } from "uuid"; import { CoreClient } from "../client/client"; import Card from "../database/entities/card/Card"; @@ -16,15 +15,6 @@ export default class Reroll extends ButtonEvent { if (process.env.DROP_RARITY && Number(process.env.DROP_RARITY) > 0) { randomCard = await CardDropHelper.GetRandomCardByRarity(Number(process.env.DROP_RARITY)); - } else if (process.env.DROP_CARD && process.env.DROP_CARD != '-1') { - let card = await Card.FetchOneByCardNumber(process.env.DROP_CARD, [ "Series" ]); - - if (!card) { - await interaction.reply("Card not found"); - return; - } - - randomCard = card; } const image = readFileSync(randomCard.Path); @@ -36,30 +26,11 @@ export default class Reroll extends ButtonEvent { const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); const quantityClaimed = inventory ? inventory.Quantity : 0; - let embedDescription = ""; - embedDescription += `Series: ${randomCard.Series.Name}\n`; - embedDescription += `Claimed: ${quantityClaimed || 0}\n`; - - const embed = new EmbedBuilder() - .setTitle(randomCard.Name) - .setDescription(embedDescription) - .setFooter({ text: CardRarityToString(randomCard.Rarity) }) - .setColor(CardRarityToColour(randomCard.Rarity)) - .setImage(`attachment://${randomCard.FileName}`); - - const row = new ActionRowBuilder(); + const embed = CardDropHelper.GenerateDropEmbed(randomCard, quantityClaimed || 0); const claimId = v4(); - row.addComponents( - new ButtonBuilder() - .setCustomId(`claim ${randomCard.CardNumber} ${claimId} ${interaction.user.id}`) - .setLabel("Claim") - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setCustomId(`reroll`) - .setLabel("Reroll") - .setStyle(ButtonStyle.Secondary)); + const row = CardDropHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); try { await interaction.editReply({ @@ -70,7 +41,6 @@ export default class Reroll extends ButtonEvent { } catch (e) { console.error(e); - 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 { diff --git a/src/commands/drop.ts b/src/commands/drop.ts index 260f58e..031bbe7 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -1,7 +1,6 @@ -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, CommandInteraction, DiscordAPIError, EmbedBuilder, SlashCommandBuilder } from "discord.js"; +import { AttachmentBuilder, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; import CardDropHelper from "../helpers/CardDropHelper"; -import { CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; import { v4 } from "uuid"; @@ -22,15 +21,6 @@ export default class Drop extends Command { if (process.env.DROP_RARITY && Number(process.env.DROP_RARITY) > 0) { randomCard = await CardDropHelper.GetRandomCardByRarity(Number(process.env.DROP_RARITY)); - } else if (process.env.DROP_CARD && process.env.DROP_CARD != '-1') { - let card = await Card.FetchOneByCardNumber(process.env.DROP_CARD, [ "Series" ]); - - if (!card) { - await interaction.reply("Card not found"); - return; - } - - randomCard = card; } const image = readFileSync(randomCard.Path); @@ -42,30 +32,11 @@ export default class Drop extends Command { const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); const quantityClaimed = inventory ? inventory.Quantity : 0; - let embedDescription = ""; - embedDescription += `Series: ${randomCard.Series.Name}\n`; - embedDescription += `Claimed: ${quantityClaimed || 0}\n`; - - const embed = new EmbedBuilder() - .setTitle(randomCard.Name) - .setDescription(embedDescription) - .setFooter({ text: CardRarityToString(randomCard.Rarity) }) - .setColor(CardRarityToColour(randomCard.Rarity)) - .setImage(`attachment://${randomCard.FileName}`); - - const row = new ActionRowBuilder(); + const embed = CardDropHelper.GenerateDropEmbed(randomCard, quantityClaimed || 0); const claimId = v4(); - row.addComponents( - new ButtonBuilder() - .setCustomId(`claim ${randomCard.CardNumber} ${claimId} ${interaction.user.id}`) - .setLabel("Claim") - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setCustomId(`reroll`) - .setLabel("Reroll") - .setStyle(ButtonStyle.Secondary)); + const row = CardDropHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); try { await interaction.editReply({ @@ -76,7 +47,6 @@ export default class Drop extends Command { } catch (e) { console.error(e); - 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 { diff --git a/src/commands/stage/dropnumber.ts b/src/commands/stage/dropnumber.ts new file mode 100644 index 0000000..dd42a43 --- /dev/null +++ b/src/commands/stage/dropnumber.ts @@ -0,0 +1,76 @@ +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"; + +export default class Dropnumber extends Command { + constructor() { + super(); + + super.CommandBuilder = new SlashCommandBuilder() + .setName('dropnumber') + .setDescription('(TEST) Summon a specific card') + .addStringOption(x => + x + .setName('cardnumber') + .setDescription('The card number to summon') + .setRequired(true)); + } + + public override async execute(interaction: CommandInteraction) { + if (!interaction.isChatInputCommand()) return; + + const cardNumber = interaction.options.get('cardnumber'); + + if (!cardNumber || !cardNumber.value) { + await interaction.reply('Card Number is required'); + return; + } + + const card = await Card.FetchOneByCardNumber(cardNumber.value.toString(), [ + "Series" + ]); + + if (!card) { + await interaction.reply('Card not found'); + return; + } + + const image = readFileSync(card.Path); + + await interaction.deferReply(); + + const attachment = new AttachmentBuilder(image, { name: card.FileName }); + + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.CardNumber); + const quantityClaimed = inventory ? inventory.Quantity : 0; + + const embed = CardDropHelper.GenerateDropEmbed(card, quantityClaimed || 0); + + const claimId = v4(); + + const row = CardDropHelper.GenerateDropButtons(card, claimId, interaction.user.id); + + try { + await interaction.editReply({ + embeds: [ embed ], + files: [ attachment ], + components: [ row ], + }); + } catch (e) { + console.error(e); + + 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`); + } + } + + CoreClient.ClaimId = claimId; + } +} \ No newline at end of file diff --git a/src/constants/Environment.ts b/src/constants/Environment.ts index 13f5ba3..410797f 100644 --- a/src/constants/Environment.ts +++ b/src/constants/Environment.ts @@ -5,4 +5,5 @@ export enum Environment { Local = 1 << 2, All = Production | Stage | Local, + Test = Stage | Local, } \ No newline at end of file diff --git a/src/helpers/CardDropHelper.ts b/src/helpers/CardDropHelper.ts index 6eec120..184eab1 100644 --- a/src/helpers/CardDropHelper.ts +++ b/src/helpers/CardDropHelper.ts @@ -1,4 +1,5 @@ -import { CardRarity } from "../constants/CardRarity"; +import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; +import { CardRarity, CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; import Card from "../database/entities/card/Card"; export default class CardDropHelper { @@ -30,4 +31,30 @@ export default class CardDropHelper { return card; } + + public static GenerateDropEmbed(card: Card, quantityClaimed: Number): EmbedBuilder { + let description = ""; + description += `Series: ${card.Series.Name}\n`; + description += `Claimed: ${quantityClaimed}\n`; + + return new EmbedBuilder() + .setTitle(card.Name) + .setDescription(description) + .setFooter({ text: CardRarityToString(card.Rarity) }) + .setColor(CardRarityToColour(card.Rarity)) + .setImage(`attachment://${card.FileName}`); + } + + public static GenerateDropButtons(card: Card, claimId: string, userId: string): ActionRowBuilder { + return new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId(`claim ${card.CardNumber} ${claimId} ${userId}`) + .setLabel("Claim") + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId(`reroll`) + .setLabel("Reroll") + .setStyle(ButtonStyle.Secondary)); + } } \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index c517af3..9685c5d 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -1,15 +1,25 @@ import { CoreClient } from "./client/client"; +// Global Command Imports import About from "./commands/about"; import Drop from "./commands/drop"; +// Test Command Imports +import Dropnumber from "./commands/stage/dropnumber"; + +// Button Event Imports import Claim from "./buttonEvents/Claim"; import Reroll from "./buttonEvents/Reroll"; +import { Environment } from "./constants/Environment"; export default class Registry { public static RegisterCommands() { + // Global Commands CoreClient.RegisterCommand('about', new About()); CoreClient.RegisterCommand('drop', new Drop()); + + // Test Commands + CoreClient.RegisterCommand('dropnumber', new Dropnumber(), Environment.Test); } public static RegisterEvents() { From 08f01c0210bc619a8327a293963222b2fbf5a1e2 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 3 Nov 2023 19:35:49 +0000 Subject: [PATCH 17/25] Add google drive sync script (#68) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Add Google Drive Sync script - Add web hook to allow external scripts to trigger a card database reload > **NOTE:** This requires extra work once merged, need to implement the cron job for the script on the server #35 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - This can't really be tested until its in the stage server, as it requires a server cron job setup - Have tested the web hook locally with `curl` and that part works # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/68 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .dev.env | 2 + .prod.env | 2 + .stage.env | 2 + package.json | 3 + scripts/gdrive_sync_stage.sh | 5 + src/Functions/CardSetupFunction.ts | 8 +- src/bot.ts | 1 + src/client/client.ts | 9 +- src/hooks/ReloadDB.ts | 10 + src/webhooks.ts | 30 ++ yarn.lock | 444 ++++++++++++++++++++++++++++- 11 files changed, 497 insertions(+), 19 deletions(-) create mode 100644 scripts/gdrive_sync_stage.sh create mode 100644 src/hooks/ReloadDB.ts create mode 100644 src/webhooks.ts diff --git a/.dev.env b/.dev.env index d7841d4..e9d8362 100644 --- a/.dev.env +++ b/.dev.env @@ -27,3 +27,5 @@ DB_SYNC=true DB_LOGGING=true DB_CARD_FILE=:memory: + +EXPRESS_PORT=3303 diff --git a/.prod.env b/.prod.env index 1a29d54..a6bc823 100644 --- a/.prod.env +++ b/.prod.env @@ -27,3 +27,5 @@ DB_SYNC=false DB_LOGGING=false DB_CARD_FILE=:memory: + +EXPRESS_PORT=3323 diff --git a/.stage.env b/.stage.env index 330e255..a2fc5a3 100644 --- a/.stage.env +++ b/.stage.env @@ -27,3 +27,5 @@ DB_SYNC=false DB_LOGGING=false DB_CARD_FILE=:memory: + +EXPRESS_PORT=3313 diff --git a/package.json b/package.json index b7e4338..e7df806 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,13 @@ "funding": "https://ko-fi.com/vylpes", "dependencies": { "@discordjs/rest": "^2.0.0", + "@types/express": "^4.17.20", "@types/jest": "^29.0.0", "@types/uuid": "^9.0.0", + "body-parser": "^1.20.2", "discord.js": "^14.3.0", "dotenv": "^16.0.0", + "express": "^4.18.2", "googleapis": "^127.0.0", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", diff --git a/scripts/gdrive_sync_stage.sh b/scripts/gdrive_sync_stage.sh new file mode 100644 index 0000000..629189c --- /dev/null +++ b/scripts/gdrive_sync_stage.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd ~/apps/card-drop/card-drop_stage \ +&& rclone sync card-drop-gdrive: ./cards \ +&& curl -X POST http://localhost:3313/api/reload-db \ No newline at end of file diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts index 3fd705b..5caabfc 100644 --- a/src/Functions/CardSetupFunction.ts +++ b/src/Functions/CardSetupFunction.ts @@ -6,13 +6,13 @@ import path from "path"; import { CardRarity, CardRarityToString } from "../constants/CardRarity"; export default class CardSetupFunction { - public async Execute() { + public static async Execute() { await this.ClearDatabase(); await this.ReadSeries(); await this.ReadCards(); } - private async ClearDatabase() { + private static async ClearDatabase() { const cardRepository = CardDataSource.getRepository(Card); await cardRepository.clear(); @@ -20,7 +20,7 @@ export default class CardSetupFunction { await seriesRepository.clear(); } - private async ReadSeries() { + private static async ReadSeries() { const seriesDir = readdirSync(path.join(process.cwd(), 'cards')); const seriesRepository = CardDataSource.getRepository(Series); @@ -41,7 +41,7 @@ export default class CardSetupFunction { await seriesRepository.save(seriesToSave); } - private async ReadCards() { + private static async ReadCards() { const loadedSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]); const cardRepository = CardDataSource.getRepository(Card); diff --git a/src/bot.ts b/src/bot.ts index 07b919f..45ae48d 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -18,6 +18,7 @@ const requiredConfigs: string[] = [ "DB_AUTH_PASS", "DB_SYNC", "DB_LOGGING", + "EXPRESS_PORT", ] requiredConfigs.forEach(config => { diff --git a/src/client/client.ts b/src/client/client.ts index a205a19..76ef03f 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -13,6 +13,7 @@ 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"; export class CoreClient extends Client { private static _commandItems: ICommandItem[]; @@ -21,7 +22,7 @@ export class CoreClient extends Client { private _events: Events; private _util: Util; - private _cardSetupFunc: CardSetupFunction; + private _webhooks: Webhooks; public static ClaimId: string; public static Environment: Environment; @@ -48,7 +49,7 @@ export class CoreClient extends Client { this._events = new Events(); this._util = new Util(); - this._cardSetupFunc = new CardSetupFunction(); + this._webhooks = new Webhooks(); CoreClient.Environment = Number(process.env.BOT_ENV); console.log(`Bot Environment: ${CoreClient.Environment}`); @@ -71,11 +72,13 @@ export class CoreClient extends Client { super.on("interactionCreate", this._events.onInteractionCreate); super.on("ready", this._events.onReady); - await this._cardSetupFunc.Execute(); + await CardSetupFunction.Execute(); this._util.loadEvents(this, CoreClient._eventItems); this._util.loadSlashCommands(this); + this._webhooks.start(); + console.log(`Registered Commands: ${CoreClient._commandItems.flatMap(x => x.Name).join(", ")}`); console.log(`Registered Events: ${CoreClient._eventItems.flatMap(x => x.EventType).join(", ")}`); console.log(`Registered Buttons: ${CoreClient._buttonEvents.flatMap(x => x.ButtonId).join(", ")}`); diff --git a/src/hooks/ReloadDB.ts b/src/hooks/ReloadDB.ts new file mode 100644 index 0000000..25c6875 --- /dev/null +++ b/src/hooks/ReloadDB.ts @@ -0,0 +1,10 @@ +import { Request, Response } from "express"; +import CardSetupFunction from "../Functions/CardSetupFunction"; + +export default async function ReloadDB(req: Request, res: Response) { + console.log('Reloading Card DB...'); + + await CardSetupFunction.Execute(); + + res.sendStatus(200); +} \ No newline at end of file diff --git a/src/webhooks.ts b/src/webhooks.ts new file mode 100644 index 0000000..ec30720 --- /dev/null +++ b/src/webhooks.ts @@ -0,0 +1,30 @@ +import bodyParser from "body-parser"; +import express, { Application } from "express"; +import ReloadDB from "./hooks/ReloadDB"; + +export default class Webhooks { + private app: Application; + + private port = process.env.EXPRESS_PORT!; + + public start() { + this.setupApp(); + this.setupRoutes(); + this.setupListen(); + } + + private setupApp() { + this.app = express(); + this.app.use(bodyParser.json()); + } + + private setupRoutes() { + this.app.post('/api/reload-db', ReloadDB); + } + + private setupListen() { + this.app.listen(this.port, () => { + console.log(`API listening on port ${this.port}`); + }); + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f37c3c7..3b6651f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -807,6 +807,14 @@ dependencies: "@babel/types" "^7.20.7" +"@types/body-parser@*": + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/cacheable-request@^6.0.1": version "6.0.3" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" @@ -817,6 +825,33 @@ "@types/node" "*" "@types/responselike" "^1.0.0" +"@types/connect@*": + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.17.39" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" + integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.20": + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/graceful-fs@^4.1.3": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" @@ -829,6 +864,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-errors@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.5" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" @@ -868,14 +908,17 @@ dependencies: "@types/node" "*" -"@types/node@*": - version "20.8.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" - integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== - dependencies: - undici-types "~5.25.1" +"@types/mime@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" + integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== -"@types/node@^20.0.0": +"@types/mime@^1": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" + integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== + +"@types/node@*", "@types/node@^20.0.0": version "20.8.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== @@ -887,6 +930,16 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== +"@types/qs@*": + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== + +"@types/range-parser@*": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== + "@types/responselike@^1.0.0": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.2.tgz#8de1b0477fd7c12df77e50832fa51701a8414bd6" @@ -894,6 +947,23 @@ dependencies: "@types/node" "*" +"@types/send@*": + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" @@ -933,6 +1003,14 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1117,6 +1195,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -1211,6 +1294,42 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + boxen@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" @@ -1323,6 +1442,11 @@ busboy@^1.6.0: dependencies: streamsearch "^1.1.0" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + cacache@^15.2.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" @@ -1666,11 +1790,33 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1727,6 +1873,13 @@ date-fns@^2.29.3: dependencies: "@babel/runtime" "^7.21.0" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1810,6 +1963,16 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + detect-libc@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" @@ -1888,6 +2051,11 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + electron-to-chromium@^1.4.535: version "1.4.554" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz#04e09c2ee31dc0f1546174033809b54cc372740b" @@ -1913,6 +2081,11 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -1954,6 +2127,11 @@ escape-goat@^4.0.0: resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" @@ -1974,6 +2152,11 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2025,6 +2208,43 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + extend@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -2111,6 +2331,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -2140,6 +2373,16 @@ form-data-encoder@^2.1.2: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -2460,6 +2703,17 @@ http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -2518,7 +2772,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -2603,7 +2857,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2691,6 +2945,11 @@ ip@^2.0.0: resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3641,11 +3900,21 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + meow@^12.0.1: version "12.1.0" resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.0.tgz#5f0f53c17ce6691302b49a4706d7832cd5dd5dd6" integrity sha512-SvSqzS5ktjGoySdCwxQI16iO/ID1LtxM03QvJ4FF2H5cCtXLN7YbfKBCL9btqXSSuJ5TNG4UH6wvWtXZuvgvrw== +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3656,6 +3925,11 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3664,6 +3938,23 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -3789,12 +4080,17 @@ mkdirp@^2.1.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0: +ms@2.1.3, ms@^2.0.0: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3838,7 +4134,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@^0.6.2: +negotiator@0.6.3, negotiator@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -4034,6 +4330,13 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4265,6 +4568,11 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4295,6 +4603,11 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -4374,6 +4687,14 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -4394,6 +4715,13 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@^6.7.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" @@ -4411,6 +4739,31 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4642,7 +4995,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4671,11 +5024,45 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.4, semver@^7.3.5, semve dependencies: lru-cache "^6.0.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + sha.js@^2.4.11: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -4826,6 +5213,11 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -5074,6 +5466,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -5138,6 +5535,14 @@ type-fest@^3.0.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -5224,6 +5629,11 @@ unique-string@^3.0.0: dependencies: crypto-random-string "^4.0.0" +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -5267,6 +5677,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + uuid@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" @@ -5301,6 +5716,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" From 9f6e4f48833ebf514e1d51d23192c9fdcb0c2e50 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 3 Nov 2023 21:58:08 +0000 Subject: [PATCH 18/25] Fix build --- src/Functions/CardSetupFunction.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts index 5caabfc..93892cf 100644 --- a/src/Functions/CardSetupFunction.ts +++ b/src/Functions/CardSetupFunction.ts @@ -69,7 +69,7 @@ export default class CardSetupFunction { console.log(`Loaded ${cardsToSave.length} cards to database`); } - private GenerateCardData(files: string[], rarity: CardRarity, series: Series): Card[] { + 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')))) { @@ -86,7 +86,7 @@ export default class CardSetupFunction { return result; } - private GetCardFiles(rarity: CardRarity, series: Series): string[] { + private static GetCardFiles(rarity: CardRarity, series: Series): string[] { const folder = path.join(process.cwd(), 'cards', series.Path, CardRarityToString(rarity).toUpperCase()); const folderExists = existsSync(folder); From 204fd1689f8d1296aeb8f8e5725cba94b1984ace Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sat, 4 Nov 2023 16:11:26 +0000 Subject: [PATCH 19/25] Remove non-required package resolution --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 774443d..6652fb4 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "typeorm": "0.3.17" }, "resolutions": { - "**/@babel/traverse": "^7.23.2", "**/undici": "^5.26.2" }, "devDependencies": { From 647e811c6433d5ac732935adc71e3df7ceee0c03 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 6 Nov 2023 18:23:29 +0000 Subject: [PATCH 20/25] Update dependency @types/jest to v29.5.7 (#71) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jest) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped)) | dependencies | patch | [`29.5.6` -> `29.5.7`](https://renovatebot.com/diffs/npm/@types%2fjest/29.5.6/29.5.7) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/71 Reviewed-by: Vylpes Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- yarn.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index ccc87e4..4031ae5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,7 +10,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -160,7 +160,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": +"@babel/parser@^7.22.15", "@babel/parser@^7.22.5", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== @@ -913,9 +913,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.0.0": - version "29.5.6" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" - integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== + version "29.5.7" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.7.tgz#2c0dafe2715dd958a455bc10e2ec3e1ec47b5036" + integrity sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -937,7 +937,14 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== -"@types/node@*", "@types/node@^20.0.0": +"@types/node@*": + version "20.8.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e" + integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w== + dependencies: + undici-types "~5.26.4" + +"@types/node@^20.0.0": version "20.8.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== @@ -2209,19 +2216,7 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0: - version "29.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521" - integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== - dependencies: - "@jest/expect-utils" "^29.6.2" - "@types/node" "*" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.6.2" - jest-message-util "^29.6.2" - jest-util "^29.6.2" - -expect@^29.7.0: +expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== @@ -5625,6 +5620,11 @@ undici-types@~5.25.1: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@5.22.1, undici@^5.26.2: version "5.27.2" resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" From 87bef546d35b27093119cd55f7763e57a70324e1 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 10 Nov 2023 18:27:02 +0000 Subject: [PATCH 21/25] Add Drop Rarity test command (#73) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Add `/droprarity` test command to help test random rarities - Remove no-longer-needed `DROP_RARITY` environment variable #16 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/73 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .dev.env | 2 - .prod.env | 2 - .stage.env | 2 - src/commands/drop.ts | 6 +-- src/commands/stage/droprarity.ts | 81 ++++++++++++++++++++++++++++++++ src/constants/CardRarity.ts | 17 +++++++ src/registry.ts | 2 + 7 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 src/commands/stage/droprarity.ts diff --git a/.dev.env b/.dev.env index e9d8362..a8ca023 100644 --- a/.dev.env +++ b/.dev.env @@ -16,8 +16,6 @@ BOT_ENV=4 ABOUT_FUNDING= ABOUT_REPO= -DROP_RARITY=-1 - DB_HOST=127.0.0.1 DB_PORT=3301 DB_NAME=carddrop diff --git a/.prod.env b/.prod.env index a6bc823..97472be 100644 --- a/.prod.env +++ b/.prod.env @@ -16,8 +16,6 @@ BOT_ENV=1 ABOUT_FUNDING= ABOUT_REPO= -DROP_RARITY=-1 - DB_HOST=127.0.0.1 DB_PORT=3321 DB_NAME=carddrop diff --git a/.stage.env b/.stage.env index a2fc5a3..66c4653 100644 --- a/.stage.env +++ b/.stage.env @@ -16,8 +16,6 @@ BOT_ENV=2 ABOUT_FUNDING= ABOUT_REPO= -DROP_RARITY=-1 - DB_HOST=127.0.0.1 DB_PORT=3311 DB_NAME=carddrop diff --git a/src/commands/drop.ts b/src/commands/drop.ts index 031bbe7..c23f699 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -17,11 +17,7 @@ export default class Drop extends Command { } public override async execute(interaction: CommandInteraction) { - 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)); - } + const randomCard = await CardDropHelper.GetRandomCard(); const image = readFileSync(randomCard.Path); diff --git a/src/commands/stage/droprarity.ts b/src/commands/stage/droprarity.ts new file mode 100644 index 0000000..fa11b78 --- /dev/null +++ b/src/commands/stage/droprarity.ts @@ -0,0 +1,81 @@ +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"; + +export default class Droprarity extends Command { + constructor() { + super(); + + super.CommandBuilder = new SlashCommandBuilder() + .setName('droprarity') + .setDescription('(TEST) Summon a random card of a specific rarity') + .addStringOption(x => + x + .setName('rarity') + .setDescription('The rarity you want to summon') + .setRequired(true)); + } + + public override async execute(interaction: CommandInteraction) { + if (!interaction.isChatInputCommand()) return; + + const rarity = interaction.options.get('rarity'); + + if (!rarity || !rarity.value) { + await interaction.reply('Rarity is required'); + return; + } + + const rarityType = CardRarityParse(rarity.value.toString()); + + if (rarityType == CardRarity.Unknown) { + await interaction.reply('Invalid rarity'); + return; + } + + const card = await CardDropHelper.GetRandomCardByRarity(rarityType); + + if (!card) { + await interaction.reply('Card not found'); + return; + } + + const image = readFileSync(card.Path); + + await interaction.deferReply(); + + const attachment = new AttachmentBuilder(image, { name: card.FileName }); + + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.CardNumber); + const quantityClaimed = inventory ? inventory.Quantity : 0; + + const embed = CardDropHelper.GenerateDropEmbed(card, quantityClaimed || 0); + + const claimId = v4(); + + const row = CardDropHelper.GenerateDropButtons(card, claimId, interaction.user.id); + + try { + await interaction.editReply({ + embeds: [ embed ], + files: [ attachment ], + components: [ row ], + }); + } catch (e) { + console.error(e); + + 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`); + } + } + + CoreClient.ClaimId = claimId; + } +} \ No newline at end of file diff --git a/src/constants/CardRarity.ts b/src/constants/CardRarity.ts index b4a1f9b..629130a 100644 --- a/src/constants/CardRarity.ts +++ b/src/constants/CardRarity.ts @@ -41,4 +41,21 @@ export function CardRarityToColour(rarity: CardRarity): number { case CardRarity.Manga: return EmbedColours.MangaCard; } +} + +export function CardRarityParse(rarity: string): CardRarity { + switch (rarity.toLowerCase()) { + case "bronze": + return CardRarity.Bronze; + case "silver": + return CardRarity.Silver; + case "gold": + return CardRarity.Gold; + case "legendary": + return CardRarity.Legendary; + case "manga": + return CardRarity.Manga; + default: + return CardRarity.Unknown; + } } \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index 9685c5d..05a5485 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -6,6 +6,7 @@ import Drop from "./commands/drop"; // Test Command Imports import Dropnumber from "./commands/stage/dropnumber"; +import Droprarity from "./commands/stage/droprarity"; // Button Event Imports import Claim from "./buttonEvents/Claim"; @@ -20,6 +21,7 @@ export default class Registry { // Test Commands CoreClient.RegisterCommand('dropnumber', new Dropnumber(), Environment.Test); + CoreClient.RegisterCommand('droprarity', new Droprarity(), Environment.Test); } public static RegisterEvents() { From 21bef358b3cb3a6f30ac770f01515e6f4b263e3c Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 10 Nov 2023 18:28:21 +0000 Subject: [PATCH 22/25] Remove googleapis dependency (#74) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Remove the `googleapis` dependency which is no longer needed from the project #52 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. - Have built the project to ensure it still builds # Checklist - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/74 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- package.json | 1 - src/helpers/GoogleDriveHelper.ts | 83 ------------------ yarn.lock | 141 +------------------------------ 3 files changed, 1 insertion(+), 224 deletions(-) delete mode 100644 src/helpers/GoogleDriveHelper.ts diff --git a/package.json b/package.json index 6652fb4..450e3a6 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "discord.js": "^14.3.0", "dotenv": "^16.0.0", "express": "^4.18.2", - "googleapis": "^127.0.0", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", "minimatch": "9.0.3", diff --git a/src/helpers/GoogleDriveHelper.ts b/src/helpers/GoogleDriveHelper.ts deleted file mode 100644 index ba9c5f4..0000000 --- a/src/helpers/GoogleDriveHelper.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Auth, drive_v3, google } from "googleapis"; -import IGDriveFolderListing from "../contracts/IGDriveFolderListing"; -import path, { resolve } from "path"; -import os from 'os'; -import uuid, { v4 } from 'uuid'; -import { createWriteStream } from "fs"; - -export default class GoogleDriveHelper { - private _auth: Auth.GoogleAuth; - private _drive: drive_v3.Drive; - - constructor() { - this._auth = new google.auth.GoogleAuth({ - keyFile: "gdrive-credentials.json", - scopes: [ - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/drive.metadata.readonly", - ], - }); - - this._drive = google.drive( { version: "v3", auth: this._auth }); - } - - public async listFolder(folderId: string, pageSize: number): Promise { - const params = { - pageSize: pageSize, - fields: "nextPageToken, files(id, name)", - q: `'${folderId}' in parents and trashed=false` - } - - const res = await this._drive.files.list(params); - - return res.data.files as IGDriveFolderListing[]; - } - - public downloadFile(fileId: string) { - const res = this._drive.files.get({ - fileId: fileId, - alt: 'media', - }, { - responseType: 'stream', - }) - .then(res => { - return new Promise((resolve, reject) => { - const filePath = path.join(process.cwd(), 'temp', v4()); - const dest = createWriteStream(filePath); - let progress = 0; - - res.data - .on('end', () => { - resolve(filePath); - }) - .on('error', err => { - reject(err); - }) - .on('data', d => { - progress += d.length; - }) - .pipe(dest); - }); - }) - } - - public async exportFile(fileId: string, mimeType: string) { - const destPath = path.join(process.cwd(), 'temp', v4()); - const dest = createWriteStream(destPath); - - const res = await this._drive.files.export({ - fileId: fileId, - mimeType: mimeType - }, { - responseType: 'stream', - }); - - await new Promise((resolve, reject) => { - res.data - .on('error', reject) - .pipe(dest) - .on('error', reject) - .on('finish', resolve); - }) - } -} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 4031ae5..8585cbd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1044,13 +1044,6 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@^7.0.2: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - agentkeepalive@^4.1.3: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" @@ -1291,7 +1284,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -1306,11 +1299,6 @@ bignumber.js@9.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== -bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -1423,11 +1411,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2063,13 +2046,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2264,11 +2240,6 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.3, external-editor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -2453,24 +2424,6 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" -gaxios@^6.0.0, gaxios@^6.0.3: - version "6.1.0" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.1.0.tgz#8ab08adbf9cc600368a57545f58e004ccf831ccb" - integrity sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w== - dependencies: - extend "^3.0.2" - https-proxy-agent "^7.0.1" - is-stream "^2.0.0" - node-fetch "^2.6.9" - -gcp-metadata@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.0.0.tgz#2ae12008bef8caa8726cba31fd0a641ebad5fb56" - integrity sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ== - dependencies: - gaxios "^6.0.0" - json-bigint "^1.0.0" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2566,39 +2519,6 @@ globby@^13.1.2: merge2 "^1.4.1" slash "^4.0.0" -google-auth-library@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.0.0.tgz#b159d22464c679a6a25cb46d48a4ac97f9f426a2" - integrity sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q== - dependencies: - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - gaxios "^6.0.0" - gcp-metadata "^6.0.0" - gtoken "^7.0.0" - jws "^4.0.0" - lru-cache "^6.0.0" - -googleapis-common@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-7.0.0.tgz#a7b5262e320c922c25b123edea2a3958f15c3edd" - integrity sha512-58iSybJPQZ8XZNMpjrklICefuOuyJ0lMxfKmBqmaC0/xGT4SiOs4BE60LAOOGtBURy1n8fHa2X2YUNFEWWbXyQ== - dependencies: - extend "^3.0.2" - gaxios "^6.0.3" - google-auth-library "^9.0.0" - qs "^6.7.0" - url-template "^2.0.8" - uuid "^9.0.0" - -googleapis@^127.0.0: - version "127.0.0" - resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-127.0.0.tgz#466e723046eda45b83e4ae6e422e5d62b78ddf52" - integrity sha512-a27VnPktyqm+7TeWOAOV+iPL2fX2DJN0ueS/v9Zh5PN2PQI9sF/JxWGSeM5dAs5FBT+LI4oKcvCJS72AG9u9GQ== - dependencies: - google-auth-library "^9.0.0" - googleapis-common "^7.0.0" - got@^11.8.5: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" @@ -2643,14 +2563,6 @@ graceful-fs@^4.2.10, graceful-fs@^4.2.6, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -gtoken@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.0.1.tgz#b64bd01d88268ea3a3572c9076a85d1c48f1a455" - integrity sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ== - dependencies: - gaxios "^6.0.0" - jws "^4.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2766,14 +2678,6 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" - integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== - dependencies: - agent-base "^7.0.2" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -3637,13 +3541,6 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -3659,23 +3556,6 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jwa@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" - integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" - integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - keyv@^4.0.0, keyv@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" @@ -4177,13 +4057,6 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.9: - version "2.6.13" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.13.tgz#a20acbbec73c2e09f9007de5cda17104122e0010" - integrity sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA== - dependencies: - whatwg-url "^5.0.0" - node-gyp@8.x: version "8.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" @@ -4741,13 +4614,6 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.7.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -5691,11 +5557,6 @@ update-notifier@^6.0.2: semver-diff "^4.0.0" xdg-basedir "^5.1.0" -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 2462ca105a54b85f2b21a832d03ecd89fdbf4732 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 10 Nov 2023 18:32:08 +0000 Subject: [PATCH 23/25] Add syncing with google drive (#75) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - Add command (for admins and whitelisted-users only) to sync the google drive folder #40 ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. # Checklist - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/75 Reviewed-by: VylpesTester Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .dev.env | 3 +++ .prod.env | 3 +++ .stage.env | 3 +++ src/bot.ts | 19 +++++++++++++++++ src/buttonEvents/Reroll.ts | 5 +++++ src/client/client.ts | 3 +++ src/commands/drop.ts | 5 +++++ src/commands/gdrivesync.ts | 42 ++++++++++++++++++++++++++++++++++++++ src/registry.ts | 2 ++ 9 files changed, 85 insertions(+) create mode 100644 src/commands/gdrivesync.ts diff --git a/.dev.env b/.dev.env index a8ca023..02c46a1 100644 --- a/.dev.env +++ b/.dev.env @@ -27,3 +27,6 @@ DB_LOGGING=true DB_CARD_FILE=:memory: EXPRESS_PORT=3303 + +GDRIVESYNC_WHITELIST=147392775707426816,887272961504071690 +GDRIVESYNC_AUTO=true diff --git a/.prod.env b/.prod.env index 97472be..1f338a2 100644 --- a/.prod.env +++ b/.prod.env @@ -27,3 +27,6 @@ DB_LOGGING=false DB_CARD_FILE=:memory: EXPRESS_PORT=3323 + +GDRIVESYNC_WHITELIST=147392775707426816,887272961504071690 +GDRIVESYNC_AUTO=false diff --git a/.stage.env b/.stage.env index 66c4653..0a63651 100644 --- a/.stage.env +++ b/.stage.env @@ -27,3 +27,6 @@ DB_LOGGING=false DB_CARD_FILE=:memory: EXPRESS_PORT=3313 + +GDRIVESYNC_WHITELIST=147392775707426816,887272961504071690 +GDRIVESYNC_AUTO=false diff --git a/src/bot.ts b/src/bot.ts index 45ae48d..8bddbf4 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -2,6 +2,8 @@ import * as dotenv from "dotenv"; import { CoreClient } from "./client/client"; import { IntentsBitField } from "discord.js"; import Registry from "./registry"; +import { existsSync } from "fs"; +import { ExecException, exec } from "child_process"; dotenv.config(); @@ -19,6 +21,7 @@ const requiredConfigs: string[] = [ "DB_SYNC", "DB_LOGGING", "EXPRESS_PORT", + "GDRIVESYNC_WHITELIST", ] requiredConfigs.forEach(config => { @@ -36,4 +39,20 @@ Registry.RegisterCommands(); Registry.RegisterEvents(); Registry.RegisterButtonEvents(); +if (!existsSync(`${process.cwd()}/cards`) && process.env.GDRIVESYNC_AUTO && process.env.GDRIVESYNC_AUTO == 'true') { + console.log("Card directory not found, syncing..."); + + CoreClient.AllowDrops = false; + + exec(`rclone sync card-drop-gdrive: ${process.cwd()}/cards`, async (error: ExecException | null) => { + if (error) { + console.error(error.code); + throw `Error while running sync command. Code: ${error.code}`; + } else { + console.log('Synced successfully.'); + CoreClient.AllowDrops = true; + } + }); +} + client.start(); \ No newline at end of file diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index 0f99267..7dd6d19 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -9,6 +9,11 @@ import Inventory from "../database/entities/app/Inventory"; export default class Reroll extends ButtonEvent { public override async execute(interaction: ButtonInteraction) { + if (!CoreClient.AllowDrops) { + await interaction.reply('Bot is currently syncing, please wait until its done.'); + return; + } + if (!interaction.guild || !interaction.guildId) return; let randomCard = await CardDropHelper.GetRandomCard(); diff --git a/src/client/client.ts b/src/client/client.ts index 76ef03f..f909d19 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -26,6 +26,7 @@ export class CoreClient extends Client { public static ClaimId: string; public static Environment: Environment; + public static AllowDrops: boolean; public static get commandItems(): ICommandItem[] { return this._commandItems; @@ -53,6 +54,8 @@ export class CoreClient extends Client { CoreClient.Environment = Number(process.env.BOT_ENV); console.log(`Bot Environment: ${CoreClient.Environment}`); + + CoreClient.AllowDrops = true; } public async start() { diff --git a/src/commands/drop.ts b/src/commands/drop.ts index c23f699..11c00f4 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -17,6 +17,11 @@ export default class Drop extends Command { } public override async execute(interaction: CommandInteraction) { + if (!CoreClient.AllowDrops) { + await interaction.reply('Bot is currently syncing, please wait until its done.'); + return; + } + const randomCard = await CardDropHelper.GetRandomCard(); const image = readFileSync(randomCard.Path); diff --git a/src/commands/gdrivesync.ts b/src/commands/gdrivesync.ts new file mode 100644 index 0000000..5980c48 --- /dev/null +++ b/src/commands/gdrivesync.ts @@ -0,0 +1,42 @@ +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"; + +export default class Gdrivesync extends Command { + constructor() { + super(); + + super.CommandBuilder = new SlashCommandBuilder() + .setName('gdrivesync') + .setDescription('Sync google drive to the bot') + .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator); + } + + public override async execute(interaction: CommandInteraction) { + if (!interaction.isChatInputCommand()) return; + + const whitelistedUsers = process.env.GDRIVESYNC_WHITELIST!.split(','); + + if (!whitelistedUsers.find(x => x == interaction.user.id)) { + await interaction.reply("Only whitelisted users can use this command."); + return; + } + + await interaction.reply('Syncing, this might take a while...'); + + CoreClient.AllowDrops = false; + + exec(`rclone sync card-drop-gdrive: ${process.cwd()}/cards`, async (error: ExecException | null) => { + if (error) { + await interaction.editReply(`Error while running sync command. Code: ${error.code}`); + } else { + await CardSetupFunction.Execute(); + await interaction.editReply('Synced successfully.'); + + CoreClient.AllowDrops = true; + } + }); + } +} \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index 05a5485..9619437 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -3,6 +3,7 @@ import { CoreClient } from "./client/client"; // Global Command Imports import About from "./commands/about"; import Drop from "./commands/drop"; +import Gdrivesync from "./commands/gdrivesync"; // Test Command Imports import Dropnumber from "./commands/stage/dropnumber"; @@ -18,6 +19,7 @@ export default class Registry { // Global Commands CoreClient.RegisterCommand('about', new About()); CoreClient.RegisterCommand('drop', new Drop()); + CoreClient.RegisterCommand('gdrivesync', new Gdrivesync()); // Test Commands CoreClient.RegisterCommand('dropnumber', new Dropnumber(), Environment.Test); From 4a5f624da395bd9f994137c715bc686409e1410d Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sun, 12 Nov 2023 20:53:50 +0000 Subject: [PATCH 24/25] Add safe mode (#85) # Description Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. #76 ## Type of change Please delete options that are not relevant. - [x] Bug fix (non-breaking change which fixes an issue) # How Has This Been Tested? Please describe the tests that you ran to verify the changes. Provide instructions so we can reproduce. Please also list any relevant details to your test configuration. # Checklist - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that provde my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Reviewed-on: https://gitea.vylpes.xyz/External/card-drop/pulls/85 Co-authored-by: Ethan Lane Co-committed-by: Ethan Lane --- .../Up/01-table/Config.sql | 8 +++ src/Functions/CardSetupFunction.ts | 13 +++-- src/buttonEvents/Reroll.ts | 8 ++- src/commands/drop.ts | 8 ++- src/commands/gdrivesync.ts | 5 +- src/database/entities/app/Config.ts | 53 +++++++++++++++++++ .../app/0.2/1699814500650-createConfig.ts | 15 ++++++ 7 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 database/0.2/1699814500650-createConfig/Up/01-table/Config.sql create mode 100644 src/database/entities/app/Config.ts create mode 100644 src/database/migrations/app/0.2/1699814500650-createConfig.ts diff --git a/database/0.2/1699814500650-createConfig/Up/01-table/Config.sql b/database/0.2/1699814500650-createConfig/Up/01-table/Config.sql new file mode 100644 index 0000000..dbc4ec7 --- /dev/null +++ b/database/0.2/1699814500650-createConfig/Up/01-table/Config.sql @@ -0,0 +1,8 @@ +CREATE TABLE `config` ( + `Id` VARCHAR(255) NOT NULL, + `WhenCreated` DATETIME NOT NULL, + `WhenUpdated` DATETIME NOT NULL, + `Key` VARCHAR(255) NOT NULL, + `Value` VARCHAR(255) NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; \ No newline at end of file diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts index 93892cf..037b87b 100644 --- a/src/Functions/CardSetupFunction.ts +++ b/src/Functions/CardSetupFunction.ts @@ -4,12 +4,19 @@ 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() { - await this.ClearDatabase(); - await this.ReadSeries(); - await this.ReadCards(); + if (await Config.GetValue('safemode') == "true") return; + + try { + await this.ClearDatabase(); + await this.ReadSeries(); + await this.ReadCards(); + } catch { + await Config.SetValue('safemode', 'true'); + } } private static async ClearDatabase() { diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index 7dd6d19..38cae08 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -4,8 +4,8 @@ import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; import { v4 } from "uuid"; import { CoreClient } from "../client/client"; -import Card from "../database/entities/card/Card"; import Inventory from "../database/entities/app/Inventory"; +import Config from "../database/entities/app/Config"; export default class Reroll extends ButtonEvent { public override async execute(interaction: ButtonInteraction) { @@ -14,6 +14,12 @@ 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.'); + return; + } + if (!interaction.guild || !interaction.guildId) return; let randomCard = await CardDropHelper.GetRandomCard(); diff --git a/src/commands/drop.ts b/src/commands/drop.ts index 11c00f4..bebe581 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -4,8 +4,8 @@ import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; import { v4 } from "uuid"; -import Card from "../database/entities/card/Card"; import Inventory from "../database/entities/app/Inventory"; +import Config from "../database/entities/app/Config"; export default class Drop extends Command { constructor() { @@ -22,6 +22,12 @@ 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.'); + return; + } + const randomCard = await CardDropHelper.GetRandomCard(); const image = readFileSync(randomCard.Path); diff --git a/src/commands/gdrivesync.ts b/src/commands/gdrivesync.ts index 5980c48..97009a2 100644 --- a/src/commands/gdrivesync.ts +++ b/src/commands/gdrivesync.ts @@ -3,6 +3,7 @@ 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"; export default class Gdrivesync extends Command { constructor() { @@ -30,12 +31,14 @@ export default class Gdrivesync extends Command { exec(`rclone sync card-drop-gdrive: ${process.cwd()}/cards`, async (error: ExecException | null) => { if (error) { - await interaction.editReply(`Error while running sync command. Code: ${error.code}`); + 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 interaction.editReply('Synced successfully.'); CoreClient.AllowDrops = true; + await Config.SetValue('safemode', 'false'); } }); } diff --git a/src/database/entities/app/Config.ts b/src/database/entities/app/Config.ts new file mode 100644 index 0000000..50915d0 --- /dev/null +++ b/src/database/entities/app/Config.ts @@ -0,0 +1,53 @@ +import { Column, Entity } from "typeorm"; +import AppBaseEntity from "../../../contracts/AppBaseEntity"; +import AppDataSource from "../../dataSources/appDataSource"; + +@Entity() +export default class Config extends AppBaseEntity { + constructor(key: string, value: string) { + super(); + + this.Key = key; + this.Value = value; + } + + @Column() + Key: string; + + @Column() + Value: string; + + public SetValue(value: string) { + this.Value = value; + } + + public static async FetchOneByKey(key: string): Promise { + const repository = AppDataSource.getRepository(Config); + + const single = await repository.findOne({ where: { Key: key }}); + + return single; + } + + public static async GetValue(key: string): Promise { + const config = await Config.FetchOneByKey(key); + + if (!config) return undefined; + + return config.Value; + } + + public static async SetValue(key: string, value: string) { + const config = await Config.FetchOneByKey(key); + + if (!config) { + const newConfig = new Config(key, value); + + await newConfig.Save(Config, newConfig); + } else { + config.SetValue(value); + + await config.Save(Config, config); + } + } +} \ No newline at end of file diff --git a/src/database/migrations/app/0.2/1699814500650-createConfig.ts b/src/database/migrations/app/0.2/1699814500650-createConfig.ts new file mode 100644 index 0000000..0a1f22e --- /dev/null +++ b/src/database/migrations/app/0.2/1699814500650-createConfig.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from "typeorm" +import MigrationHelper from "../../../../helpers/MigrationHelper" + +export class CreateConfig1699814500650 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + MigrationHelper.Up('1699814500650-createConfig', '0.2', [ + "01-table/Config", + ], queryRunner); + } + + public async down(queryRunner: QueryRunner): Promise { + } + +} From 091b8e52056cfaf98c791b4cfcb44d9c3b59934f Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Sun, 12 Nov 2023 20:56:39 +0000 Subject: [PATCH 25/25] v0.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 450e3a6..ebe4870 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "card-drop", - "version": "0.1.8", + "version": "0.2.0", "main": "./dist/bot.js", "typings": "./dist", "scripts": {