diff --git a/.env.example b/.dev.env similarity index 58% rename from .env.example rename to .dev.env index d25e432..02c46a1 100644 --- a/.env.example +++ b/.dev.env @@ -7,33 +7,26 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.8.4 +BOT_VER=0.2 DEV BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=682942374040961060 BOT_ENV=4 -BOT_ADMINS=147392775707426816,887272961504071690 -BOT_LOGLEVEL=info -BOT_LOG_DISCORD_ENABLE=false -BOT_LOG_DISCORD_LEVEL=warn -BOT_LOG_DISCORD_WEBHOOK= -BOT_LOG_DISCORD_SERVICE= ABOUT_FUNDING= ABOUT_REPO= -DATA_DIR=./.temp - DB_HOST=127.0.0.1 DB_PORT=3301 DB_NAME=carddrop -DB_AUTH_USER= -DB_AUTH_PASS= -DB_SYNC= -DB_LOGGING= -DB_DATA_LOCATION=./.temp/database -DB_ROOT_HOST=0.0.0.0 +DB_AUTH_USER=dev +DB_AUTH_PASS=dev +DB_SYNC=true +DB_LOGGING=true -EXPRESS_PORT=3302 +DB_CARD_FILE=:memory: -GDRIVESYNC_AUTO=false +EXPRESS_PORT=3303 + +GDRIVESYNC_WHITELIST=147392775707426816,887272961504071690 +GDRIVESYNC_AUTO=true diff --git a/.drone.yml b/.drone.yml index 962eb6c..35df56b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,36 +4,16 @@ kind: pipeline name: deployment steps: -- name: build - image: node - commands: - - npm ci - - npm run build -- name: test - image: node - commands: - - npm test -- name: deploy to prod - image: drillster/drone-rsync - secrets: [ ssh_key, bot_token_prod ] +- name: deploy + image: appleboy/drone-ssh settings: - hosts: - - 192.168.68.120 - user: vylpes - key: - from_secret: ssh_key - source: . - target: ~/apps/card-drop/card-drop_prod - recursive: true + host: 192.168.68.120 + username: vylpes + password: + from_secret: ssh_password + port: 22 script: - - export PATH="$HOME/.yarn/bin:$PATH" - - export PATH="$HOME/.nodeuse/bin:$PATH" - - export BOT_TOKEN="$BOT_TOKEN_PROD" - - cd ~/apps/card-drop/card-drop_prod - - docker compose --file docker-compose.prod.yml up -d - - sleep 10 - - cp .prod.env .env - - pm2 restart card-drop_prod || pm2 start --name card-drop_prod dist/bot.js + - sh /home/vylpes/scripts/card-drop/deploy_prod.sh trigger: event: @@ -45,36 +25,16 @@ kind: pipeline name: staging steps: -- name: build - image: node - commands: - - npm ci - - npm run build -- name: test - image: node - commands: - - npm test -- name: deploy to stage - image: drillster/drone-rsync - secrets: [ ssh_key, bot_token_stage ] +- name: stage + image: appleboy/drone-ssh settings: - hosts: - - 192.168.68.120 - user: vylpes - key: - from_secret: ssh_key - source: . - target: ~/apps/card-drop/card-drop_stage - recursive: true + host: 192.168.68.120 + username: vylpes + password: + from_secret: ssh_password + port: 22 script: - - export PATH="$HOME/.yarn/bin:$PATH" - - export PATH="$HOME/.nodeuse/bin:$PATH" - - export BOT_TOKEN="$BOT_TOKEN_STAGE" - - cd ~/apps/card-drop/card-drop_stage - - docker compose --file docker-compose.stage.yml up -d - - sleep 10 - - cp .stage.env .env - - pm2 restart card-drop_stage || pm2 start --name card-drop_stage dist/bot.js + - sh /home/vylpes/scripts/card-drop/deploy_stage.sh trigger: branch: @@ -91,21 +51,19 @@ steps: - name: build image: node commands: - - npm ci - - npm run build - -- name: lint - image: node - commands: - - npm run lint + - yarn install --frozen-lockfile + - yarn build - name: test image: node commands: - - npm test + - yarn install --frozen-lockfile + - yarn test trigger: branch: + - main + - develop - hotfix/* - feature/* - renovate/* diff --git a/.forgejo/workflows/production.yml b/.forgejo/workflows/production.yml deleted file mode 100644 index cb4ed46..0000000 --- a/.forgejo/workflows/production.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Deploy To Production - -on: - push: - branches: - - main - -jobs: - build: - environment: prod - - runs-on: node - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 20.x - - run: yarn install --frozen-lockfile - - run: yarn build - - run: yarn test - - run: yarn lint - - - name: "Copy files over to location" - run: rsync -rvzP . ${{ secrets.PROD_REPO_PATH }} - - deploy: - environment: prod - needs: build - runs-on: node - steps: - - uses: https://github.com/appleboy/ssh-action@v1.1.0 - env: - DB_NAME: ${{ secrets.PROD_DB_NAME }} - DB_AUTH_USER: ${{ secrets.PROD_DB_AUTH_USER }} - DB_AUTH_PASS: ${{ secrets.PROD_DB_AUTH_PASS }} - DB_HOST: ${{ secrets.PROD_DB_HOST }} - DB_PORT: ${{ secrets.PROD_DB_PORT }} - DB_ROOT_HOST: ${{ secrets.PROD_DB_ROOT_HOST }} - DB_SYNC: ${{ secrets.PROD_DB_SYNC }} - DB_LOGGING: ${{ secrets.PROD_DB_LOGGING }} - DB_DATA_LOCATION: ${{ secrets.PROD_DB_DATA_LOCATION }} - SERVER_PATH: ${{ secrets.PROD_SSH_SERVER_PATH }} - BOT_TOKEN: ${{ secrets.PROD_BOT_TOKEN }} - BOT_VER: ${{ vars.PROD_BOT_VER }} - BOT_AUTHOR: ${{ vars.PROD_BOT_AUTHOR }} - BOT_OWNERID: ${{ vars.PROD_BOT_OWNERID }} - BOT_CLIENTID: ${{ vars.PROD_BOT_CLIENTID }} - BOT_ENV: ${{ vars.PROD_BOT_ENV }} - BOT_ADMINS: ${{ vars.PROD_BOT_ADMINS }} - ABOUT_FUNDING: ${{ vars.PROD_ABOUT_FUNDING }} - ABOUT_REPO: ${{ vars.PROD_ABOUT_REPO }} - DATA_DIR: ${{ secrets.PROD_DATA_DIR }} - GDRIVESYNC_AUTO: ${{ vars.PROD_GDRIVESYNC_AUTO }} - EXPRESS_PORT: ${{ secrets.PROD_EXPRESS_PORT }} - BOT_LOGLEVEL: ${{ vars.PROD_BOT_LOGLEVEL }} - BOT_LOG_DISCORD_ENABLE: ${{ vars.PROD_BOT_LOG_DISCORD_ENABLE }} - BOT_LOG_DISCORD_LEVEL: ${{ vars.PROD_BOT_LOG_DISCORD_LEVEL }} - BOT_LOG_DISCORD_WEBHOOK: ${{ secrets.PROD_BOT_LOG_DISCORD_WEBHOOK }} - BOT_LOG_DISCORD_SERVICE: ${{ vars.PROD_BOT_LOG_DISCORD_SERVICE }} - with: - host: ${{ secrets.PROD_SSH_HOST }} - username: ${{ secrets.PROD_SSH_USER }} - key: ${{ secrets.PROD_SSH_KEY }} - port: ${{ secrets.PROD_SSH_PORT }} - envs: DB_NAME,DB_AUTH_USER,DB_AUTH_PASS,DB_HOST,DB_PORT,DB_ROOT_HOST,DB_SYNC,DB_LOGGING,DB_DATA_LOCATION,BOT_TOKEN,BOT_VER,BOT_AUTHOR,BOT_OWNERID,BOT_CLIENTID,ABOUT_FUNDING,ABOUT_REPO,BOT_ENV,BOT_ADMINS,DATA_DIR,GDRIVESYNC_AUTO,SERVER_PATH,EXPRESS_PORT,BOT_LOGLEVEL,BOT_LOG_DISCORD_ENABLE,BOT_LOG_DISCORD_LEVEL,BOT_LOG_DISCORD_WEBHOOK,BOT_LOG_DISCORD_SERVICE - script: | - source .sshrc \ - && cd /home/vylpes/apps/card-drop/card-drop_prod \ - && docker compose down \ - && (pm2 stop card-drop_prod || true) \ - && (pm2 delete card-drop_prod || true) \ - && docker compose up -d \ - && sleep 10 \ - && yarn run db:up \ - && pm2 start --name card-drop_prod dist/bot.js \ No newline at end of file diff --git a/.forgejo/workflows/stage.yml b/.forgejo/workflows/stage.yml deleted file mode 100644 index b6c27da..0000000 --- a/.forgejo/workflows/stage.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Deploy To Stage - -on: - push: - branches: - - develop - -jobs: - build: - environment: stage - - runs-on: node - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 20.x - - run: yarn install --frozen-lockfile - - run: yarn build - - run: yarn test - - run: yarn lint - - - name: "Copy files over to location" - run: rsync -rvzP . ${{ secrets.STAGE_REPO_PATH }} - - deploy: - environment: prod - needs: build - runs-on: node - steps: - - uses: https://github.com/appleboy/ssh-action@v1.1.0 - env: - DB_NAME: ${{ secrets.STAGE_DB_NAME }} - DB_AUTH_USER: ${{ secrets.STAGE_DB_AUTH_USER }} - DB_AUTH_PASS: ${{ secrets.STAGE_DB_AUTH_PASS }} - DB_HOST: ${{ secrets.STAGE_DB_HOST }} - DB_PORT: ${{ secrets.STAGE_DB_PORT }} - DB_ROOT_HOST: ${{ secrets.STAGE_DB_ROOT_HOST }} - DB_SYNC: ${{ secrets.STAGE_DB_SYNC }} - DB_LOGGING: ${{ secrets.STAGE_DB_LOGGING }} - DB_DATA_LOCATION: ${{ secrets.STAGE_DB_DATA_LOCATION }} - SERVER_PATH: ${{ secrets.STAGE_SSH_SERVER_PATH }} - BOT_TOKEN: ${{ secrets.STAGE_BOT_TOKEN }} - BOT_VER: ${{ vars.STAGE_BOT_VER }} - BOT_AUTHOR: ${{ vars.STAGE_BOT_AUTHOR }} - BOT_OWNERID: ${{ vars.STAGE_BOT_OWNERID }} - BOT_CLIENTID: ${{ vars.STAGE_BOT_CLIENTID }} - BOT_ENV: ${{ vars.STAGE_BOT_ENV }} - BOT_ADMINS: ${{ vars.STAGE_BOT_ADMINS }} - ABOUT_FUNDING: ${{ vars.STAGE_ABOUT_FUNDING }} - ABOUT_REPO: ${{ vars.STAGE_ABOUT_REPO }} - DATA_DIR: ${{ secrets.STAGE_DATA_DIR }} - GDRIVESYNC_AUTO: ${{ vars.STAGE_GDRIVESYNC_AUTO }} - EXPRESS_PORT: ${{ secrets.STAGE_EXPRESS_PORT }} - BOT_LOGLEVEL: ${{ vars.STAGE_BOT_LOGLEVEL }} - BOT_LOG_DISCORD_ENABLE: ${{ vars.STAGE_BOT_LOG_DISCORD_ENABLE }} - BOT_LOG_DISCORD_LEVEL: ${{ vars.STAGE_BOT_LOG_DISCORD_LEVEL }} - BOT_LOG_DISCORD_WEBHOOK: ${{ secrets.STAGE_BOT_LOG_DISCORD_WEBHOOK }} - BOT_LOG_DISCORD_SERVICE: ${{ vars.STAGE_BOT_LOG_DISCORD_SERVICE }} - with: - host: ${{ secrets.STAGE_SSH_HOST }} - username: ${{ secrets.STAGE_SSH_USER }} - key: ${{ secrets.STAGE_SSH_KEY }} - port: ${{ secrets.STAGE_SSH_PORT }} - envs: DB_NAME,DB_AUTH_USER,DB_AUTH_PASS,DB_HOST,DB_PORT,DB_ROOT_HOST,DB_SYNC,DB_LOGGING,DB_DATA_LOCATION,BOT_TOKEN,BOT_VER,BOT_AUTHOR,BOT_OWNERID,BOT_CLIENTID,ABOUT_FUNDING,ABOUT_REPO,BOT_ENV,BOT_ADMINS,DATA_DIR,GDRIVESYNC_AUTO,SERVER_PATH,EXPRESS_PORT,BOT_LOGLEVEL,BOT_LOG_DISCORD_ENABLE,BOT_LOG_DISCORD_LEVEL,BOT_LOG_DISCORD_WEBHOOK,BOT_LOG_DISCORD_SERVICE - script: | - source .sshrc \ - && cd /home/vylpes/apps/card-drop/card-drop_stage \ - && docker compose down \ - && (pm2 stop card-drop_stage || true) \ - && (pm2 delete card-drop_stage || true) \ - && docker compose up -d \ - && sleep 10 \ - && yarn run db:up \ - && pm2 start --name card-drop_stage dist/bot.js \ No newline at end of file diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml deleted file mode 100644 index 6becf3e..0000000 --- a/.forgejo/workflows/test.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Test - -on: - push: - branches: - - feature/* - - hotfix/* - - renovate/* - -jobs: - build: - environment: stage - - runs-on: node - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 20.x - - run: yarn install --frozen-lockfile - - run: yarn build - - run: yarn test - - run: yarn lint \ No newline at end of file diff --git a/.gitignore b/.gitignore index a7d5b20..a354170 100644 --- a/.gitignore +++ b/.gitignore @@ -107,6 +107,5 @@ config.json .DS_Store ormconfig.json gdrive-credentials.json -data/ -*.db -.temp/ +cards/ +*.db \ No newline at end of file diff --git a/.prod.env b/.prod.env new file mode 100644 index 0000000..1f338a2 --- /dev/null +++ b/.prod.env @@ -0,0 +1,32 @@ +# Security Warning! Do not commit this file to any VCS! +# This is a local file to speed up development process, +# so you don't have to change your environment variables. +# +# This is not applied to `.env.template`! +# Template files must be committed to the VCS, but must not contain +# any secret values. + +BOT_TOKEN= +BOT_VER=0.2 +BOT_AUTHOR=Vylpes +BOT_OWNERID=147392775707426816 +BOT_CLIENTID=1093810443589529631 +BOT_ENV=1 + +ABOUT_FUNDING= +ABOUT_REPO= + +DB_HOST=127.0.0.1 +DB_PORT=3321 +DB_NAME=carddrop +DB_AUTH_USER=prod +DB_AUTH_PASS=prod +DB_SYNC=false +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 new file mode 100644 index 0000000..0a63651 --- /dev/null +++ b/.stage.env @@ -0,0 +1,32 @@ +# Security Warning! Do not commit this file to any VCS! +# This is a local file to speed up development process, +# so you don't have to change your environment variables. +# +# This is not applied to `.env.template`! +# Template files must be committed to the VCS, but must not contain +# any secret values. + +BOT_TOKEN= +BOT_VER=0.2 BETA +BOT_AUTHOR=Vylpes +BOT_OWNERID=147392775707426816 +BOT_CLIENTID=1147976642942214235 +BOT_ENV=2 + +ABOUT_FUNDING= +ABOUT_REPO= + +DB_HOST=127.0.0.1 +DB_PORT=3311 +DB_NAME=carddrop +DB_AUTH_USER=stage +DB_AUTH_PASS=stage +DB_SYNC=false +DB_LOGGING=false + +DB_CARD_FILE=:memory: + +EXPRESS_PORT=3313 + +GDRIVESYNC_WHITELIST=147392775707426816,887272961504071690 +GDRIVESYNC_AUTO=false diff --git a/.woodpecker.yml b/.woodpecker.yml deleted file mode 100644 index f42ba60..0000000 --- a/.woodpecker.yml +++ /dev/null @@ -1,47 +0,0 @@ -steps: - build: - image: node - commands: - - npm ci - - npm run build - when: - event: push - branch: [ hotfix/*, feature/*, renovate/*, develop, main ] - lint: - image: node - commands: - - npm run lint - when: - event: push - branch: [ hotfix/*, feature/*, renovate/*, develop, main ] - test: - image: node - commands: - - npm test - when: - event: push - branch: [ hotfix/*, feature/*, renovate/*, develop, main ] - stage: - image: alpine - secrets: [ ssh_key, stage_bot_token ] - commands: - - apk add rsync openssh-client - - eval `ssh-agent -s` - - echo "$SSH_KEY" | tr -d '\r' | ssh-add - - - rsync -e "ssh -o StrictHostKeyChecking=no" -r ./* vylpes@192.168.1.115:/home/vylpes/apps/card-drop/card-drop_stage - - ssh vylpes@192.168.1.115 BOT_TOKEN='$${stage_bot_token}' 'bash -s' < ./scripts/deploy_stage.sh - when: - event: push - branch: [ develop ] - deploy: - image: alpine - secrets: [ ssh_key, prod_bot_token ] - commands: - - apk add rsync openssh-client - - eval `ssh-agent -s` - - echo "$SSH_KEY" | tr -d '\r' | ssh-add - - - rsync -e "ssh -o StrictHostKeyChecking=no" -r ./* vylpes@192.168.1.115:/home/vylpes/apps/card-drop/card-drop_prod - - ssh vylpes@192.168.1.115 BOT_TOKEN='$${prod_bot_token}' 'bash -s' < ./scripts/deploy_prod.sh - when: - event: push - branch: [ main ] \ No newline at end of file diff --git a/README.md b/README.md index ca4b03f..94f0c9c 100644 --- a/README.md +++ b/README.md @@ -1,60 +1,2 @@ -# Card Drop - -Card Drop is a Discord Bot designed to allow users to "drop" random cards into -a channel and have the ability to claim them for themselves or let others if -they so choose. - -The cards are randomly chosen based on weights of their card type (i.e. Bronze -is more common than Gold). The user who ran the drop command has 5 minutes to -choose if they want the card to themselves before its claimable by anyone, or -until the drop command is ran again. - -## Installation - -Downloads of the latest version can be found from the [GitHub Releases](https://github.com/vylpes/card-drop/releases) -or [Forgejo Releases](https://git.vylpes.xyz/external/card-drop/releases) page. - -Copy the config template file and fill in the strings. - -## Requirements - -- NodeJS -- Yarn -- Docker - -## Usage - -Install the dependencies and build the app: - -```bash -yarn Install -yarn build -``` - -Setup the database (Recommended to use the docker-compose file - -```bash -docker compose up -d -``` - -Copy and edit the settings file - -```bash -cp .env.template .env -``` - -> **NOTE:** Make sure you do *not* check in these files! These contain -sensitive information and should be treated as private. - -If you're not using `DB_SYNC=true` in `.env`, make sure to migrate the database - -```bash -yarn db:up -``` - -Start the bot - -```bash -yarn start -``` +# card-drop diff --git a/database/0.6/1713289062969-user/Up/01-table/User.sql b/database/0.6/1713289062969-user/Up/01-table/User.sql deleted file mode 100644 index 86a5d36..0000000 --- a/database/0.6/1713289062969-user/Up/01-table/User.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE `user` ( - `Id` varchar(255) NOT NULL, - `WhenCreated` datetime NOT NULL, - `WhenUpdated` datetime NOT NULL, - `Currency` int NOT NULL, - PRIMARY KEY (`Id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; \ No newline at end of file diff --git a/database/0.6/1715967355818-daily/Up/01-table/User.sql b/database/0.6/1715967355818-daily/Up/01-table/User.sql deleted file mode 100644 index 8699650..0000000 --- a/database/0.6/1715967355818-daily/Up/01-table/User.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `user` -ADD LastUsedDaily datetime null; \ No newline at end of file diff --git a/database/0.9/1729962056556-createUserEffect/Down/01-table-userEffect.sql b/database/0.9/1729962056556-createUserEffect/Down/01-table-userEffect.sql deleted file mode 100644 index ca2a800..0000000 --- a/database/0.9/1729962056556-createUserEffect/Down/01-table-userEffect.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE `user_effect`; diff --git a/database/0.9/1729962056556-createUserEffect/Up/01-table-userEffect.sql b/database/0.9/1729962056556-createUserEffect/Up/01-table-userEffect.sql deleted file mode 100644 index 17c1811..0000000 --- a/database/0.9/1729962056556-createUserEffect/Up/01-table-userEffect.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE TABLE `user_effect` ( - `Id` varchar(255) NOT NULL, - `WhenCreated` datetime NOT NULL, - `WhenUpdated` datetime NOT NULL, - `Name` varchar(255) NOT NULL, - `UserId` varchar(255) NOT NULL, - `Unused` int NOT NULL DEFAULT 0, - `WhenExpires` datetime NULL, - PRIMARY KEY (`Id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..faac7fb --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,31 @@ +version: "3.9" + +volumes: + prod_database_data: + +services: + # discord: + # build: . + + database: + image: mysql/mysql-server + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + - MYSQL_DATABASE=carddrop + - MYSQL_USER=prod + - MYSQL_PASSWORD=prod + - MYSQL_ROOT_PASSWORD=root + - MYSQL_ROOT_HOST=0.0.0.0 + ports: + - "3321:3306" + volumes: + - prod_database_data:/var/lib/mysql + + phpmyadmin: + image: phpmyadmin + restart: always + ports: + - "3322:80" + environment: + - PMA_ARBITRARY=1 \ No newline at end of file diff --git a/docker-compose.stage.yml b/docker-compose.stage.yml new file mode 100644 index 0000000..a6666a4 --- /dev/null +++ b/docker-compose.stage.yml @@ -0,0 +1,31 @@ +version: "3.9" + +volumes: + stage_database_data: + +services: + # discord: + # build: . + + database: + image: mysql/mysql-server + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + - MYSQL_DATABASE=carddrop + - MYSQL_USER=stage + - MYSQL_PASSWORD=stage + - MYSQL_ROOT_PASSWORD=root + - MYSQL_ROOT_HOST=0.0.0.0 + ports: + - "3311:3306" + volumes: + - stage_database_data:/var/lib/mysql + + phpmyadmin: + image: phpmyadmin + restart: always + ports: + - "3312:80" + environment: + - PMA_ARBITRARY=1 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 025a674..c0b5077 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,17 +1,31 @@ version: "3.9" +volumes: + dev_database_data: + services: + # discord: + # build: . + database: image: mysql/mysql-server command: --default-authentication-plugin=mysql_native_password restart: always environment: - - MYSQL_DATABASE=$DB_NAME - - MYSQL_USER=$DB_AUTH_USER - - MYSQL_PASSWORD=$DB_AUTH_PASS - - MYSQL_ROOT_PASSWORD=$DB_AUTH_PASS - - MYSQL_ROOT_HOST=$DB_ROOT_HOST + - MYSQL_DATABASE=carddrop + - MYSQL_USER=dev + - MYSQL_PASSWORD=dev + - MYSQL_ROOT_PASSWORD=root + - MYSQL_ROOT_HOST=0.0.0.0 ports: - - "$DB_PORT:3306" + - "3301:3306" volumes: - - $DB_DATA_LOCATION:/var/lib/mysql \ No newline at end of file + - dev_database_data:/var/lib/mysql + + phpmyadmin: + image: phpmyadmin + restart: always + ports: + - "3302:80" + environment: + - PMA_ARBITRARY=1 \ No newline at end of file diff --git a/docs/cards.md b/docs/cards.md deleted file mode 100644 index f0be28f..0000000 --- a/docs/cards.md +++ /dev/null @@ -1,120 +0,0 @@ -# Cards - -This document will describe how to add cards to the bot. This is from the -perspective of the development side and doesn't go into details of syncing -from an external place such as with the Google Drive Sync function. - -The cards will be put into the `$DATA_DIR/cards` folder. `$DATA_DIR` is -configured in the `.env` file. - -## Folder Structure - -The general structure of the cards folder is as follows: - -``` -cards # The main cards folder -| Series 1 # Series folder -| | BRONZE # Type folder -| | | 1000.jpg # Card image -| | | 1001.jpg -| | 1.json # Card metadata file -| Series 2 -| | SILVER -| | | 2000.jpg -| | 2.json -``` - -- The root of the cards folder will have a folder foor each series -- Each series will contain folders for each of the card types containing the - card images. -- The series folder will also contain a metadata JSON folder containing the - metadata of the cards within that series. - -The bot when loading will search the cards folder recursively for each json, -and then read them to determine what cards should be used for the bot. - -## Series Metadata - -An example of what the metadata files could look like are as follows: - -```json -[ - { - "id": 1, - "name": "Series 1", - "cards": [ - { - "id": "1000", - "name": "Card 1000 of Series 1", - "type": 1, - "path": "Series 1/BRONZE/1000.jpg" - }, - { - "id": "1001", - "name": "Card 1001 of Series 1", - "type": 1, - "path": "Series 2/BRONZE?1001.jpg", - "subseries": "Custom Series Name" - } - ] - } -] -``` - -This file will load a series called "Series 1" with the id of 1, containing 2 -cards: -- Card 1000, with type 1 (Bronze), with its image located at (from root) - "Series 1/BRONZE/1000.jpg" -- Card 1001 is the same, except has a custom "subseries" name which will - override the main series name if shown, helpful for an "other" category. - -### Card Type - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NumberNameChanceSacrifice Cost (Coins)
0Unknown--
1Bronze62%5
2Silver31%10
3Gold4.4%30
4Manga2%40
5Legendary0.6%100
diff --git a/docs/google-drive-sync.md b/docs/google-drive-sync.md deleted file mode 100644 index 1847f70..0000000 --- a/docs/google-drive-sync.md +++ /dev/null @@ -1,35 +0,0 @@ -# Google Drive Sync - -The bot relies on an external sync between the local file system and Google -Drive in order to get newer cards to the bot. This is done using -[Rclone](https://rclone.org/). - -The process for this is done by once the `/gdrivesync` command is executed by -an admin user of the bot, which calls the system shell to run rclone to the -card folder. - -- The admins who can run the command is specifed in `$BOT_ADMINS`, which are -discord user ids separated by commas. -- The card folder is located at `$DATA_DIR/cards`. -- The source requires rclone's remote to be setup as `card-drop-gdrive`. - -The exact command it runs is: `rclone sync card-drop-gdrive: $DATA_DIR/cards`. - -Once it syncs the database will reread all the cards for updates and then load -them into the bot to be given. - -## Safe Mode -Safe mode is a function of the bot which disables the `/drop` command function -and any other functions which rely on the card metadata. Safe mode is activated -upon failure to sync properly. It is disabled once errors are resolved. - -The reason for safe mode is to ensure that the bot stays online for admins to -be able to resync the bot in case there's an error without it crashing. - -## Google Drive -Please see the Rclone documentation on how to setup a remote using Google -Drive. You will need to make an app password for this. - -- scope: `drive.readonly` -- root\_folder\_id: The folder id where the cards are located, this can be found - by looking at the url when viewing the folder in the browser in google drive. diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 64bf3e2..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,55 +0,0 @@ -import js from "@eslint/js"; -import ts from "typescript-eslint"; - -export default [ - { - ignores: [ - "**/dist/", - "eslint.config.mjs", - "jest.config.cjs", - "jest.setup.js", - "**/.temp/**/*" - ], - }, - js.configs.recommended, - ...ts.configs.recommended, - { - languageOptions: { - globals: { - exports: "writable", - module: "writable", - require: "writable", - process: "writable", - console: "writable", - jest: "writable", - }, - - ecmaVersion: 6, - sourceType: "script", - }, - - files: [ - "./src", - "./tests" - ], - - rules: { - camelcase: "error", - "brace-style": ["error", "1tbs"], - "comma-dangle": ["error", "never"], - - "comma-spacing": ["error", { - before: false, - after: true, - }], - - "comma-style": ["error", "last"], - "arrow-body-style": ["error", "as-needed"], - "arrow-parens": ["error", "as-needed"], - "arrow-spacing": "error", - "no-var": "error", - "prefer-template": "error", - "prefer-const": "error", - }, - } -]; diff --git a/jest.setup.js b/jest.setup.js index 8e9ae9a..d583d1a 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,4 +1,3 @@ jest.setTimeout(1 * 1000); // 1 second jest.resetModules(); -jest.resetAllMocks(); -jest.useFakeTimers(); \ No newline at end of file +jest.resetAllMocks(); \ No newline at end of file diff --git a/package.json b/package.json index b8c7536..ebe4870 100644 --- a/package.json +++ b/package.json @@ -1,64 +1,50 @@ { "name": "card-drop", - "version": "0.9.2", + "version": "0.2.0", "main": "./dist/bot.js", "typings": "./dist", "scripts": { "clean": "rm -rf node_modules/ dist/", "build": "tsc", "start": "node ./dist/bot.js", - "test": "jest", - "lint": "eslint .", - "lint:fix": "eslint . --fix", + "test": "jest --passWithNoTests", "db:up": "typeorm migration:run -d dist/database/dataSources/appDataSource.js", "db:down": "typeorm migration:revert -d dist/database/dataSources/appDataSource.js", "db:create": "typeorm migration:create ./src/database/migrations/app/new", "release": "np --no-publish" }, - "repository": "https://git.vylpes.xyz/External/card-drop.git", + "repository": "https://gitea.vylpes.xyz/External/card-drop.git", "author": "Ethan Lane ", "license": "MIT", "bugs": { - "url": "https//git.vylpes.xyz/External/card-drop/issues", + "url": "https//gitea.vylpes.xyz/External/card-drop/issues", "email": "helpdesk@vylpes.com" }, "homepage": "https://gitea.vylpes.xyz/External/card-drop", "funding": "https://ko-fi.com/vylpes", "dependencies": { "@discordjs/rest": "^2.0.0", - "@types/clone-deep": "^4.0.4", - "@types/express": "^5.0.0", - "@types/jest": "^29.5.14", - "@types/uuid": "^10.0.0", - "axios": "^1.8.4", + "@types/express": "^4.17.20", + "@types/jest": "^29.0.0", + "@types/uuid": "^9.0.0", "body-parser": "^1.20.2", - "canvas": "^2.11.2", - "clone-deep": "^4.0.1", - "cron": "^3.1.7", - "discord.js": "^14.16.3", + "discord.js": "^14.3.0", "dotenv": "^16.0.0", "express": "^4.18.2", - "fuse.js": "^7.0.0", - "glob": "^11.0.0", "jest": "^29.0.0", "jest-mock-extended": "^3.0.0", - "jimp": "^1.6.0", - "minimatch": "9.0.5", + "minimatch": "9.0.3", "mysql": "^2.18.1", + "sqlite3": "^5.1.6", "ts-jest": "^29.0.0", - "typeorm": "0.3.20", - "winston": "^3.15.0", - "winston-daily-rotate-file": "^5.0.0", - "winston-discord-transport": "^1.3.0" + "typeorm": "0.3.17" + }, + "resolutions": { + "**/undici": "^5.26.2" }, - "resolutions": {}, "devDependencies": { - "@types/node": "^22.8.1", - "@typescript-eslint/eslint-plugin": "^8.11.0", - "@typescript-eslint/parser": "^8.11.0", - "eslint": "^9.13.0", - "np": "^10.0.7", - "typescript": "^5.0.0", - "typescript-eslint": "^8.11.0" + "@types/node": "^20.0.0", + "np": "^8.0.4", + "typescript": "^5.0.0" } } diff --git a/renovate.json b/renovate.json index 7fa351c..e36bf04 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,4 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "baseBranches": ["develop"], - "labels": ["type/dependencies"] + "baseBranches": ["develop"] } diff --git a/scripts/deploy_prod.sh b/scripts/deploy_prod.sh index 84f35c6..c768956 100644 --- a/scripts/deploy_prod.sh +++ b/scripts/deploy_prod.sh @@ -3,8 +3,21 @@ export PATH="$HOME/.yarn/bin:$PATH" export PATH="$HOME/.nodeuse/bin:$PATH" -cd ~/apps/card-drop/card-drop_prod -docker compose --file docker-compose.prod.yml up -d -sleep 10 -cp .prod.env .env -pm2 restart card-drop_prod || pm2 start --name card-drop_prod dist/bot.js \ No newline at end of file +export BOT_TOKEN=$(cat $HOME/scripts/card-drop/prod_key.txt) + +cd ~/apps/card-drop/card-drop_prod \ +&& git checkout main \ +&& git fetch \ +&& git pull \ +&& docker compose --file docker-compose.prod.yml down \ +&& (pm2 stop card-drop_prod || true) \ +&& (pm2 delete card-drop_prod || true) \ +&& cp .prod.env .env \ +&& yarn clean \ +&& yarn install --frozen-lockfile \ +&& yarn build \ +&& docker compose --file docker-compose.prod.yml up -d \ +&& echo "Sleeping for 10 seconds to let database load..." \ +&& sleep 10 \ +&& yarn run db:up \ +&& NODE_ENV=production pm2 start --name card-drop_prod dist/bot.js \ No newline at end of file diff --git a/scripts/deploy_stage.sh b/scripts/deploy_stage.sh index 9287b53..5638ba7 100644 --- a/scripts/deploy_stage.sh +++ b/scripts/deploy_stage.sh @@ -3,8 +3,21 @@ export PATH="$HOME/.yarn/bin:$PATH" export PATH="$HOME/.nodeuse/bin:$PATH" -cd ~/apps/card-drop/card-drop_stage -docker compose --file docker-compose.stage.yml up -d -sleep 10 -cp .stage.env .env -pm2 restart card-drop_stage || pm2 start --name card-drop_stage dist/bot.js \ No newline at end of file +export BOT_TOKEN=$(cat $HOME/scripts/card-drop/stage_key.txt) + +cd ~/apps/card-drop/card-drop_stage \ +&& git checkout develop \ +&& git fetch \ +&& git pull \ +&& docker compose --file docker-compose.stage.yml down \ +&& (pm2 stop card-drop_stage || true) \ +&& (pm2 delete card-drop_stage || true) \ +&& cp .stage.env .env \ +&& yarn clean \ +&& yarn install --frozen-lockfile \ +&& yarn build \ +&& docker compose --file docker-compose.stage.yml up -d \ +&& echo "Sleeping for 10 seconds to let database load..." \ +&& sleep 10 \ +&& yarn run db:up \ +&& NODE_ENV=production pm2 start --name card-drop_stage dist/bot.js \ No newline at end of file diff --git a/src/Functions/CardMetadataFunction.ts b/src/Functions/CardMetadataFunction.ts deleted file mode 100644 index 9b10665..0000000 --- a/src/Functions/CardMetadataFunction.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { readFileSync } from "fs"; -import path from "path"; -import Config from "../database/entities/app/Config"; -import { glob } from "glob"; -import { SeriesMetadata } from "../contracts/SeriesMetadata"; -import { CoreClient } from "../client/client"; -import AppLogger from "../client/appLogger"; -import {CardRarity} from "../constants/CardRarity"; - -export interface CardMetadataResult { - IsSuccess: boolean; - ErrorMessage?: string; -} - -export interface FindMetadataResult { - IsSuccess: boolean; - Result?: SeriesMetadata[]; - Error?: { - File: string; - Message: string; - }; -} - -export default class CardMetadataFunction { - public static async Execute(overrideSafeMode: boolean = false): Promise { - AppLogger.LogInfo("Functions/CardMetadataFunction", "Executing"); - - if (!overrideSafeMode && await Config.GetValue("safemode") == "true") { - AppLogger.LogWarn("Functions/CardMetadataFunction", "Safe Mode is active, refusing to resync"); - - return { - IsSuccess: false, - ErrorMessage: "Safe mode is on and not overridden", - }; - } - - const cardResult = await this.FindMetadataJSONs(); - - if (cardResult.IsSuccess) { - CoreClient.Cards = cardResult.Result!; - - const allCards = CoreClient.Cards.flatMap(x => x.cards); - - const totalCards = allCards.length; - const bronzeCards = allCards.filter(x => x.type == CardRarity.Bronze) - .length; - const silverCards = allCards.filter(x => x.type == CardRarity.Silver) - .length; - const goldCards = allCards.filter(x => x.type == CardRarity.Gold) - .length; - const mangaCards = allCards.filter(x => x.type == CardRarity.Manga) - .length; - const legendaryCards = allCards.filter(x => x.type == CardRarity.Legendary) - .length; - - AppLogger.LogInfo("Functions/CardMetadataFunction", `Loaded ${totalCards} cards to database (${bronzeCards} bronze, ${silverCards} silver, ${goldCards} gold, ${mangaCards} manga, ${legendaryCards} legendary)`); - - const duplicateCards = CoreClient.Cards.flatMap(x => x.cards) - .filter((card, index, self) => self.findIndex(c => c.id === card.id) !== index); - - if (duplicateCards.length > 0) { - AppLogger.LogWarn("Functions/CardMetadataFunction", `Duplicate card ids found: ${duplicateCards.flatMap(x => x.id).join(", ")}`); - } - - return { - IsSuccess: true, - }; - } - - await Config.SetValue("safemode", "true"); - AppLogger.LogError("Functions/CardMetadataFunction", `Safe Mode activated due to error: ${cardResult.Error!.Message}`); - - return { - IsSuccess: false, - ErrorMessage: `${cardResult.Error!.File}: ${cardResult.Error!.Message}`, - }; - } - - private static async FindMetadataJSONs(): Promise { - const res: SeriesMetadata[] = []; - - const seriesJSONs = await glob(path.join(process.env.DATA_DIR!, "cards", "/**/*.json")); - - for (const jsonPath of seriesJSONs) { - try { - AppLogger.LogVerbose("Functions/CardMetadataFunction", `Reading file ${jsonPath}`); - const jsonFile = readFileSync(jsonPath); - const parsedJson: SeriesMetadata[] = JSON.parse(jsonFile.toString()); - - res.push(...parsedJson); - } catch (e) { - AppLogger.LogError("Functions/CardMetadataFunction", `Error reading file ${jsonPath}: ${e}`); - - return { - IsSuccess: false, - Error: { - File: jsonPath, - Message: `${e}`, - } - }; - } - } - - return { - IsSuccess: true, - Result: res, - }; - } -} \ No newline at end of file diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts new file mode 100644 index 0000000..037b87b --- /dev/null +++ b/src/Functions/CardSetupFunction.ts @@ -0,0 +1,102 @@ +import { existsSync, readdirSync } from "fs"; +import CardDataSource from "../database/dataSources/cardDataSource"; +import Card from "../database/entities/card/Card"; +import Series from "../database/entities/card/Series"; +import path from "path"; +import { CardRarity, CardRarityToString } from "../constants/CardRarity"; +import Config from "../database/entities/app/Config"; + +export default class CardSetupFunction { + public static async Execute() { + 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() { + const cardRepository = CardDataSource.getRepository(Card); + await cardRepository.clear(); + + const seriesRepository = CardDataSource.getRepository(Series); + await seriesRepository.clear(); + } + + private static async ReadSeries() { + const seriesDir = readdirSync(path.join(process.cwd(), 'cards')); + + const seriesRepository = CardDataSource.getRepository(Series); + + const seriesToSave: Series[] = []; + + for (let dir of seriesDir) { + const dirPart = dir.split(' '); + + const seriesId = dirPart.shift(); + const seriesName = dirPart.join(' '); + + const series = new Series(seriesId!, seriesName, dir); + + seriesToSave.push(series); + } + + await seriesRepository.save(seriesToSave); + } + + private static async ReadCards() { + const loadedSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]); + + const cardRepository = CardDataSource.getRepository(Card); + + const cardsToSave: Card[] = []; + + for (let series of loadedSeries) { + const cardDirBronze = this.GetCardFiles(CardRarity.Bronze, series); + const cardDirGold = this.GetCardFiles(CardRarity.Gold, series); + const cardDirLegendary = this.GetCardFiles(CardRarity.Legendary, series); + const cardDirSilver = this.GetCardFiles(CardRarity.Silver, series); + const cardDirManga = this.GetCardFiles(CardRarity.Manga, series); + + cardsToSave.push( + ...this.GenerateCardData(cardDirBronze, CardRarity.Bronze, series), + ...this.GenerateCardData(cardDirGold, CardRarity.Gold, series), + ...this.GenerateCardData(cardDirLegendary, CardRarity.Legendary, series), + ...this.GenerateCardData(cardDirSilver, CardRarity.Silver, series), + ...this.GenerateCardData(cardDirManga, CardRarity.Manga, series) + ); + } + + await cardRepository.save(cardsToSave); + + console.log(`Loaded ${cardsToSave.length} cards to database`); + } + + private static GenerateCardData(files: string[], rarity: CardRarity, series: Series): Card[] { + const result: Card[] = []; + + for (let file of files.filter(x => !x.startsWith('.') && (x.endsWith('.png') || x.endsWith('.jpg') || x.endsWith('.gif')))) { + const filePart = file.split('.'); + + const cardId = filePart[0]; + const cardName = filePart[0]; + + const card = new Card(cardId, cardName, rarity, path.join(process.cwd(), 'cards', series.Path, CardRarityToString(rarity).toUpperCase(), file), file, series); + + result.push(card); + } + + return result; + } + + private static GetCardFiles(rarity: CardRarity, series: Series): string[] { + const folder = path.join(process.cwd(), 'cards', series.Path, CardRarityToString(rarity).toUpperCase()); + const folderExists = existsSync(folder); + + return folderExists ? readdirSync(folder) : []; + } +} \ No newline at end of file diff --git a/src/bot.ts b/src/bot.ts index 871b927..8bddbf4 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -14,8 +14,6 @@ const requiredConfigs: string[] = [ "BOT_OWNERID", "BOT_CLIENTID", "BOT_ENV", - "BOT_ADMINS", - "DATA_DIR", "DB_HOST", "DB_PORT", "DB_AUTH_USER", @@ -23,7 +21,8 @@ const requiredConfigs: string[] = [ "DB_SYNC", "DB_LOGGING", "EXPRESS_PORT", -]; + "GDRIVESYNC_WHITELIST", +] requiredConfigs.forEach(config => { if (!process.env[config]) { @@ -37,10 +36,10 @@ const client = new CoreClient([ ]); Registry.RegisterCommands(); +Registry.RegisterEvents(); Registry.RegisterButtonEvents(); -Registry.RegisterStringDropdownEvents(); -if (!existsSync(`${process.env.DATA_DIR}/cards`) && process.env.GDRIVESYNC_AUTO && process.env.GDRIVESYNC_AUTO == "true") { +if (!existsSync(`${process.cwd()}/cards`) && process.env.GDRIVESYNC_AUTO && process.env.GDRIVESYNC_AUTO == 'true') { console.log("Card directory not found, syncing..."); CoreClient.AllowDrops = false; @@ -50,7 +49,7 @@ if (!existsSync(`${process.env.DATA_DIR}/cards`) && process.env.GDRIVESYNC_AUTO console.error(error.code); throw `Error while running sync command. Code: ${error.code}`; } else { - console.log("Synced successfully."); + console.log('Synced successfully.'); CoreClient.AllowDrops = true; } }); diff --git a/src/buttonEvents/Claim.ts b/src/buttonEvents/Claim.ts index d139f42..0db89fe 100644 --- a/src/buttonEvents/Claim.ts +++ b/src/buttonEvents/Claim.ts @@ -1,44 +1,27 @@ import { ButtonInteraction } from "discord.js"; import { ButtonEvent } from "../type/buttonEvent"; import Inventory from "../database/entities/app/Inventory"; +import { CoreClient } from "../client/client"; import { default as eClaim } from "../database/entities/app/Claim"; -import AppLogger from "../client/appLogger"; -import User from "../database/entities/app/User"; -import CardConstants from "../constants/CardConstants"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; -import DropEmbedHelper from "../helpers/DropHelpers/DropEmbedHelper"; export default class Claim extends ButtonEvent { public override async execute(interaction: ButtonInteraction) { if (!interaction.guild || !interaction.guildId) return; - if (!interaction.channel) return; - if (!interaction.channel.isSendable()) return; - await interaction.deferUpdate(); - - const cardNumber = interaction.customId.split(" ")[1]; - const claimId = interaction.customId.split(" ")[2]; - const droppedBy = interaction.customId.split(" ")[3]; + const cardNumber = interaction.customId.split(' ')[1]; + const claimId = interaction.customId.split(' ')[2]; + const droppedBy = interaction.customId.split(' ')[3]; const userId = interaction.user.id; - const whenDropped = interaction.message.createdAt; - const lastClaimableDate = new Date(Date.now() - (1000 * 60 * 2)); // 2 minutes ago - - if (whenDropped < lastClaimableDate) { - await interaction.channel.send(`${interaction.user}, Cards can only be claimed within 2 minutes of it being dropped!`); - return; - } - - AppLogger.LogSilly("Button/Claim", `Parameters: cardNumber=${cardNumber}, claimId=${claimId}, droppedBy=${droppedBy}, userId=${userId}`); - - const user = await User.FetchOneById(User, userId) || new User(userId, CardConstants.StartingCurrency); - - AppLogger.LogSilly("Button/Claim", `${user.Id} has ${user.Currency} currency`); - const claimed = await eClaim.FetchOneByClaimId(claimId); if (claimed) { - await interaction.channel.send(`${interaction.user}, This card has already been claimed!`); + await interaction.reply('This card has already been claimed'); + return; + } + + if (claimId == CoreClient.ClaimId && userId != droppedBy) { + await interaction.reply('The latest dropped card can only be claimed by the user who dropped it'); return; } @@ -47,7 +30,7 @@ export default class Claim extends ButtonEvent { if (!inventory) { inventory = new Inventory(userId, cardNumber, 1); } else { - inventory.AddQuantity(1); + inventory.SetQuantity(inventory.Quantity + 1); } await inventory.Save(Inventory, inventory); @@ -57,22 +40,6 @@ export default class Claim extends ButtonEvent { await claim.Save(eClaim, claim); - const card = GetCardsHelper.GetCardByCardNumber(cardNumber); - - if (!card) { - AppLogger.LogError("Button/Claim", `Unable to find card, ${cardNumber}`); - - return; - } - - const imageFileName = card.card.path.split("/").pop()!; - - const embed = DropEmbedHelper.GenerateDropEmbed(card, inventory.Quantity, imageFileName, interaction.user.username, user.Currency); - const row = DropEmbedHelper.GenerateDropButtons(card, claimId, interaction.user.id, true); - - await interaction.editReply({ - embeds: [ embed ], - components: [ row ], - }); + await interaction.reply(`Card claimed by ${interaction.user}`); } -} +} \ No newline at end of file diff --git a/src/buttonEvents/Effects.ts b/src/buttonEvents/Effects.ts deleted file mode 100644 index cd1a765..0000000 --- a/src/buttonEvents/Effects.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ButtonInteraction } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import List from "./Effects/List"; -import Use from "./Effects/Use"; -import AppLogger from "../client/appLogger"; -import Buy from "./Effects/Buy"; - -export default class Effects extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const action = interaction.customId.split(" ")[1]; - - switch (action) { - case "list": - await List(interaction); - break; - case "use": - await Use.Execute(interaction); - break; - case "buy": - await Buy.Execute(interaction); - break; - default: - AppLogger.LogError("Buttons/Effects", `Unknown action, ${action}`); - } - } -} diff --git a/src/buttonEvents/Effects/Buy.ts b/src/buttonEvents/Effects/Buy.ts deleted file mode 100644 index 49cc75f..0000000 --- a/src/buttonEvents/Effects/Buy.ts +++ /dev/null @@ -1,120 +0,0 @@ -import {ButtonInteraction} from "discord.js"; -import AppLogger from "../../client/appLogger"; -import EffectHelper from "../../helpers/EffectHelper"; -import EmbedColours from "../../constants/EmbedColours"; -import User from "../../database/entities/app/User"; -import {EffectDetails} from "../../constants/EffectDetails"; - -export default class Buy { - public static async Execute(interaction: ButtonInteraction) { - const subaction = interaction.customId.split(" ")[2]; - - switch (subaction) { - case "confirm": - await this.Confirm(interaction); - break; - case "cancel": - await this.Cancel(interaction); - break; - default: - AppLogger.LogError("Buy", `Unknown subaction, effects ${subaction}`); - } - } - - private static async Confirm(interaction: ButtonInteraction) { - const id = interaction.customId.split(" ")[3]; - const quantity = interaction.customId.split(" ")[4]; - - if (!id || !quantity) { - AppLogger.LogError("Buy Confirm", "Not enough parameters"); - return; - } - - const effectDetail = EffectDetails.get(id); - - if (!effectDetail) { - AppLogger.LogError("Buy Confirm", "Effect detail not found!"); - return; - } - - const quantityNumber = Number(quantity); - - if (!quantityNumber || quantityNumber < 1) { - AppLogger.LogError("Buy Confirm", "Invalid number"); - return; - } - - const totalCost = effectDetail.cost * quantityNumber; - - const user = await User.FetchOneById(User, interaction.user.id); - - if (!user) { - AppLogger.LogError("Buy Confirm", "Unable to find user"); - return; - } - - if (user.Currency < totalCost) { - interaction.reply(`You don't have enough currency to buy this! You have \`${user.Currency} Currency\` and need \`${totalCost} Currency\`!`); - return; - } - - user.RemoveCurrency(totalCost); - await user.Save(User, user); - - await EffectHelper.AddEffectToUserInventory(interaction.user.id, id, quantityNumber); - - const generatedEmbed = await EffectHelper.GenerateEffectBuyEmbed(interaction.user.id, id, quantityNumber, true); - - if (typeof generatedEmbed == "string") { - await interaction.reply(generatedEmbed); - return; - } - - generatedEmbed.embed.setColor(EmbedColours.Success); - generatedEmbed.embed.setFooter({ text: "Purchased" }); - - await interaction.update({ - embeds: [ generatedEmbed.embed ], - components: [ generatedEmbed.row ], - }); - } - - private static async Cancel(interaction: ButtonInteraction) { - const id = interaction.customId.split(" ")[3]; - const quantity = interaction.customId.split(" ")[4]; - - if (!id || !quantity) { - AppLogger.LogError("Buy Cancel", "Not enough parameters"); - return; - } - - const effectDetail = EffectDetails.get(id); - - if (!effectDetail) { - AppLogger.LogError("Buy Cancel", "Effect detail not found!"); - return; - } - - const quantityNumber = Number(quantity); - - if (!quantityNumber || quantityNumber < 1) { - AppLogger.LogError("Buy Cancel", "Invalid number"); - return; - } - - const generatedEmbed = await EffectHelper.GenerateEffectBuyEmbed(interaction.user.id, id, quantityNumber, true); - - if (typeof generatedEmbed == "string") { - await interaction.reply(generatedEmbed); - return; - } - - generatedEmbed.embed.setColor(EmbedColours.Error); - generatedEmbed.embed.setFooter({ text: "Cancelled" }); - - await interaction.update({ - embeds: [ generatedEmbed.embed ], - components: [ generatedEmbed.row ], - }); - } -} diff --git a/src/buttonEvents/Effects/List.ts b/src/buttonEvents/Effects/List.ts deleted file mode 100644 index d86dfce..0000000 --- a/src/buttonEvents/Effects/List.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ButtonInteraction } from "discord.js"; -import EffectHelper from "../../helpers/EffectHelper"; - -export default async function List(interaction: ButtonInteraction) { - const pageOption = interaction.customId.split(" ")[2]; - - const page = Number(pageOption); - - if (!page) { - await interaction.reply("Page option is not a valid number"); - return; - } - - const result = await EffectHelper.GenerateEffectListEmbed(interaction.user.id, page); - - await interaction.update({ - embeds: [ result.embed ], - components: [ result.row ], - }); -} \ No newline at end of file diff --git a/src/buttonEvents/Effects/Use.ts b/src/buttonEvents/Effects/Use.ts deleted file mode 100644 index 5bfe2fd..0000000 --- a/src/buttonEvents/Effects/Use.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from "discord.js"; -import { EffectDetails } from "../../constants/EffectDetails"; -import EffectHelper from "../../helpers/EffectHelper"; -import EmbedColours from "../../constants/EmbedColours"; -import TimeLengthInput from "../../helpers/TimeLengthInput"; -import AppLogger from "../../client/appLogger"; - -export default class Use { - public static async Execute(interaction: ButtonInteraction) { - const subaction = interaction.customId.split(" ")[2]; - - switch (subaction) { - case "confirm": - await this.UseConfirm(interaction); - break; - case "cancel": - await this.UseCancel(interaction); - break; - } - } - - private static async UseConfirm(interaction: ButtonInteraction) { - const id = interaction.customId.split(" ")[3]; - - const effectDetail = EffectDetails.get(id); - - if (!effectDetail) { - AppLogger.LogError("Button/Effects/Use", `Effect not found, ${id}`); - - await interaction.reply("Effect not found in system!"); - return; - } - - const now = new Date(); - - const whenExpires = new Date(now.getTime() + effectDetail.duration); - - const result = await EffectHelper.UseEffect(interaction.user.id, id, whenExpires); - - if (!result) { - await interaction.reply("Unable to use effect! Please make sure you have it in your inventory and is not on cooldown"); - return; - } - - const embed = new EmbedBuilder() - .setTitle("Effect Used") - .setDescription("You now have an active effect!") - .setColor(EmbedColours.Green) - .addFields([ - { - name: "Effect", - value: effectDetail.friendlyName, - inline: true, - }, - { - name: "Expires", - value: ``, - inline: true, - }, - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setLabel("Confirm") - .setCustomId(`effects use confirm ${effectDetail.id}`) - .setStyle(ButtonStyle.Primary) - .setDisabled(true), - new ButtonBuilder() - .setLabel("Cancel") - .setCustomId(`effects use cancel ${effectDetail.id}`) - .setStyle(ButtonStyle.Danger) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - }); - } - - private static async UseCancel(interaction: ButtonInteraction) { - const id = interaction.customId.split(" ")[3]; - - const effectDetail = EffectDetails.get(id); - - if (!effectDetail) { - AppLogger.LogError("Button/Effects/Cancel", `Effect not found, ${id}`); - - await interaction.reply("Effect not found in system!"); - return; - } - - const timeLengthInput = TimeLengthInput.ConvertFromMilliseconds(effectDetail.duration); - - const embed = new EmbedBuilder() - .setTitle("Effect Use Cancelled") - .setDescription("The effect from your inventory has not been used") - .setColor(EmbedColours.Grey) - .addFields([ - { - name: "Effect", - value: effectDetail.friendlyName, - inline: true, - }, - { - name: "Expires", - value: timeLengthInput.GetLengthShort(), - inline: true, - }, - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setLabel("Confirm") - .setCustomId(`effects use confirm ${effectDetail.id}`) - .setStyle(ButtonStyle.Primary) - .setDisabled(true), - new ButtonBuilder() - .setLabel("Cancel") - .setCustomId(`effects use cancel ${effectDetail.id}`) - .setStyle(ButtonStyle.Danger) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - }); - } -} diff --git a/src/buttonEvents/Inventory.ts b/src/buttonEvents/Inventory.ts deleted file mode 100644 index 73c7019..0000000 --- a/src/buttonEvents/Inventory.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ButtonInteraction } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import InventoryHelper from "../helpers/InventoryHelper"; -import AppLogger from "../client/appLogger"; - -export default class Inventory extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - if (!interaction.guild) return; - - const userid = interaction.customId.split(" ")[1]; - const page = interaction.customId.split(" ")[2]; - - AppLogger.LogSilly("Button/Inventory", `Parameters: userid=${userid}, page=${page}`); - - await interaction.deferUpdate(); - - const member = interaction.guild.members.cache.find(x => x.id == userid) || await interaction.guild.members.fetch(userid); - - if (!member) { - await interaction.reply("Unable to find user."); - return; - } - - try { - AppLogger.LogVerbose("Button/Inventory", `Generating inventory page ${page} for ${member.user.username} with id ${member.user.id}`); - - const embed = await InventoryHelper.GenerateInventoryPage(member.user.username, member.user.id, Number(page)); - - if (!embed) { - await interaction.followUp("No page for user found."); - return; - } - - await interaction.editReply({ - files: [ embed.image ], - embeds: [ embed.embed ], - components: [ embed.row1, embed.row2 ], - }); - } catch (e) { - AppLogger.LogError("Button/Inventory", `Error generating inventory page for ${member.user.username} with id ${member.user.id}: ${e}`); - - await interaction.followUp("An error has occurred running this command."); - } - } -} diff --git a/src/buttonEvents/Multidrop.ts b/src/buttonEvents/Multidrop.ts deleted file mode 100644 index e88d6ef..0000000 --- a/src/buttonEvents/Multidrop.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { AttachmentBuilder, ButtonInteraction, EmbedBuilder } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import AppLogger from "../client/appLogger"; -import Inventory from "../database/entities/app/Inventory"; -import EmbedColours from "../constants/EmbedColours"; -import { readFileSync } from "fs"; -import path from "path"; -import ErrorMessages from "../constants/ErrorMessages"; -import User from "../database/entities/app/User"; -import { GetSacrificeAmount } from "../constants/CardRarity"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; -import MultidropEmbedHelper from "../helpers/DropHelpers/MultidropEmbedHelper"; - -export default class Multidrop extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const action = interaction.customId.split(" ")[1]; - - switch (action) { - case "keep": - await this.Keep(interaction); - break; - case "sacrifice": - await this.Sacrifice(interaction); - break; - default: - await interaction.reply("Invalid action"); - AppLogger.LogError("Button/Multidrop", `Invalid action, ${action}`); - } - } - - private async Keep(interaction: ButtonInteraction) { - const cardNumber = interaction.customId.split(" ")[2]; - let cardsRemaining = Number(interaction.customId.split(" ")[3]) || 0; - const userId = interaction.customId.split(" ")[4]; - - if (interaction.user.id != userId) { - await interaction.reply("You're not the user this drop was made for!"); - return; - } - - const card = GetCardsHelper.GetCardByCardNumber(cardNumber); - - if (!card) { - await interaction.reply("Unable to find card."); - AppLogger.LogWarn("Button/Multidrop/Keep", `Card not found, ${cardNumber}`); - return; - } - - if (cardsRemaining < 0) { - await interaction.reply("Your multidrop has ran out! Please buy a new one!"); - return; - } - - const user = await User.FetchOneById(User, interaction.user.id); - - if (!user) { - AppLogger.LogWarn("Button/Multidrop/Keep", ErrorMessages.UnableToFetchUser); - await interaction.reply(ErrorMessages.UnableToFetchUser); - return; - } - - // Claim - let inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, cardNumber); - - if (!inventory) { - inventory = new Inventory(interaction.user.id, cardNumber, 1); - } else { - inventory.AddQuantity(1); - } - - await inventory.Save(Inventory, inventory); - - // Pack has ran out - if (cardsRemaining == 0) { - const embed = new EmbedBuilder() - .setDescription("Your multidrop has ran out! Please buy a new one!") - .setColor(EmbedColours.Ok); - - await interaction.update({ - embeds: [ embed ], - attachments: [], - components: [], - }); - - return; - } - - // Drop next card - const randomCard = GetCardsHelper.GetRandomCard(); - cardsRemaining -= 1; - - if (!randomCard) { - AppLogger.LogWarn("Button/Multidrop/Keep", ErrorMessages.UnableToFetchCard); - await interaction.reply(ErrorMessages.UnableToFetchCard); - return; - } - - await interaction.deferUpdate(); - - try { - const files = []; - let imageFileName = ""; - - if (!(randomCard.card.path.startsWith("http://") || randomCard.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", randomCard.card.path)); - imageFileName = randomCard.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = MultidropEmbedHelper.GenerateMultidropEmbed(randomCard, quantityClaimed, imageFileName, cardsRemaining, undefined, user.Currency); - - const row = MultidropEmbedHelper.GenerateMultidropButtons(randomCard, cardsRemaining, interaction.user.id, cardsRemaining < 0); - - await interaction.editReply({ - embeds: [ embed ], - files: files, - components: [ row ], - }); - } catch (e) { - AppLogger.LogError("Button/Multidrop/Keep", `Error sending next drop for card ${randomCard.card.id}: ${e}`); - - await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. (${randomCard.card.id})`); - } - } - - private async Sacrifice(interaction: ButtonInteraction) { - const cardNumber = interaction.customId.split(" ")[2]; - let cardsRemaining = Number(interaction.customId.split(" ")[3]) || 0; - const userId = interaction.customId.split(" ")[4]; - - if (interaction.user.id != userId) { - await interaction.reply("You're not the user this drop was made for!"); - return; - } - - const card = GetCardsHelper.GetCardByCardNumber(cardNumber); - - if (!card) { - await interaction.reply("Unable to find card."); - AppLogger.LogWarn("Button/Multidrop/Sacrifice", `Card not found, ${cardNumber}`); - return; - } - - if (cardsRemaining < 0) { - await interaction.reply("Your multidrop has ran out! Please buy a new one!"); - return; - } - - const user = await User.FetchOneById(User, interaction.user.id); - - if (!user) { - AppLogger.LogWarn("Button/Multidrop/Sacrifice", ErrorMessages.UnableToFetchUser); - await interaction.reply(ErrorMessages.UnableToFetchUser); - return; - } - - // Sacrifice - const sacrificeAmount = GetSacrificeAmount(card.card.type); - - user.AddCurrency(sacrificeAmount); - - await user.Save(User, user); - - // Pack has ran out - if (cardsRemaining == 0) { - const embed = new EmbedBuilder() - .setDescription("Your multidrop has ran out! Please buy a new one!") - .setColor(EmbedColours.Ok); - - await interaction.update({ - embeds: [ embed ], - attachments: [], - components: [], - }); - - return; - } - - // Drop next card - const randomCard = GetCardsHelper.GetRandomCard(); - cardsRemaining -= 1; - - if (!randomCard) { - AppLogger.LogWarn("Button/Multidrop/Sacrifice", ErrorMessages.UnableToFetchCard); - await interaction.reply(ErrorMessages.UnableToFetchCard); - return; - } - - await interaction.deferUpdate(); - - try { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", randomCard.card.path)); - const imageFileName = randomCard.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = MultidropEmbedHelper.GenerateMultidropEmbed(randomCard, quantityClaimed, imageFileName, cardsRemaining, undefined, user.Currency); - - const row = MultidropEmbedHelper.GenerateMultidropButtons(randomCard, cardsRemaining, interaction.user.id, cardsRemaining < 0); - - await interaction.editReply({ - embeds: [ embed ], - files: [ attachment ], - components: [ row ], - }); - } catch (e) { - AppLogger.LogError("Button/Multidrop/Sacrifice", `Error sending next drop for card ${randomCard.card.id}: ${e}`); - - await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. (${randomCard.card.id})`); - } - } -} \ No newline at end of file diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index 6ad855e..38cae08 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -1,98 +1,64 @@ -import { AttachmentBuilder, ButtonInteraction } 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 { v4 } from "uuid"; import { CoreClient } from "../client/client"; import Inventory from "../database/entities/app/Inventory"; import Config from "../database/entities/app/Config"; -import path from "path"; -import AppLogger from "../client/appLogger"; -import User from "../database/entities/app/User"; -import CardConstants from "../constants/CardConstants"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; -import DropEmbedHelper from "../helpers/DropHelpers/DropEmbedHelper"; -import {DropResult} from "../contracts/SeriesMetadata"; 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."); + await interaction.reply('Bot is currently syncing, please wait until its done.'); return; } - if (await Config.GetValue("safemode") == "true") { - AppLogger.LogWarn("Button/Reroll", "Safe Mode is active, refusing to send next drop."); - - await interaction.reply("Safe Mode has been activated, please resync to continue."); + if (await Config.GetValue('safemode') == "true") + { + await interaction.reply('Safe Mode has been activated, please resync to contunue.'); return; } - let user = await User.FetchOneById(User, interaction.user.id); + if (!interaction.guild || !interaction.guildId) return; - if (!user) { - user = new User(interaction.user.id, CardConstants.StartingCurrency); - await user.Save(User, user); + let randomCard = await CardDropHelper.GetRandomCard(); - AppLogger.LogInfo("Button/Reroll", `New user (${interaction.user.id}) saved to the database`); + if (process.env.DROP_RARITY && Number(process.env.DROP_RARITY) > 0) { + randomCard = await CardDropHelper.GetRandomCardByRarity(Number(process.env.DROP_RARITY)); } - if (!user.RemoveCurrency(CardConstants.ClaimCost)) { - await interaction.reply(`Not enough currency! You need ${CardConstants.ClaimCost} currency, you have ${user.Currency}!`); - return; - } - - let randomCard: DropResult | undefined; - - try { - randomCard = await GetCardsHelper.FetchCard(interaction.user.id); - } catch (e) { - AppLogger.CatchError("Button/Reroll", e); - - await interaction.reply("Unable to fetch card, please try again."); - } - - if (!randomCard) { - await interaction.reply("Unable to fetch card, please try again."); - return; - } + const image = readFileSync(randomCard.Path); await interaction.deferReply(); + const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); + + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); + const quantityClaimed = inventory ? inventory.Quantity : 0; + + const embed = CardDropHelper.GenerateDropEmbed(randomCard, quantityClaimed || 0); + + const claimId = v4(); + + const row = CardDropHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); + try { - AppLogger.LogVerbose("Button/Reroll", `Sending next drop: ${randomCard.card.id} (${randomCard.card.name})`); - - const files = []; - let imageFileName = ""; - - if (!(randomCard.card.path.startsWith("http://") || randomCard.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", randomCard.card.path)); - imageFileName = randomCard.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = DropEmbedHelper.GenerateDropEmbed(randomCard, quantityClaimed, imageFileName, undefined, user.Currency); - - const claimId = v4(); - - const row = DropEmbedHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); - - await user.Save(User, user); - await interaction.editReply({ embeds: [ embed ], - files: files, + files: [ attachment ], components: [ row ], }); } catch (e) { - AppLogger.LogError("Button/Reroll", `Error sending next drop for card ${randomCard.card.id}: ${e}`); + console.error(e); - await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. (${randomCard.card.id})`); + 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/buttonEvents/Sacrifice.ts b/src/buttonEvents/Sacrifice.ts deleted file mode 100644 index 1626cf6..0000000 --- a/src/buttonEvents/Sacrifice.ts +++ /dev/null @@ -1,247 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import Inventory from "../database/entities/app/Inventory"; -import { CardRarityToString, GetSacrificeAmount } from "../constants/CardRarity"; -import EmbedColours from "../constants/EmbedColours"; -import User from "../database/entities/app/User"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; -import CardConstants from "../constants/CardConstants"; - -export default class Sacrifice extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const subcommand = interaction.customId.split(" ")[1]; - - switch(subcommand) { - case "confirm": - await this.confirm(interaction); - break; - case "cancel": - await this.cancel(interaction); - break; - case "give": - await this.give(interaction); - } - } - - private async confirm(interaction: ButtonInteraction) { - const userId = interaction.customId.split(" ")[2]; - const cardNumber = interaction.customId.split(" ")[3]; - const quantity = Number(interaction.customId.split(" ")[4]) || 1; - - if (userId != interaction.user.id) { - await interaction.reply("Only the user who created this sacrifice can confirm it."); - return; - } - - const cardInInventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber); - - if (!cardInInventory || cardInInventory.Quantity == 0) { - await interaction.reply("Unable to find card in inventory."); - return; - } - - if (cardInInventory.Quantity < quantity) { - await interaction.reply("You can only sacrifice what you own."); - return; - } - - const cardData = GetCardsHelper.GetCardByCardNumber(cardNumber); - - if (!cardData) { - await interaction.reply("Unable to find card in the database."); - return; - } - - const user = await User.FetchOneById(User, userId); - - if (!user) { - await interaction.reply("Unable to find user in database."); - return; - } - - cardInInventory.RemoveQuantity(quantity); - - await cardInInventory.Save(Inventory, cardInInventory); - - const cardValue = GetSacrificeAmount(cardData.card.type) * quantity; - const cardRarityString = CardRarityToString(cardData.card.type); - - user.AddCurrency(cardValue); - - await user.Save(User, user); - - const description = [ - `Card: ${cardData.card.name}`, - `Series: ${cardData.series.name}`, - `Rarity: ${cardRarityString}`, - `Quantity Owned: ${cardInInventory.Quantity}`, - `Quantity To Sacrifice: ${quantity}`, - `Sacrifice Amount: ${cardValue}`, - ]; - - const embed = new EmbedBuilder() - .setTitle("Card Sacrificed") - .setDescription(description.join("\n")) - .setColor(EmbedColours.Green) - .setFooter({ text: `${interaction.user.username}` }); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`sacrifice confirm ${interaction.user.id} ${cardNumber}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("sacrifice cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - }); - } - - private async cancel(interaction: ButtonInteraction) { - const userId = interaction.customId.split(" ")[2]; - const cardNumber = interaction.customId.split(" ")[3]; - const quantity = Number(interaction.customId.split(" ")[4]) || 1; - - if (userId != interaction.user.id) { - await interaction.reply("Only the user who created this sacrifice can cancel it."); - return; - } - - const cardInInventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber); - - if (!cardInInventory || cardInInventory.Quantity == 0) { - await interaction.reply("Unable to find card in inventory."); - return; - } - - if (cardInInventory.Quantity < quantity) { - await interaction.reply("You can only sacrifice what you own."); - return; - } - - const cardData = GetCardsHelper.GetCardByCardNumber(cardNumber); - - if (!cardData) { - await interaction.reply("Unable to find card in the database."); - return; - } - - const cardValue = GetSacrificeAmount(cardData.card.type) * quantity; - const cardRarityString = CardRarityToString(cardData.card.type); - - const description = [ - `Card: ${cardData.card.name}`, - `Series: ${cardData.series.name}`, - `Rarity: ${cardRarityString}`, - `Quantity Owned: ${cardInInventory.Quantity}`, - `Quantity To Sacrifice: ${quantity}`, - `Sacrifice Amount: ${cardValue}`, - ]; - - const embed = new EmbedBuilder() - .setTitle("Sacrifice Cancelled") - .setDescription(description.join("\n")) - .setColor(EmbedColours.Grey) - .setFooter({ text: `${interaction.user.username}` }); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`sacrifice confirm ${interaction.user.id} ${cardNumber}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("sacrifice cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - }); - } - - private async give(interaction: ButtonInteraction) { - const userId = interaction.customId.split(" ")[2]; - const cardNumber = interaction.customId.split(" ")[3]; - const quantity = Number(interaction.customId.split(" ")[4]) || 1; - - if (userId != interaction.user.id) { - await interaction.reply("Only the user who created this sacrifice can confirm it."); - return; - } - - const cardData = GetCardsHelper.GetCardByCardNumber(cardNumber); - - if (!cardData) { - await interaction.reply("Unable to find card in the database."); - return; - } - - let user = await User.FetchOneById(User, userId); - - if (!user) { - user = new User(userId, CardConstants.StartingCurrency); - } - - const cardInInventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber); - let cardQuantity = 0; - - if (cardInInventory) { - cardQuantity = cardInInventory.Quantity; - } - - const cardValue = GetSacrificeAmount(cardData.card.type) * quantity; - const cardRarityString = CardRarityToString(cardData.card.type); - - user.AddCurrency(cardValue); - - await user.Save(User, user); - - const description = [ - `Card: ${cardData.card.name}`, - `Series: ${cardData.series.name}`, - `Rarity: ${cardRarityString}`, - `Quantity Owned: ${cardQuantity}`, - `Quantity To Sacrifice: ${quantity}`, - `Sacrifice Amount: ${cardValue}`, - ]; - - const embed = new EmbedBuilder() - .setTitle("Card Sacrificed") - .setDescription(description.join("\n")) - .setColor(EmbedColours.Green) - .setFooter({ text: `${interaction.user.username}` }); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`sacrifice confirm ${interaction.user.id} ${cardNumber}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("sacrifice cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - attachments: [], - }); - } -} \ No newline at end of file diff --git a/src/buttonEvents/Series.ts b/src/buttonEvents/Series.ts deleted file mode 100644 index 80e03cd..0000000 --- a/src/buttonEvents/Series.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { ButtonInteraction } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import AppLogger from "../client/appLogger"; -import SeriesHelper from "../helpers/SeriesHelper"; - -export default class Series extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const subaction = interaction.customId.split(" ")[1]; - - switch(subaction) { - case "view": - await this.ViewSeries(interaction); - break; - case "list": - await this.ListSeries(interaction); - break; - default: - AppLogger.LogWarn("Commands/Series", `Subaction doesn't exist: ${subaction}`); - interaction.reply("Subaction doesn't exist."); - } - } - - private async ViewSeries(interaction: ButtonInteraction) { - const seriesid = interaction.customId.split(" ")[2]; - const page = interaction.customId.split(" ")[3]; - - await interaction.deferUpdate(); - - const embed = await SeriesHelper.GenerateSeriesViewPage(Number(seriesid), Number(page), interaction.user.id); - - await interaction.editReply({ - embeds: [ embed!.embed ], - components: [ embed!.row ], - files: [ embed!.image ], - }); - } - - private async ListSeries(interaction: ButtonInteraction) { - const page = interaction.customId.split(" ")[2]; - - const embed = SeriesHelper.GenerateSeriesListPage(Number(page)); - - await interaction.update({ - embeds: [ embed!.embed ], - components: [ embed!.row ], - }); - } -} diff --git a/src/buttonEvents/Trade.ts b/src/buttonEvents/Trade.ts deleted file mode 100644 index fb8449d..0000000 --- a/src/buttonEvents/Trade.ts +++ /dev/null @@ -1,215 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import { CoreClient } from "../client/client"; -import Inventory from "../database/entities/app/Inventory"; -import EmbedColours from "../constants/EmbedColours"; -import AppLogger from "../client/appLogger"; - -export default class Trade extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const action = interaction.customId.split(" ")[1]; - - AppLogger.LogSilly("Button/Trade", `Parameters: action=${action}`); - - switch (action) { - case "accept": - await this.AcceptTrade(interaction); - break; - case "decline": - await this.DeclineTrade(interaction); - break; - } - } - - private async AcceptTrade(interaction: ButtonInteraction) { - const user1UserId = interaction.customId.split(" ")[2]; - const user2UserId = interaction.customId.split(" ")[3]; - const user1CardNumber = interaction.customId.split(" ")[4]; - const user2CardNumber = interaction.customId.split(" ")[5]; - const expiry = interaction.customId.split(" ")[6]; - const timeoutId = interaction.customId.split(" ")[7]; - const user1Quantity = Number(interaction.customId.split(" ")[8]) || 1; - const user2Quantity = Number(interaction.customId.split(" ")[9]) || 1; - - AppLogger.LogSilly("Button/Trade/AcceptTrade", `Parameters: user1UserId=${user1UserId}, user2UserId=${user2UserId}, user1CardNumber=${user1CardNumber}, user2CardNumber=${user2CardNumber}, expiry=${expiry}, timeoutId=${timeoutId} user1Quantity=${user1Quantity} user2Quantity=${user2Quantity}`); - - const expiryDate = new Date(expiry); - - if (expiryDate < new Date()) { - await interaction.reply("Trade has expired"); - return; - } - - if (interaction.user.id !== user2UserId) { - await interaction.reply("You are not the user who the trade is intended for"); - return; - } - - const user1Item = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id === user1CardNumber); - - const user2Item = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id === user2CardNumber); - - if (!user1Item || !user2Item) { - await interaction.reply("One or more of the items you are trying to trade does not exist."); - return; - } - - const user1User = interaction.client.users.cache.get(user1UserId) || await interaction.client.users.fetch(user1UserId); - const user2User = interaction.client.users.cache.get(user2UserId) || await interaction.client.users.fetch(user2UserId); - - const user1UserInventory1 = await Inventory.FetchOneByCardNumberAndUserId(user1UserId, user1CardNumber); - const user2UserInventory1 = await Inventory.FetchOneByCardNumberAndUserId(user2UserId, user2CardNumber); - - if (!user1UserInventory1 || !user2UserInventory1) { - await interaction.reply("One or more of the items you are trying to trade does not exist."); - return; - } - - if (user1UserInventory1.Quantity < user1Quantity || user2UserInventory1.Quantity < user2Quantity) { - await interaction.reply("One or more of the items you are trying to trade does not exist."); - return; - } - - user1UserInventory1.RemoveQuantity(user1Quantity); - user2UserInventory1.RemoveQuantity(user2Quantity); - - await user1UserInventory1.Save(Inventory, user1UserInventory1); - await user2UserInventory1.Save(Inventory, user2UserInventory1); - - let user1UserInventory2 = await Inventory.FetchOneByCardNumberAndUserId(user1UserId, user2CardNumber); - let user2UserInventory2 = await Inventory.FetchOneByCardNumberAndUserId(user2UserId, user1CardNumber); - - if (!user1UserInventory2) { - user1UserInventory2 = new Inventory(user1UserId, user2CardNumber, user2Quantity); - } else { - user1UserInventory2.AddQuantity(user2Quantity); - } - - if (!user2UserInventory2) { - user2UserInventory2 = new Inventory(user2UserId, user1CardNumber, user1Quantity); - } else { - user2UserInventory2.AddQuantity(user1Quantity); - } - - await user1UserInventory2.Save(Inventory, user1UserInventory2); - await user2UserInventory2.Save(Inventory, user2UserInventory2); - - clearTimeout(timeoutId); - - const tradeEmbed = new EmbedBuilder() - .setTitle("Trade Accepted") - .setDescription(`Trade initiated between ${user1User.username} and ${user2User.username}`) - .setColor(EmbedColours.Success) - .setImage("https://i.imgur.com/9w5f1ls.gif") - .addFields([ - { - name: `${user1User.username} Receives`, - value: `${user2Item.id}: ${user2Item.name} x${user2Quantity}`, - inline: true, - }, - { - name: `${user2User.username} Receives`, - value: `${user1Item.id}: ${user1Item.name} x${user1Quantity}`, - inline: true, - }, - { - name: "Complete", - value: new Date().toLocaleString(), - } - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId("trade expired accept") - .setLabel("Accept") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("trade expired decline") - .setLabel("Decline") - .setStyle(ButtonStyle.Danger) - .setDisabled(true), - ]); - - await interaction.update({ embeds: [ tradeEmbed ], components: [ row ]}); - } - - private async DeclineTrade(interaction: ButtonInteraction) { - const user1UserId = interaction.customId.split(" ")[2]; - const user2UserId = interaction.customId.split(" ")[3]; - const user1CardNumber = interaction.customId.split(" ")[4]; - const user2CardNumber = interaction.customId.split(" ")[5]; - // No need to get expiry date - const timeoutId = interaction.customId.split(" ")[7]; - const user1Quantity = Number(interaction.customId.split(" ")[8]) || 1; - const user2Quantity = Number(interaction.customId.split(" ")[9]) || 1; - - AppLogger.LogSilly("Button/Trade/DeclineTrade", `Parameters: user1UserId=${user1UserId}, user2UserId=${user2UserId}, user1CardNumber=${user1CardNumber}, user2CardNumber=${user2CardNumber}, timeoutId=${timeoutId}`); - - if (interaction.user.id != user1UserId && interaction.user.id !== user2UserId) { - await interaction.reply("You are not the user who the trade is intended for"); - return; - } - - const user1User = interaction.client.users.cache.get(user1UserId) || await interaction.client.users.fetch(user1UserId); - const user2User = interaction.client.users.cache.get(user2UserId) || await interaction.client.users.fetch(user2UserId); - - const user1Item = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id === user1CardNumber); - - const user2Item = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id === user2CardNumber); - - if (!user1Item || !user2Item) { - await interaction.reply("One or more of the items you are trying to trade does not exist."); - return; - } - - clearTimeout(timeoutId); - - const tradeEmbed = new EmbedBuilder() - .setTitle("Trade Declined") - .setDescription(`Trade initiated between ${user1User.username} and ${user2User.username}`) - .setColor(EmbedColours.Error) - .setImage("https://i.imgur.com/9w5f1ls.gif") - .addFields([ - { - name: `${user1User.username} Receives`, - value: `${user2Item.id}: ${user2Item.name} x${user2Quantity}`, - inline: true, - }, - { - name: `${user2User.username} Receives`, - value: `${user1Item.id}: ${user1Item.name} x${user1Quantity}`, - inline: true, - }, - { - name: "Declined", - value: new Date().toLocaleString(), - } - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId("trade expired accept") - .setLabel("Accept") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("trade expired decline") - .setLabel("Decline") - .setStyle(ButtonStyle.Danger) - .setDisabled(true), - ]); - - await interaction.update({ embeds: [ tradeEmbed ], components: [ row ]}); - } -} \ No newline at end of file diff --git a/src/buttonEvents/View.ts b/src/buttonEvents/View.ts deleted file mode 100644 index 007a911..0000000 --- a/src/buttonEvents/View.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {ButtonInteraction} from "discord.js"; -import {ButtonEvent} from "../type/buttonEvent.js"; -import CardSearchHelper from "../helpers/CardSearchHelper.js"; - -export default class View extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const page = interaction.customId.split(" ")[1]; - const results = interaction.customId.split(" ").splice(2); - - await interaction.deferUpdate(); - - const searchResult = await CardSearchHelper.GenerateSearchPageFromQuery(results, interaction.user.id, Number(page)); - - if (!searchResult) { - await interaction.followUp("No results found"); - return; - } - - await interaction.editReply({ - embeds: [ searchResult.embed ], - components: [ searchResult.row ], - files: searchResult.attachments, - }); - } -} diff --git a/src/client/appLogger.ts b/src/client/appLogger.ts deleted file mode 100644 index 6c33609..0000000 --- a/src/client/appLogger.ts +++ /dev/null @@ -1,97 +0,0 @@ -import path from "path"; -import { Logger, createLogger, format, transports } from "winston"; -import DailyRotateFile from "winston-daily-rotate-file"; -import DiscordTransport from "winston-discord-transport"; - -export default class AppLogger { - public static Logger: Logger; - - public static InitialiseLogger(logLevel: string, outputToConsole: boolean) { - const customFormat = format.printf(({ level, message, timestamp, label }) => { - return `${timestamp} [${label}] ${level}: ${message}`; - }); - - const logger = createLogger({ - level: logLevel, - format: format.combine( - format.timestamp({ - format: "YYYY-MM-DD HH:mm:ss" - }), - format.errors({ stack: true }), - format.splat(), - customFormat, - ), - defaultMeta: { service: "bot" }, - transports: [], - }); - - if (process.env.DATA_DIR) { - const logDir = path.join(process.env.DATA_DIR, "logs"); - - logger.add(new DailyRotateFile({ - filename: "bot-%DATE%.log", - dirname: logDir, - datePattern: "YYYY-MM-DD-HH", - maxSize: "20m", - maxFiles: "14d", - })); - } - - if (outputToConsole) { - logger.add(new transports.Console({ - format: format.combine( - format.colorize(), - format.timestamp(), - customFormat, - )})); - } - - if (process.env.BOT_LOG_DISCORD_ENABLE == "true") { - if (process.env.BOT_LOG_DISCORD_WEBHOOK) { - logger.add(new DiscordTransport({ - webhook: process.env.BOT_LOG_DISCORD_WEBHOOK.toString(), - defaultMeta: { service: process.env.BOT_LOG_DISCORD_SERVICE }, - level: process.env.BOT_LOG_DISCORD_LEVEL, - })); - } else { - throw "BOT_LOG_DISCORD_WEBHOOK is required to enable discord logger support."; - } - } - - AppLogger.Logger = logger; - - AppLogger.LogInfo("AppLogger", `Log Level: ${logLevel}`); - } - - public static LogError(label: string, message: string) { - AppLogger.Logger.error({ label, message }); - } - - public static LogWarn(label: string, message: string) { - AppLogger.Logger.warn({ label, message }); - } - - public static LogInfo(label: string, message: string) { - AppLogger.Logger.info({ label, message }); - } - - public static LogVerbose(label: string, message: string) { - AppLogger.Logger.verbose({ label, message }); - } - - public static LogDebug(label: string, message: string) { - AppLogger.Logger.debug({ label, message }); - } - - public static LogSilly(label: string, message: string) { - AppLogger.Logger.silly({ label, message }); - } - - public static CatchError(label: string, error: unknown) { - if (error instanceof Error) { - AppLogger.Logger.error({ label, message: error.message }); - } else { - AppLogger.Logger.error({ label, message: error }); - } - } -} diff --git a/src/client/client.ts b/src/client/client.ts index 57551fb..f909d19 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -1,113 +1,91 @@ -import { Client, DMChannel, Guild, GuildBan, GuildMember, Message, NonThreadGuildBasedChannel, PartialGuildMember, PartialMessage } from "discord.js"; +import { Client } from "discord.js"; import * as dotenv from "dotenv"; +import { EventType } from "../constants/EventType"; import ICommandItem from "../contracts/ICommandItem"; -import EventExecutors from "../contracts/EventExecutors"; +import IEventItem from "../contracts/IEventItem"; import { Command } from "../type/command"; import { Events } from "./events"; import { Util } from "./util"; -import IButtonEventItem from "../contracts/ButtonEventItem"; +import CardSetupFunction from "../Functions/CardSetupFunction"; +import CardDataSource from "../database/dataSources/cardDataSource"; +import IButtonEventItem from "../contracts/IButtonEventItem"; import { ButtonEvent } from "../type/buttonEvent"; import AppDataSource from "../database/dataSources/appDataSource"; import { Environment } from "../constants/Environment"; import Webhooks from "../webhooks"; -import CardMetadataFunction from "../Functions/CardMetadataFunction"; -import { SeriesMetadata } from "../contracts/SeriesMetadata"; -import AppLogger from "./appLogger"; -import TimerHelper from "../helpers/TimerHelper"; -import GiveCurrency from "../timers/GiveCurrency"; -import PurgeClaims from "../timers/PurgeClaims"; -import StringDropdownEventItem from "../contracts/StringDropdownEventItem"; -import {StringDropdownEvent} from "../type/stringDropdownEvent"; export class CoreClient extends Client { private static _commandItems: ICommandItem[]; - private static _eventExecutors: EventExecutors; + private static _eventItems: IEventItem[]; private static _buttonEvents: IButtonEventItem[]; - private static _stringDropdowns: StringDropdownEventItem[]; private _events: Events; private _util: Util; private _webhooks: Webhooks; - private _timerHelper: TimerHelper; + public static ClaimId: string; public static Environment: Environment; public static AllowDrops: boolean; - public static Cards: SeriesMetadata[]; public static get commandItems(): ICommandItem[] { return this._commandItems; } - public static get eventExecutors(): EventExecutors { - return this._eventExecutors; + public static get eventItems(): IEventItem[] { + return this._eventItems; } public static get buttonEvents(): IButtonEventItem[] { return this._buttonEvents; } - public static get stringDropdowns(): StringDropdownEventItem[] { - return this._stringDropdowns; - } - constructor(intents: number[]) { super({ intents: intents }); dotenv.config(); - CoreClient.Environment = Number(process.env.BOT_ENV); - - const loglevel = process.env.BOT_LOGLEVEL ?? "info"; - - AppLogger.InitialiseLogger(loglevel, CoreClient.Environment == Environment.Local); - - AppLogger.LogInfo("Client", "Initialising Client"); - CoreClient._commandItems = []; + CoreClient._eventItems = []; CoreClient._buttonEvents = []; - CoreClient._stringDropdowns = []; this._events = new Events(); this._util = new Util(); this._webhooks = new Webhooks(); - this._timerHelper = new TimerHelper(); - AppLogger.LogInfo("Client", `Environment: ${CoreClient.Environment}`); + CoreClient.Environment = Number(process.env.BOT_ENV); + console.log(`Bot Environment: ${CoreClient.Environment}`); CoreClient.AllowDrops = true; } public async start() { if (!process.env.BOT_TOKEN) { - AppLogger.LogError("Client", "BOT_TOKEN is not defined in .env"); + console.error("BOT_TOKEN is not defined in .env"); return; } await AppDataSource.initialize() - .then(() => { - AppLogger.LogInfo("Client", "App Data Source Initialised"); + .then(() => console.log("App Data Source Initialised")) + .catch(err => console.error("Error initialising App Data Source", err)); - this._timerHelper.AddTimer("*/20 * * * *", "Europe/London", GiveCurrency, false); - this._timerHelper.AddTimer("0 0 * * *", "Europe/London", PurgeClaims, false); - - this._timerHelper.StartAllTimers(); - }) - .catch(err => { - AppLogger.LogError("Client", "App Data Source Initialisation Failed"); - AppLogger.LogError("Client", err); - throw err; - }); + await CardDataSource.initialize() + .then(() => console.log("Card Data Source Initialised")) + .catch(err => console.error("Error initialising Card Data Source", err)); super.on("interactionCreate", this._events.onInteractionCreate); super.on("ready", this._events.onReady); - await CardMetadataFunction.Execute(true); + await CardSetupFunction.Execute(); - this._util.loadEvents(this, CoreClient._eventExecutors); + 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(", ")}`); + await super.login(process.env.BOT_TOKEN); } @@ -119,287 +97,21 @@ export class CoreClient extends Client { ServerId: serverId, }; - if ((environment & CoreClient.Environment) == CoreClient.Environment) { + if (environment &= CoreClient.Environment) { CoreClient._commandItems.push(item); - - AppLogger.LogVerbose("Client", `Registered Command: ${name}`); } } - public static RegisterChannelCreateEvent(fn: (channel: NonThreadGuildBasedChannel) => void) { - if (this._eventExecutors) { - this._eventExecutors.ChannelCreate.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [ fn ], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; + public static RegisterEvent(eventType: EventType, func: Function, environment: Environment = Environment.All) { + const item: IEventItem = { + EventType: eventType, + ExecutionFunction: func, + Environment: environment, + }; + + if (environment &= CoreClient.Environment) { + CoreClient._eventItems.push(item); } - - AppLogger.LogVerbose("Client", "Registered Channel Create Event"); - } - - public static RegisterChannelDeleteEvent(fn: (channel: DMChannel | NonThreadGuildBasedChannel) => void) { - if (this._eventExecutors) { - this._eventExecutors.ChannelDelete.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [ fn ], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Channel Delete Event"); - } - - public static RegisterChannelUpdateEvent(fn: (channel: DMChannel | NonThreadGuildBasedChannel) => void) { - if (this._eventExecutors) { - this._eventExecutors.ChannelCreate.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [ fn ], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Channel Update Event"); - } - - public static RegisterGuildBanAddEvent(fn: (ban: GuildBan) => void) { - if (this._eventExecutors) { - this._eventExecutors.GuildBanAdd.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [ fn ], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Guild Ban Add Event"); - } - - public static RegisterGuildBanRemoveEvent(fn: (channel: GuildBan) => void) { - if (this._eventExecutors) { - this._eventExecutors.GuildBanRemove.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [ fn ], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Guild Ban Remove Event"); - } - - public static RegisterGuildCreateEvent(fn: (guild: Guild) => void) { - if (this._eventExecutors) { - this._eventExecutors.GuildCreate.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [ fn ], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Guild Create Event"); - } - - public static RegisterGuildMemberAddEvent(fn: (member: GuildMember) => void) { - if (this._eventExecutors) { - this._eventExecutors.GuildMemberAdd.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [ fn ], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Guild Member Add Event"); - } - - public static RegisterGuildMemberRemoveEvent(fn: (member: GuildMember | PartialGuildMember) => void) { - if (this._eventExecutors) { - this._eventExecutors.GuildMemberRemove.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [ fn ], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Guild Member Remove Event"); - } - - public static GuildMemebrUpdate(fn: (oldMember: GuildMember | PartialGuildMember, newMember: GuildMember) => void) { - if (this._eventExecutors) { - this._eventExecutors.GuildMemebrUpdate.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [ fn ], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Guild Member Update Event"); - } - - public static RegisterMessageCreateEvent(fn: (message: Message) => void) { - if (this._eventExecutors) { - this._eventExecutors.MessageCreate.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [ fn ], - MessageDelete: [], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Message Create Event"); - } - - public static RegisterMessageDeleteEvent(fn: (message: Message | PartialMessage) => void) { - if (this._eventExecutors) { - this._eventExecutors.MessageDelete.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [ fn ], - MessageUpdate: [], - }; - } - - AppLogger.LogVerbose("Client", "Registered Message Delete Event"); - } - - public static RegisterMessageUpdateEvent(fn: (oldMessage: Message | PartialMessage, newMessage: Message | PartialMessage) => void) { - if (this._eventExecutors) { - this._eventExecutors.MessageUpdate.push(fn); - } else { - this._eventExecutors = { - ChannelCreate: [], - ChannelDelete: [], - ChannelUpdate: [], - GuildBanAdd: [], - GuildBanRemove: [], - GuildCreate: [], - GuildMemberAdd: [], - GuildMemberRemove: [], - GuildMemebrUpdate: [], - MessageCreate: [], - MessageDelete: [], - MessageUpdate: [ fn ], - }; - } - - AppLogger.LogVerbose("Client", "Registered Message Update Event"); } public static RegisterButtonEvent(buttonId: string, event: ButtonEvent, environment: Environment = Environment.All) { @@ -409,25 +121,8 @@ export class CoreClient extends Client { Environment: environment, }; - if ((environment & CoreClient.Environment) == CoreClient.Environment) { + if (environment &= CoreClient.Environment) { CoreClient._buttonEvents.push(item); - - AppLogger.LogVerbose("Client", `Registered Button Event: ${buttonId}`); - } - } - - public static RegisterStringDropdownEvent(dropdownId: string, event: StringDropdownEvent, environment: Environment = Environment.All) { - const item: StringDropdownEventItem = { - DropdownId: dropdownId, - Event: event, - Environment: environment, - }; - - if ((environment & CoreClient.Environment) == CoreClient.Environment) { - CoreClient._stringDropdowns.push(item); - - AppLogger.LogVerbose("Client", `Registered String Dropdown Event: ${dropdownId}`); } } } - diff --git a/src/client/events.ts b/src/client/events.ts index 5f61da5..db6cfc4 100644 --- a/src/client/events.ts +++ b/src/client/events.ts @@ -1,34 +1,22 @@ import { Interaction } from "discord.js"; import ChatInputCommand from "./interactionCreate/ChatInputCommand"; import Button from "./interactionCreate/Button"; -import AppLogger from "./appLogger"; -import NewUserDiscovery from "./interactionCreate/middleware/NewUserDiscovery"; -import StringDropdown from "./interactionCreate/StringDropdown"; export class Events { public async onInteractionCreate(interaction: Interaction) { if (!interaction.guildId) return; - await NewUserDiscovery(interaction); - if (interaction.isChatInputCommand()) { - AppLogger.LogVerbose("Client", `ChatInputCommand: ${interaction.commandName}`); ChatInputCommand.onChatInput(interaction); } if (interaction.isButton()) { - AppLogger.LogVerbose("Client", `Button: ${interaction.customId}`); Button.onButtonClicked(interaction); } - - if (interaction.isStringSelectMenu()) { - AppLogger.LogVerbose("Client", `StringDropdown: ${interaction.customId}`); - StringDropdown.onStringDropdownSelected(interaction); - } } // Emit when bot is logged in and ready to use public onReady() { - AppLogger.LogInfo("Client", "Ready"); + console.log("Ready"); } } diff --git a/src/client/interactionCreate/Button.ts b/src/client/interactionCreate/Button.ts index b8abbfc..165e426 100644 --- a/src/client/interactionCreate/Button.ts +++ b/src/client/interactionCreate/Button.ts @@ -1,29 +1,17 @@ -import { ButtonInteraction } from "discord.js"; +import { ButtonInteraction, Interaction } from "discord.js"; import { CoreClient } from "../client"; -import AppLogger from "../appLogger"; export default class Button { public static async onButtonClicked(interaction: ButtonInteraction) { if (!interaction.isButton) return; - const item = CoreClient.buttonEvents.find(x => x.ButtonId == interaction.customId.split(" ")[0]); + const item = CoreClient.buttonEvents.find(x => x.ButtonId == interaction.customId.split(' ')[0]); if (!item) { - AppLogger.LogVerbose("Button", `Event not found: ${interaction.customId}`); - - await interaction.reply("Event not found"); + await interaction.reply('Event not found'); return; } - try { - AppLogger.LogDebug("Button", `Executing ${interaction.customId}`); - - item.Event.execute(interaction); - } catch (e) { - AppLogger.LogError("Button", `Error occurred while executing event: ${interaction.customId}`); - AppLogger.LogError("Button", e as string); - - await interaction.reply("An error occurred while executing the event"); - } + item.Event.execute(interaction); } } \ No newline at end of file diff --git a/src/client/interactionCreate/ChatInputCommand.ts b/src/client/interactionCreate/ChatInputCommand.ts index 47f7b37..d483f1d 100644 --- a/src/client/interactionCreate/ChatInputCommand.ts +++ b/src/client/interactionCreate/ChatInputCommand.ts @@ -1,7 +1,6 @@ import { Interaction } from "discord.js"; import { CoreClient } from "../client"; import ICommandItem from "../../contracts/ICommandItem"; -import AppLogger from "../appLogger"; export default class ChatInputCommand { public static async onChatInput(interaction: Interaction) { @@ -14,9 +13,7 @@ export default class ChatInputCommand { if (!itemForServer) { if (!item) { - AppLogger.LogVerbose("ChatInputCommand", `Command not found: ${interaction.commandName}`); - - await interaction.reply("Command not found"); + await interaction.reply('Command not found'); return; } @@ -25,15 +22,6 @@ export default class ChatInputCommand { itemToUse = itemForServer; } - try { - AppLogger.LogDebug("Command", `Executing ${interaction.commandName}`); - - itemToUse.Command.execute(interaction); - } catch (e) { - AppLogger.LogError("ChatInputCommand", `Error occurred while executing command: ${interaction.commandName}`); - AppLogger.LogError("ChatInputCommand", e as string); - - await interaction.reply("An error occurred while executing the command"); - } + itemToUse.Command.execute(interaction); } } \ No newline at end of file diff --git a/src/client/interactionCreate/StringDropdown.ts b/src/client/interactionCreate/StringDropdown.ts deleted file mode 100644 index 608b81b..0000000 --- a/src/client/interactionCreate/StringDropdown.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {StringSelectMenuInteraction} from "discord.js"; -import {CoreClient} from "../client"; -import AppLogger from "../appLogger"; - -export default class StringDropdown { - public static async onStringDropdownSelected(interaction: StringSelectMenuInteraction) { - if (!interaction.isStringSelectMenu()) return; - - const item = CoreClient.stringDropdowns.find(x => x.DropdownId == interaction.customId.split(" ")[0]); - - if (!item) { - AppLogger.LogVerbose("StringDropdown", `Event not found: ${interaction.customId}`); - - await interaction.reply("Event not found"); - return; - } - - try { - AppLogger.LogDebug("StringDropdown", `Executing ${interaction.customId}`); - - item.Event.execute(interaction); - } catch (e) { - AppLogger.LogError("StringDropdown", `Error occurred while executing event: ${interaction.customId}`); - AppLogger.LogError("StringDropdown", e as string); - - await interaction.reply("An error occurred while executing the event"); - } - } -} diff --git a/src/client/interactionCreate/middleware/NewUserDiscovery.ts b/src/client/interactionCreate/middleware/NewUserDiscovery.ts deleted file mode 100644 index dcbe75a..0000000 --- a/src/client/interactionCreate/middleware/NewUserDiscovery.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Interaction } from "discord.js"; -import User from "../../../database/entities/app/User"; -import CardConstants from "../../../constants/CardConstants"; -import AppLogger from "../../appLogger"; - -export default async function NewUserDiscovery(interaction: Interaction) { - const existingUser = await User.FetchOneById(User, interaction.user.id); - - if (existingUser) return; - - const newUser = new User(interaction.user.id, CardConstants.StartingCurrency); - await newUser.Save(User, newUser); - - AppLogger.LogInfo("NewUserDiscovery", `Discovered new user ${interaction.user.id}`); -} \ No newline at end of file diff --git a/src/client/util.ts b/src/client/util.ts index 47daa3d..41b7f27 100644 --- a/src/client/util.ts +++ b/src/client/util.ts @@ -1,7 +1,7 @@ import { Client, REST, Routes, SlashCommandBuilder } from "discord.js"; -import EventExecutors from "../contracts/EventExecutors"; +import { EventType } from "../constants/EventType"; +import IEventItem from "../contracts/IEventItem"; import { CoreClient } from "./client"; -import AppLogger from "./appLogger"; export class Util { public loadSlashCommands(client: Client) { @@ -10,27 +10,25 @@ export class Util { const globalCommands = registeredCommands.filter(x => !x.ServerId); const guildCommands = registeredCommands.filter(x => x.ServerId); - const globalCommandData: Omit[] = []; + const globalCommandData: SlashCommandBuilder[] = []; - for (const command of globalCommands) { + for (let command of globalCommands) { if (!command.Command.CommandBuilder) continue; - if ((command.Environment & CoreClient.Environment) == CoreClient.Environment) { + if (command.Environment &= CoreClient.Environment) { globalCommandData.push(command.Command.CommandBuilder); } } const guildIds: string[] = []; - for (const command of guildCommands) { + for (let command of guildCommands) { if (!guildIds.find(x => x == command.ServerId)) { guildIds.push(command.ServerId!); } } - const rest = new REST({ version: "10" }).setToken(process.env.BOT_TOKEN!); - - AppLogger.LogVerbose("Util", `REST PUT: ${globalCommandData.flatMap(x => x.name).join(", ")}`); + const rest = new REST({ version: '10' }).setToken(process.env.BOT_TOKEN!); rest.put( Routes.applicationCommands(process.env.BOT_CLIENTID!), @@ -39,43 +37,71 @@ export class Util { } ); - for (const guild of guildIds) { - const guildCommandData: Omit[] = []; + for (let guild of guildIds) { + const guildCommandData: SlashCommandBuilder[] = []; - for (const command of guildCommands.filter(x => x.ServerId == guild)) { + for (let command of guildCommands.filter(x => x.ServerId == guild)) { if (!command.Command.CommandBuilder) continue; - if ((command.Environment & CoreClient.Environment) == CoreClient.Environment) { + if (command.Environment &= CoreClient.Environment) { guildCommandData.push(command.Command.CommandBuilder); } } if (!client.guilds.cache.has(guild)) continue; - AppLogger.LogVerbose("Util", `REST PUT: ${guild} - ${guildCommandData.flatMap(x => x.name).join(", ")}`); - rest.put( Routes.applicationGuildCommands(process.env.BOT_CLIENTID!, guild), { body: guildCommandData } - ); + ) } } // Load the events - loadEvents(client: Client, events: EventExecutors) { - client.on("channelCreate", (channel) => events.ChannelCreate.forEach((fn) => fn(channel))); - client.on("channelDelete", (channel) => events.ChannelDelete.forEach((fn) => fn(channel))); - client.on("channelUpdate", (channel) => events.ChannelUpdate.forEach((fn) => fn(channel))); - client.on("guildBanAdd", (ban) => events.GuildBanAdd.forEach((fn) => fn(ban))); - client.on("guildBanRemove", (ban) => events.GuildBanRemove.forEach((fn) => fn(ban))); - client.on("guildCreate", (guild) => events.GuildCreate.forEach((fn) => fn(guild))); - client.on("guildMemberAdd", (member) => events.GuildMemberAdd.forEach((fn) => fn(member))); - client.on("guildMemberRemove", (member) => events.GuildMemberRemove.forEach((fn) => fn(member))); - client.on("guildMemberUpdate", (oldMember, newMember) => events.GuildMemebrUpdate.forEach((fn) => fn(oldMember, newMember))); - client.on("messageCreate", (message) => events.MessageCreate.forEach((fn) => fn(message))); - client.on("messageDelete", (message) => events.MessageDelete.forEach((fn) => fn(message))); - client.on("messageUpdate", (oldMessage, newMessage) => events.MessageUpdate.forEach((fn) => fn(oldMessage, newMessage))); + loadEvents(client: Client, events: IEventItem[]) { + events.forEach((e) => { + switch(e.EventType) { + case EventType.ChannelCreate: + client.on('channelCreate', (channel) => e.ExecutionFunction(channel)); + break; + case EventType.ChannelDelete: + client.on('channelDelete', (channel) => e.ExecutionFunction(channel)); + break; + case EventType.ChannelUpdate: + client.on('channelUpdate', (channel) => e.ExecutionFunction(channel)); + break; + case EventType.GuildBanAdd: + client.on('guildBanAdd', (ban) => e.ExecutionFunction(ban)); + break; + case EventType.GuildBanRemove: + client.on('guildBanRemove', (ban) => e.ExecutionFunction(ban)); + break; + case EventType.GuildCreate: + client.on('guildCreate', (guild) => e.ExecutionFunction(guild)); + break; + case EventType.GuildMemberAdd: + client.on('guildMemberAdd', (member) => e.ExecutionFunction(member)); + break; + case EventType.GuildMemberRemove: + client.on('guildMemberRemove', (member) => e.ExecutionFunction(member)); + break; + case EventType.GuildMemberUpdate: + client.on('guildMemberUpdate', (oldMember, newMember) => e.ExecutionFunction(oldMember, newMember)); + break; + case EventType.MessageCreate: + client.on('messageCreate', (message) => e.ExecutionFunction(message)); + break; + case EventType.MessageDelete: + client.on('messageDelete', (message) => e.ExecutionFunction(message)); + break; + case EventType.MessageUpdate: + client.on('messageUpdate', (oldMessage, newMessage) => e.ExecutionFunction(oldMessage, newMessage)); + break; + default: + console.error('Event not implemented.'); + } + }); } } diff --git a/src/commands/about.ts b/src/commands/about.ts index 3bfcdac..6e065cc 100644 --- a/src/commands/about.ts +++ b/src/commands/about.ts @@ -6,9 +6,9 @@ export default class About extends Command { constructor() { super(); - this.CommandBuilder = new SlashCommandBuilder() - .setName("about") - .setDescription("About Bot"); + super.CommandBuilder = new SlashCommandBuilder() + .setName('about') + .setDescription('About Bot'); } public override async execute(interaction: CommandInteraction) { diff --git a/src/commands/allbalance.ts b/src/commands/allbalance.ts deleted file mode 100644 index 0874e54..0000000 --- a/src/commands/allbalance.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { CommandInteraction, EmbedBuilder, PermissionsBitField, SlashCommandBuilder } from "discord.js"; -import EmbedColours from "../constants/EmbedColours"; -import { Command } from "../type/command"; -import User from "../database/entities/app/User"; - -export default class AllBalance extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("allbalance") - .setDescription("Get everyone's currency balance") - .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator); - } - - public override async execute(interaction: CommandInteraction) { - const users = await User.FetchAll(User); - - const filteredUsers = users.filter(x => x.Currency > 0) - .sort((a, b) => b.Currency - a.Currency); - - const embed = new EmbedBuilder() - .setColor(EmbedColours.Ok) - .setTitle("All Balances") - .setDescription(filteredUsers.map(x => `<@${x.Id}> ${x.Currency}`).join("\n")); - - await interaction.reply({ embeds: [ embed ], ephemeral: true }); - } -} \ No newline at end of file diff --git a/src/commands/balance.ts b/src/commands/balance.ts deleted file mode 100644 index c8f087c..0000000 --- a/src/commands/balance.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { CommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import User from "../database/entities/app/User"; -import EmbedColours from "../constants/EmbedColours"; - -export default class Balance extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("balance") - .setDescription("Get your currency balance"); - } - - public override async execute(interaction: CommandInteraction) { - const user = await User.FetchOneById(User, interaction.user.id); - - const userBalance = user != null ? user.Currency : 0; - - const embed = new EmbedBuilder() - .setColor(EmbedColours.Ok) - .setTitle("Balance") - .setDescription(`You currently have **${userBalance} currency**!`) - .setFooter({ text: interaction.user.username, iconURL: interaction.user.avatarURL() ?? undefined }); - - await interaction.reply({ embeds: [ embed ]}); - } -} \ No newline at end of file diff --git a/src/commands/daily.ts b/src/commands/daily.ts deleted file mode 100644 index 65d69fc..0000000 --- a/src/commands/daily.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { CommandInteraction, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import User from "../database/entities/app/User"; -import CardConstants from "../constants/CardConstants"; -import TimeLengthInput from "../helpers/TimeLengthInput"; - -export default class Daily extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("daily") - .setDescription("Gain bonus currency, once a day"); - } - - public override async execute(interaction: CommandInteraction) { - const user = await User.FetchOneById(User, interaction.user.id) ?? new User(interaction.user.id, CardConstants.StartingCurrency); - - const dayAgo = new Date(Date.now() - (1000 * 60 * 60 * 24)); - - if (user.LastUsedDaily && user.LastUsedDaily > dayAgo) { - const timeNow = Date.now(); - const timeLength = 24 * 60 * 60 * 1000; // 1 day - - const timeLeft = Math.ceil(((timeLength - (timeNow - user.LastUsedDaily.getTime()))) / 1000 / 60); - - const timeLeftHours = Math.floor(timeLeft / 60); - const timeLeftMinutes = timeLeft % 60; - - const timeLeftString = new TimeLengthInput(`${timeLeftHours}h ${timeLeftMinutes}m`); - - await interaction.reply(`You have already used the daily command! You can use it again in **${timeLeftString.GetLength()}**.`); - return; - } - - user.AddCurrency(CardConstants.DailyCurrency); - user.UpdateLastUsedDaily(new Date()); - - await user.Save(User, user); - - await interaction.reply(`Congratulations, you have claimed your daily ${CardConstants.DailyCurrency} currency! You now have ${user.Currency} currency and can claim again in 24 hours!`); - } -} \ No newline at end of file diff --git a/src/commands/drop.ts b/src/commands/drop.ts index b6ad224..bebe581 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -1,109 +1,66 @@ -import { AttachmentBuilder, CommandInteraction, SlashCommandBuilder } from "discord.js"; +import { AttachmentBuilder, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; +import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; import { v4 } from "uuid"; import Inventory from "../database/entities/app/Inventory"; import Config from "../database/entities/app/Config"; -import path from "path"; -import AppLogger from "../client/appLogger"; -import User from "../database/entities/app/User"; -import CardConstants from "../constants/CardConstants"; -import ErrorMessages from "../constants/ErrorMessages"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; -import DropEmbedHelper from "../helpers/DropHelpers/DropEmbedHelper"; -import {DropResult} from "../contracts/SeriesMetadata"; export default class Drop extends Command { constructor() { super(); - this.CommandBuilder = new SlashCommandBuilder() - .setName("drop") - .setDescription("Summon a new card drop"); + super.CommandBuilder = new SlashCommandBuilder() + .setName('drop') + .setDescription('Summon a new card drop'); } public override async execute(interaction: CommandInteraction) { if (!CoreClient.AllowDrops) { - await interaction.reply(ErrorMessages.BotSyncing); + await interaction.reply('Bot is currently syncing, please wait until its done.'); return; } - if (await Config.GetValue("safemode") == "true") { - AppLogger.LogWarn("Commands/Drop", ErrorMessages.SafeMode); - await interaction.reply(ErrorMessages.SafeMode); + if (await Config.GetValue('safemode') == "true") + { + await interaction.reply('Safe Mode has been activated, please resync to contunue.'); return; } - let user = await User.FetchOneById(User, interaction.user.id); + const randomCard = await CardDropHelper.GetRandomCard(); - if (!user) { - user = new User(interaction.user.id, CardConstants.StartingCurrency); - await user.Save(User, user); - - AppLogger.LogInfo("Commands/Drop", `New user (${interaction.user.id}) saved to the database`); - } - - if (!user.RemoveCurrency(CardConstants.ClaimCost)) { - await interaction.reply(ErrorMessages.NotEnoughCurrency(CardConstants.ClaimCost, user.Currency)); - return; - } - - let randomCard: DropResult | undefined; - - try { - randomCard = await GetCardsHelper.FetchCard(interaction.user.id); - } catch (e) { - AppLogger.CatchError("Commands/Drop", e); - - await interaction.reply(ErrorMessages.UnableToFetchCard); - } - - - if (!randomCard) { - AppLogger.LogWarn("Commands/Drop", ErrorMessages.UnableToFetchCard); - await interaction.reply(ErrorMessages.UnableToFetchCard); - return; - } + const image = readFileSync(randomCard.Path); await interaction.deferReply(); + const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); + + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.CardNumber); + const quantityClaimed = inventory ? inventory.Quantity : 0; + + const embed = CardDropHelper.GenerateDropEmbed(randomCard, quantityClaimed || 0); + + const claimId = v4(); + + const row = CardDropHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); + try { - const files = []; - let imageFileName = ""; - - if (!(randomCard.card.path.startsWith("http://") || randomCard.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", randomCard.card.path)); - imageFileName = randomCard.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = DropEmbedHelper.GenerateDropEmbed(randomCard, quantityClaimed, imageFileName, undefined, user.Currency); - - const claimId = v4(); - - const row = DropEmbedHelper.GenerateDropButtons(randomCard, claimId, interaction.user.id); - - await user.Save(User, user); - - await interaction.editReply({ embeds: [ embed ], - files: files, + files: [ attachment ], components: [ row ], }); - } catch (e) { - AppLogger.LogError("Commands/Drop", `Error sending next drop for card ${randomCard.card.id}: ${e}`); + console.error(e); - await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. (${randomCard.card.id})`); + 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/commands/effects.ts b/src/commands/effects.ts deleted file mode 100644 index cd6d1d4..0000000 --- a/src/commands/effects.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { CommandInteraction, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import { EffectChoices } from "../constants/EffectDetails"; -import AppLogger from "../client/appLogger"; -import List from "./effects/List"; -import Use from "./effects/Use"; -import Buy from "./effects/Buy"; - -export default class Effects extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("effects") - .setDescription("Effects") - .addSubcommand(x => x - .setName("list") - .setDescription("List all effects I have") - .addNumberOption(x => x - .setName("page") - .setDescription("The page number") - .setMinValue(1))) - .addSubcommand(x => x - .setName("use") - .setDescription("Use an effect in your inventory") - .addStringOption(y => y - .setName("id") - .setDescription("The effect id to use") - .setRequired(true) - .setChoices(EffectChoices))) - .addSubcommand(x => x - .setName("buy") - .setDescription("Buy more effects") - .addStringOption(y => y - .setName("id") - .setDescription("The effect id to buy") - .setRequired(true) - .setChoices(EffectChoices)) - .addNumberOption(y => y - .setName("quantity") - .setDescription("The amount to buy") - .setMinValue(1))); - } - - public override async execute(interaction: CommandInteraction) { - if (!interaction.isChatInputCommand()) return; - - const subcommand = interaction.options.getSubcommand(); - - switch (subcommand) { - case "list": - await List(interaction); - break; - case "use": - await Use(interaction); - break; - case "buy": - await Buy(interaction); - break; - default: - AppLogger.LogError("Commands/Effects", `Invalid subcommand: ${subcommand}`); - } - } -} diff --git a/src/commands/effects/Buy.ts b/src/commands/effects/Buy.ts deleted file mode 100644 index 3ebf587..0000000 --- a/src/commands/effects/Buy.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CommandInteraction } from "discord.js"; -import EffectHelper from "../../helpers/EffectHelper"; - -export default async function Buy(interaction: CommandInteraction) { - const id = interaction.options.get("id", true).value!; - const quantity = interaction.options.get("quantity")?.value ?? 1; - - const idValue = id.toString(); - const quantityValue = Number(quantity); - - const result = await EffectHelper.GenerateEffectBuyEmbed(interaction.user.id, idValue, quantityValue, false); - - if (typeof result == "string") { - await interaction.reply(result); - return; - } - - await interaction.reply({ - embeds: [ result.embed ], - components: [ result.row ], - }); -} \ No newline at end of file diff --git a/src/commands/effects/List.ts b/src/commands/effects/List.ts deleted file mode 100644 index 14e6085..0000000 --- a/src/commands/effects/List.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CommandInteraction } from "discord.js"; -import EffectHelper from "../../helpers/EffectHelper"; - -export default async function List(interaction: CommandInteraction) { - const pageOption = interaction.options.get("page"); - - const page = !isNaN(Number(pageOption?.value)) ? Number(pageOption?.value) : 1; - - const result = await EffectHelper.GenerateEffectListEmbed(interaction.user.id, page); - - await interaction.reply({ - embeds: [ result.embed ], - components: [ result.row ], - }); -} \ No newline at end of file diff --git a/src/commands/effects/Use.ts b/src/commands/effects/Use.ts deleted file mode 100644 index 9f72ae0..0000000 --- a/src/commands/effects/Use.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, CommandInteraction, EmbedBuilder } from "discord.js"; -import { EffectDetails } from "../../constants/EffectDetails"; -import AppLogger from "../../client/appLogger"; -import EffectHelper from "../../helpers/EffectHelper"; -import TimeLengthInput from "../../helpers/TimeLengthInput"; -import EmbedColours from "../../constants/EmbedColours"; - -export default async function Use(interaction: CommandInteraction) { - const id = interaction.options.get("id", true).value!.toString(); - - const effectDetail = EffectDetails.get(id); - - if (!effectDetail) { - AppLogger.LogWarn("Commands/Effects", `Unable to find effect details for ${id}`); - - await interaction.reply("Unable to find effect!"); - return; - } - - const canUseEffect = await EffectHelper.CanUseEffect(interaction.user.id, id); - - if (!canUseEffect) { - await interaction.reply("Unable to use effect! Please make sure you have it in your inventory and is not on cooldown"); - return; - } - - const timeLengthInput = TimeLengthInput.ConvertFromMilliseconds(effectDetail.duration); - - const embed = new EmbedBuilder() - .setTitle("Effect Confirmation") - .setDescription("Would you like to use this effect?") - .setColor(EmbedColours.Ok) - .addFields([ - { - name: "Effect", - value: effectDetail.friendlyName, - inline: true, - }, - { - name: "Length", - value: timeLengthInput.GetLengthShort(), - inline: true, - }, - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setLabel("Confirm") - .setCustomId(`effects use confirm ${effectDetail.id}`) - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setLabel("Cancel") - .setCustomId(`effects use cancel ${effectDetail.id}`) - .setStyle(ButtonStyle.Danger), - ]); - - await interaction.reply({ - embeds: [ embed ], - components: [ row ], - }); -} \ No newline at end of file diff --git a/src/commands/gdrivesync.ts b/src/commands/gdrivesync.ts index b02c873..97009a2 100644 --- a/src/commands/gdrivesync.ts +++ b/src/commands/gdrivesync.ts @@ -1,62 +1,44 @@ import { CacheType, CommandInteraction, PermissionsBitField, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; import { ExecException, exec } from "child_process"; +import CardSetupFunction from "../Functions/CardSetupFunction"; import { CoreClient } from "../client/client"; import Config from "../database/entities/app/Config"; -import CardMetadataFunction from "../Functions/CardMetadataFunction"; -import AppLogger from "../client/appLogger"; export default class Gdrivesync extends Command { constructor() { super(); - this.CommandBuilder = new SlashCommandBuilder() - .setName("gdrivesync") - .setDescription("Sync google drive to the bot") + 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.BOT_ADMINS!.split(","); + 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({ - content: "Syncing, this might take a while...", - ephemeral: true, - }); + await interaction.reply('Syncing, this might take a while...'); CoreClient.AllowDrops = false; - AppLogger.LogInfo("Commands/GDriveSync", "Syncing google drive to the bot"); - - exec(`rclone sync card-drop-gdrive: ${process.env.DATA_DIR}/cards`, async (error: ExecException | null) => { + exec(`rclone sync card-drop-gdrive: ${process.cwd()}/cards`, async (error: ExecException | null) => { if (error) { - AppLogger.LogError("Commands/GDriveSync", `Error while running sync command: ${error.code}, ${error.message}`); - AppLogger.LogWarn("Commands/GDriveSync", "Safe mode activated"); - await interaction.editReply(`Error while running sync command. Safe Mode has been activated. Code: ${error.code}`); - await Config.SetValue("safemode", "true"); + await Config.SetValue('safemode', 'true'); } else { - const result = await CardMetadataFunction.Execute(true); + await CardSetupFunction.Execute(); + await interaction.editReply('Synced successfully.'); - if (result.IsSuccess) { - AppLogger.LogInfo("Commands/GDriveSync", "Synced successfully"); - - await interaction.editReply("Synced successfully."); - - CoreClient.AllowDrops = true; - await Config.SetValue("safemode", "false"); - } else { - AppLogger.LogError("Commands/GDriveSync", `Error while running sync command: ${result.ErrorMessage}`); - - await interaction.editReply(`Sync failed \`\`\`${result.ErrorMessage}\`\`\``); - } + CoreClient.AllowDrops = true; + await Config.SetValue('safemode', 'false'); } }); } diff --git a/src/commands/give.ts b/src/commands/give.ts deleted file mode 100644 index 35dfa04..0000000 --- a/src/commands/give.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { CacheType, CommandInteraction, PermissionsBitField, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import { CoreClient } from "../client/client"; -import Config from "../database/entities/app/Config"; -import Inventory from "../database/entities/app/Inventory"; -import AppLogger from "../client/appLogger"; -import User from "../database/entities/app/User"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; - -export default class Give extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("give") - .setDescription("Give a user a card manually, in case bot breaks") - .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator) - .addSubcommand(x => - x - .setName("card") - .setDescription("Give a user a card manually") - .addStringOption(x => - x - .setName("cardnumber") - .setDescription("The card to give") - .setRequired(true)) - .addUserOption(x => - x - .setName("user") - .setDescription("The user to give the card to") - .setRequired(true))) - .addSubcommand(x => - x - .setName("currency") - .setDescription("Give a user currency manually") - .addNumberOption(x => - x - .setName("amount") - .setDescription("The amount to give") - .setRequired(true)) - .addUserOption(x => - x - .setName("user") - .setDescription("The user to give the currency to") - .setRequired(true))); - } - - public override async execute(interaction: CommandInteraction) { - if (!interaction.isChatInputCommand()) return; - - const whitelistedUsers = process.env.BOT_ADMINS!.split(","); - - if (!whitelistedUsers.find(x => x == interaction.user.id)) { - await interaction.reply("Only whitelisted users can use this command."); - return; - } - - switch (interaction.options.getSubcommand()) { - case "card": - await this.GiveCard(interaction); - break; - case "currency": - await this.GiveCurrency(interaction); - break; - } - } - - private async GiveCard(interaction: CommandInteraction) { - if (!CoreClient.AllowDrops) { - await interaction.reply("Bot is currently syncing, please wait until its done."); - return; - } - - if (await Config.GetValue("safemode") == "true") { - await interaction.reply("Safe Mode has been activated, please resync to continue."); - return; - } - - const cardNumber = interaction.options.get("cardnumber", true); - const user = interaction.options.get("user", true).user!; - - AppLogger.LogSilly("Commands/Give/GiveCard", `Parameters: cardNumber=${cardNumber.value}, user=${user.id}`); - - const card = GetCardsHelper.GetCardByCardNumber(cardNumber.value!.toString()); - - if (!card) { - await interaction.reply("Unable to fetch card, please try again."); - return; - } - - let inventory = await Inventory.FetchOneByCardNumberAndUserId(user.id, card.card.id); - - if (!inventory) { - inventory = new Inventory(user.id, card.card.id, 1); - } else { - inventory.SetQuantity(inventory.Quantity + 1); - } - - await inventory.Save(Inventory, inventory); - - await interaction.reply(`Card ${card.card.name} given to ${user.username}, they now have ${inventory.Quantity}`); - } - - private async GiveCurrency(interaction: CommandInteraction) { - const amount = interaction.options.get("amount", true); - const user = interaction.options.get("user", true).user!; - - AppLogger.LogSilly("Commands/Give/GiveCurrency", `Parameters: amount=${amount.value} user=${user.id}`); - - const userEntity = await User.FetchOneById(User, user.id) || new User(user.id, 300); - - userEntity.AddCurrency(amount.value! as number); - - await userEntity.Save(User, userEntity); - - await interaction.reply(`${amount.value} currency ${amount.value! as number >= 0 ? "given to" : "taken from"} ${user.username}, they now have ${userEntity.Currency}`); - } -} \ No newline at end of file diff --git a/src/commands/id.ts b/src/commands/id.ts deleted file mode 100644 index 0f11aaa..0000000 --- a/src/commands/id.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { AttachmentBuilder, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import { CoreClient } from "../client/client"; -import { readFileSync } from "fs"; -import path from "path"; -import Inventory from "../database/entities/app/Inventory"; -import AppLogger from "../client/appLogger"; -import DropEmbedHelper from "../helpers/DropHelpers/DropEmbedHelper"; - -export default class Id extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("id") - .setDescription("View a specific command by its id") - .addStringOption(x => - x - .setName("cardnumber") - .setDescription("The card number to view") - .setRequired(true)); - } - - public override async execute(interaction: CommandInteraction) { - const cardNumber = interaction.options.get("cardnumber"); - - AppLogger.LogSilly("Commands/View", `Parameters: cardNumber=${cardNumber?.value}`); - - if (!cardNumber || !cardNumber.value) { - await interaction.reply("Card number is required."); - return; - } - - const card = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id == cardNumber.value); - - if (!card) { - await interaction.reply("Card not found."); - return; - } - - const series = CoreClient.Cards - .find(x => x.cards.includes(card))!; - - const files = []; - let imageFileName = ""; - - if (!(card.path.startsWith("http://") || card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", card.path)); - imageFileName = card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - await interaction.deferReply(); - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = DropEmbedHelper.GenerateDropEmbed({ card, series }, quantityClaimed, imageFileName); - - try { - await interaction.editReply({ - embeds: [ embed ], - files: files, - }); - } catch (e) { - AppLogger.LogError("Commands/View", `Error sending view for card ${card.id}: ${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."); - } - } - } -} diff --git a/src/commands/inventory.ts b/src/commands/inventory.ts deleted file mode 100644 index deb4735..0000000 --- a/src/commands/inventory.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CommandInteraction, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import InventoryHelper from "../helpers/InventoryHelper"; -import AppLogger from "../client/appLogger"; - -export default class Inventory extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("inventory") - .setDescription("View your inventory") - .addNumberOption(x => - x - .setName("page") - .setDescription("The page to start with")) - .addUserOption(x => - x - .setName("user") - .setDescription("The user to view (Defaults to yourself)")); - } - - public override async execute(interaction: CommandInteraction) { - const page = interaction.options.get("page"); - const userOption = interaction.options.get("user"); - - const user = userOption ? userOption.user! : interaction.user; - - await interaction.deferReply(); - - AppLogger.LogSilly("Commands/Inventory", `Parameters: page=${page?.value}, user=${user.id}`); - - try { - let pageNumber = 0; - - if (page && page.value) { - pageNumber = Number(page.value) - 1; - } - - const embed = await InventoryHelper.GenerateInventoryPage(user.username, user.id, pageNumber); - - if (!embed) { - await interaction.followUp("No page for user found."); - return; - } - - await interaction.followUp({ - files: [ embed.image ], - embeds: [ embed.embed ], - components: [ embed.row1, embed.row2 ], - }); - } catch (e) { - AppLogger.LogError("Commands/Inventory", e as string); - - await interaction.followUp("An error has occurred running this command."); - } - } -} diff --git a/src/commands/multidrop.ts b/src/commands/multidrop.ts deleted file mode 100644 index 82d19fe..0000000 --- a/src/commands/multidrop.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AttachmentBuilder, CommandInteraction, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import { CoreClient } from "../client/client"; -import ErrorMessages from "../constants/ErrorMessages"; -import Config from "../database/entities/app/Config"; -import AppLogger from "../client/appLogger"; -import User from "../database/entities/app/User"; -import CardConstants from "../constants/CardConstants"; -import { readFileSync } from "fs"; -import path from "path"; -import Inventory from "../database/entities/app/Inventory"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; -import MultidropEmbedHelper from "../helpers/DropHelpers/MultidropEmbedHelper"; - -export default class Multidrop extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("multidrop") - .setDescription("Drop 11 cards for the price of 10!"); - } - - public override async execute(interaction: CommandInteraction) { - if (!CoreClient.AllowDrops) { - await interaction.reply(ErrorMessages.BotSyncing); - return; - } - - if (await Config.GetValue("safemode") == "true") { - AppLogger.LogWarn("Commands/Multidrop", ErrorMessages.SafeMode); - await interaction.reply(ErrorMessages.SafeMode); - return; - } - - let user = await User.FetchOneById(User, interaction.user.id); - - if (!user) { - user = new User(interaction.user.id, CardConstants.StartingCurrency); - await user.Save(User, user); - - AppLogger.LogInfo("Commands/Multidrop", `New user (${interaction.user.id}) saved to the database`); - } - - if (user.Currency < CardConstants.MultidropCost) { - await interaction.reply(ErrorMessages.NotEnoughCurrency(CardConstants.MultidropCost, user.Currency)); - return; - } - - user.RemoveCurrency(CardConstants.MultidropCost); - await user.Save(User, user); - - const randomCard = GetCardsHelper.GetRandomCard(); - const cardsRemaining = CardConstants.MultidropQuantity - 1; - - if (!randomCard) { - AppLogger.LogWarn("Commands/Multidrop", ErrorMessages.UnableToFetchCard); - await interaction.reply(ErrorMessages.UnableToFetchCard); - return; - } - - await interaction.deferReply(); - - try { - const files = []; - let imageFileName = ""; - - if (!(randomCard.card.path.startsWith("http://") || randomCard.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", randomCard.card.path)); - imageFileName = randomCard.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, randomCard.card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = MultidropEmbedHelper.GenerateMultidropEmbed(randomCard, quantityClaimed, imageFileName, cardsRemaining, undefined, user.Currency); - - const row = MultidropEmbedHelper.GenerateMultidropButtons(randomCard, cardsRemaining, interaction.user.id); - - await interaction.editReply({ - embeds: [ embed ], - files: files, - components: [ row ], - }); - } catch (e) { - AppLogger.LogError("Commands/Multidrop", `Error sending next drop for card ${randomCard.card.id}: ${e}`); - - await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. (${randomCard.card.id})`); - } - } -} \ No newline at end of file diff --git a/src/commands/resync.ts b/src/commands/resync.ts deleted file mode 100644 index f90c96c..0000000 --- a/src/commands/resync.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { CacheType, CommandInteraction, PermissionsBitField, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import Config from "../database/entities/app/Config"; -import CardMetadataFunction from "../Functions/CardMetadataFunction"; -import AppLogger from "../client/appLogger"; - -export default class Resync extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("resync") - .setDescription("Resync the card database") - .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator); - } - - public override async execute(interaction: CommandInteraction) { - if (!interaction.isChatInputCommand()) return; - - const whitelistedUsers = process.env.BOT_ADMINS!.split(","); - - if (!whitelistedUsers.find(x => x == interaction.user.id)) { - await interaction.reply("Only whitelisted users can use this command."); - return; - } - - AppLogger.LogInfo("Commands/Resync", "Resyncing database"); - - const result = await CardMetadataFunction.Execute(true); - - if (result) { - if (await Config.GetValue("safemode") == "true") { - AppLogger.LogInfo("Commands/Resync", "Resync successful, safe mode disabled"); - - await Config.SetValue("safemode", "false"); - await interaction.reply("Resynced database and disabled safe mode."); - - return; - } - await interaction.reply("Resynced database."); - } else { - AppLogger.LogWarn("Commands/Resync", "Resync failed, safe mode activated"); - - await interaction.reply("Resync failed, safe mode has been activated until successful resync."); - } - } -} \ No newline at end of file diff --git a/src/commands/sacrifice.ts b/src/commands/sacrifice.ts deleted file mode 100644 index a44a69e..0000000 --- a/src/commands/sacrifice.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, CacheType, CommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import Inventory from "../database/entities/app/Inventory"; -import { CardRarityToString, GetSacrificeAmount } from "../constants/CardRarity"; -import EmbedColours from "../constants/EmbedColours"; -import GetCardsHelper from "../helpers/DropHelpers/GetCardsHelper"; - -export default class Sacrifice extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("sacrifice") - .setDescription("Sacrifices a card for currency") - .addStringOption(x => - x - .setName("cardnumber") - .setDescription("The card to sacrifice from your inventory") - .setRequired(true)) - .addNumberOption(x => - x - .setName("quantity") - .setDescription("The amount to sacrifice (default 1)")); - } - - public override async execute(interaction: CommandInteraction): Promise { - const cardnumber = interaction.options.get("cardnumber", true); - const quantityInput = interaction.options.get("quantity")?.value ?? 1; - - const quantity = Number(quantityInput) || 1; - - const cardInInventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, cardnumber.value! as string); - - if (!cardInInventory || cardInInventory.Quantity == 0) { - await interaction.reply("Unable to find card in your inventory."); - return; - } - - if (cardInInventory.Quantity < quantity) { - await interaction.reply(`You can only sacrifice what you own! You have ${cardInInventory.Quantity} of this card`); - return; - } - - const cardData = GetCardsHelper.GetCardByCardNumber(cardnumber.value! as string); - - if (!cardData) { - await interaction.reply("Unable to find card in the database."); - return; - } - - const cardValue = GetSacrificeAmount(cardData.card.type) * quantity; - const cardRarityString = CardRarityToString(cardData.card.type); - - const description = [ - `Card: ${cardData.card.name}`, - `Series: ${cardData.series.name}`, - `Rarity: ${cardRarityString}`, - `Quantity Owned: ${cardInInventory.Quantity}`, - `Quantity To Sacrifice: ${quantity}`, - `Sacrifice Amount: ${cardValue}`, - ]; - - const embed = new EmbedBuilder() - .setTitle("Sacrifice") - .setDescription(description.join("\n")) - .setColor(EmbedColours.Error) - .setFooter({ text: `${interaction.user.username}` }); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`sacrifice confirm ${interaction.user.id} ${cardnumber.value!} ${quantity}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId(`sacrifice cancel ${interaction.user.id} ${cardnumber.value!} ${quantity}`) - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary), - ]); - - await interaction.reply({ - embeds: [ embed ], - components: [ row ], - }); - } -} \ No newline at end of file diff --git a/src/commands/series.ts b/src/commands/series.ts deleted file mode 100644 index 16ae0db..0000000 --- a/src/commands/series.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { CommandInteraction, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import { CoreClient } from "../client/client"; -import AppLogger from "../client/appLogger"; -import SeriesHelper from "../helpers/SeriesHelper"; - -export default class Series extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("series") - .setDescription("View details on a series") - .addSubcommand(x => - x - .setName("view") - .setDescription("View a specifiic series by id") - .addStringOption(y => - y - .setName("id") - .setDescription("The series id") - .setRequired(true))) - .addSubcommand(x => - x - .setName("list") - .setDescription("List all series")) as SlashCommandBuilder; - } - - public override async execute(interaction: CommandInteraction) { - if (!interaction.isChatInputCommand()) return; - - switch (interaction.options.getSubcommand()) { - case "view": - await this.ViewSeries(interaction); - break; - case "list": - await this.ListSeries(interaction); - break; - default: - AppLogger.LogWarn("Commands/Series", `Subcommand doesn't exist: ${interaction.options.getSubcommand()}`); - await interaction.reply("Subcommand doesn't exist."); - } - } - - private async ViewSeries(interaction: CommandInteraction) { - const id = interaction.options.get("id"); - - AppLogger.LogSilly("Commands/Series/View", `Parameters: id=${id?.value}`); - - await interaction.deferReply(); - - if (!id) return; - - const series = CoreClient.Cards.find(x => x.id == id.value); - - if (!series) { - AppLogger.LogVerbose("Commands/Series/View", "Series not found."); - - await interaction.followUp("Series not found."); - return; - } - - try { - const embed = await SeriesHelper.GenerateSeriesViewPage(series.id, 0, interaction.user.id); - - await interaction.followUp({ - embeds: [ embed!.embed ], - components: [ embed!.row ], - files: [ embed!.image ], - }); - } catch (e) { - await interaction.followUp("An error has occured generating the series grid."); - AppLogger.CatchError("Series", e); - } - } - - private async ListSeries(interaction: CommandInteraction) { - const embed = SeriesHelper.GenerateSeriesListPage(0); - - await interaction.reply({ embeds: [ embed!.embed ], components: [ embed!.row ]}); - } -} diff --git a/src/commands/stage/dropnumber.ts b/src/commands/stage/dropnumber.ts index c61ed43..dd42a43 100644 --- a/src/commands/stage/dropnumber.ts +++ b/src/commands/stage/dropnumber.ts @@ -1,80 +1,76 @@ -import { AttachmentBuilder, CacheType, CommandInteraction, SlashCommandBuilder } from "discord.js"; +import { AttachmentBuilder, CacheType, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../../type/command"; +import Card from "../../database/entities/card/Card"; import { readFileSync } from "fs"; import Inventory from "../../database/entities/app/Inventory"; +import CardDropHelper from "../../helpers/CardDropHelper"; import { v4 } from "uuid"; import { CoreClient } from "../../client/client"; -import path from "path"; -import DropEmbedHelper from "../../helpers/DropHelpers/DropEmbedHelper"; -import AppLogger from "../../client/appLogger"; export default class Dropnumber extends Command { constructor() { super(); - this.CommandBuilder = new SlashCommandBuilder() - .setName("dropnumber") - .setDescription("(TEST) Summon a specific card") + super.CommandBuilder = new SlashCommandBuilder() + .setName('dropnumber') + .setDescription('(TEST) Summon a specific card') .addStringOption(x => x - .setName("cardnumber") - .setDescription("The card number to summon") + .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"); + const cardNumber = interaction.options.get('cardnumber'); if (!cardNumber || !cardNumber.value) { - await interaction.reply("Card Number is required"); + await interaction.reply('Card Number is required'); return; } - const card = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id == cardNumber.value); + const card = await Card.FetchOneByCardNumber(cardNumber.value.toString(), [ + "Series" + ]); if (!card) { - await interaction.reply("Card not found"); + await interaction.reply('Card not found'); return; } - const claimId = v4(); + const image = readFileSync(card.Path); + await interaction.deferReply(); - try { - const files = []; - let imageFileName = ""; + const attachment = new AttachmentBuilder(image, { name: card.FileName }); - if (!(card.path.startsWith("http://") || card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", card.path)); - imageFileName = card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - const series = CoreClient.Cards - .find(x => x.cards.includes(card))!; - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.id); + const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.CardNumber); const quantityClaimed = inventory ? inventory.Quantity : 0; - const embed = DropEmbedHelper.GenerateDropEmbed({ card, series }, quantityClaimed, imageFileName); + const embed = CardDropHelper.GenerateDropEmbed(card, quantityClaimed || 0); - const row = DropEmbedHelper.GenerateDropButtons({ card, series }, claimId, interaction.user.id); + const claimId = v4(); - await interaction.editReply({ - embeds: [ embed ], - files: files, - components: [ row ], - }); + const row = CardDropHelper.GenerateDropButtons(card, claimId, interaction.user.id); + + try { + await interaction.editReply({ + embeds: [ embed ], + files: [ attachment ], + components: [ row ], + }); } catch (e) { - AppLogger.CatchError("Dropnumber", e); - await interaction.editReply("Unable to send next drop. Please try again, and report this if it keeps happening"); + 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/commands/stage/droprarity.ts b/src/commands/stage/droprarity.ts index f776930..fa11b78 100644 --- a/src/commands/stage/droprarity.ts +++ b/src/commands/stage/droprarity.ts @@ -1,84 +1,81 @@ -import { AttachmentBuilder, CacheType, CommandInteraction, SlashCommandBuilder } from "discord.js"; +import { AttachmentBuilder, CacheType, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; import { Command } from "../../type/command"; -import { CardRarity, CardRarityChoices, CardRarityParse } from "../../constants/CardRarity"; +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 path from "path"; -import GetCardsHelper from "../../helpers/DropHelpers/GetCardsHelper"; -import DropEmbedHelper from "../../helpers/DropHelpers/DropEmbedHelper"; -import AppLogger from "../../client/appLogger"; +import { CoreClient } from "../../client/client"; export default class Droprarity extends Command { constructor() { super(); - this.CommandBuilder = new SlashCommandBuilder() - .setName("droprarity") - .setDescription("(TEST) Summon a random card of a specific rarity") + 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) - .setChoices(CardRarityChoices)); + .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"); + const rarity = interaction.options.get('rarity'); if (!rarity || !rarity.value) { - await interaction.reply("Rarity is required"); + await interaction.reply('Rarity is required'); return; } const rarityType = CardRarityParse(rarity.value.toString()); if (rarityType == CardRarity.Unknown) { - await interaction.reply("Invalid rarity"); + await interaction.reply('Invalid rarity'); return; } - const card = GetCardsHelper.GetRandomCardByRarity(rarityType); + const card = await CardDropHelper.GetRandomCardByRarity(rarityType); if (!card) { - await interaction.reply("Card not found"); + await interaction.reply('Card not found'); return; } - const claimId = v4(); + 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 { - const files = []; - let imageFileName = ""; - - if (!(card.card.path.startsWith("http://") || card.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", card.card.path)); - imageFileName = card.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - files.push(attachment); - } - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, card.card.id); - const quantityClaimed = inventory ? inventory.Quantity : 0; - - const embed = DropEmbedHelper.GenerateDropEmbed(card, quantityClaimed, imageFileName); - - const row = DropEmbedHelper.GenerateDropButtons(card, claimId, interaction.user.id); - await interaction.editReply({ embeds: [ embed ], - files: files, + files: [ attachment ], components: [ row ], }); } catch (e) { - AppLogger.CatchError("Droprarity", e); - await interaction.editReply("Unable to send next drop. Please try again, and report this if it keeps happening"); + 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/commands/stats.ts b/src/commands/stats.ts deleted file mode 100644 index e65ab93..0000000 --- a/src/commands/stats.ts +++ /dev/null @@ -1,51 +0,0 @@ -import {CommandInteraction, EmbedBuilder, PermissionsBitField, SlashCommandBuilder} from "discord.js"; -import {Command} from "../type/command"; -import {CoreClient} from "../client/client"; -import {CardRarity} from "../constants/CardRarity"; -import EmbedColours from "../constants/EmbedColours"; - -export default class Stats extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("stats") - .setDescription("Get bot stats such as card info") - .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator); - } - - public override async execute(interaction: CommandInteraction) { - const allCards = CoreClient.Cards.flatMap(x => x.cards); - - const totalCards = allCards.length; - const bronzeCards = allCards.filter(x => x.type == CardRarity.Bronze) - .length; - const silverCards = allCards.filter(x => x.type == CardRarity.Silver) - .length; - const goldCards = allCards.filter(x => x.type == CardRarity.Gold) - .length; - const mangaCards = allCards.filter(x => x.type == CardRarity.Manga) - .length; - const legendaryCards = allCards.filter(x => x.type == CardRarity.Legendary) - .length; - - const description = [ - `${totalCards} Total`, - `${bronzeCards} Bronze`, - `${silverCards} Silver`, - `${goldCards} Gold`, - `${mangaCards} Manga`, - `${legendaryCards} Legendary`, - ].join("\n"); - - const embed = new EmbedBuilder() - .setTitle("Stats") - .setDescription(description) - .setColor(EmbedColours.Ok); - - await interaction.reply({ - embeds: [ embed ], - ephemeral: true, - }); - } -} diff --git a/src/commands/trade.ts b/src/commands/trade.ts deleted file mode 100644 index fcd312a..0000000 --- a/src/commands/trade.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, CommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import Inventory from "../database/entities/app/Inventory"; -import { CoreClient } from "../client/client"; -import EmbedColours from "../constants/EmbedColours"; -import AppLogger from "../client/appLogger"; - -export default class Trade extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("trade") - .setDescription("Initiate a trade with another user.") - .addUserOption(x => - x - .setName("user") - .setDescription("User to trade with") - .setRequired(true)) - .addStringOption(x => - x - .setName("give") - .setDescription("Item to give") - .setRequired(true)) - .addStringOption(x => - x - .setName("receive") - .setDescription("Item to receive") - .setRequired(true)) - .addNumberOption(x => - x - .setName("givequantity") - .setDescription("Amount to give")) - .addNumberOption(x => - x - .setName("receivequantity") - .setDescription("Amount to receive")); - } - - public override async execute(interaction: CommandInteraction) { - const user = interaction.options.get("user", true).user!; - const give = interaction.options.get("give", true); - const receive = interaction.options.get("receive", true); - const givequantityInput = interaction.options.get("givequantity")?.value ?? 1; - const receivequantityInput = interaction.options.get("receivequantity")?.value ?? 1; - - const givequantity = Number(givequantityInput) || 1; - const receivequantity = Number(receivequantityInput) || 1; - - AppLogger.LogSilly("Commands/Trade", `Parameters: user=${user.id}, give=${give.value}, receive=${receive.value}`); - - if (interaction.user.id == user.id) { - await interaction.reply("You can not create a trade with yourself."); - return; - } - - const user1ItemEntity = await Inventory.FetchOneByCardNumberAndUserId(interaction.user.id, give.value!.toString()); - const user2ItemEntity = await Inventory.FetchOneByCardNumberAndUserId(user.id, receive.value!.toString()); - - if (!user1ItemEntity || user1ItemEntity.Quantity < givequantity) { - await interaction.reply("You do not have the item you are trying to trade."); - return; - } - - if (!user2ItemEntity || user2ItemEntity.Quantity < receivequantity) { - await interaction.reply("The user you are trying to trade with does not have the item you are trying to trade for."); - return; - } - - const user1Item = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id === give.value!.toString()); - - const user2Item = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id === receive.value!.toString()); - - if (!user1Item || !user2Item) { - await interaction.reply("One or more of the items you are trying to trade does not exist."); - return; - } - - const now = new Date(); - const expiry = now.setMinutes(now.getMinutes() + 15); - - const tradeEmbed = new EmbedBuilder() - .setTitle("⚠️ Trade Offer ⚠️") - .setDescription(`Trade initiated between ${interaction.user.username} and ${user.username}`) - .setColor(EmbedColours.Grey) - .setImage("https://media1.tenor.com/m/KkZwKl2AQ2QAAAAd/trade-offer.gif") - .addFields([ - { - name: `${interaction.user.username} Receives`, - value: `${user2Item.id}: ${user2Item.name} x${receivequantity}`, - inline: true, - }, - { - name: `${user.username} Receives`, - value: `${user1Item.id}: ${user1Item.name} x${givequantity}`, - inline: true, - }, - { - name: "Expires", - value: new Date(expiry).toLocaleString(), - } - ]); - - const timeoutId = setTimeout(async () => this.autoDecline(interaction, interaction.user.username, user.username, user1Item.id, user2Item.id, user1Item.name, user2Item.name, givequantity, receivequantity), 1000 * 60 * 15); // 15 minutes - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`trade accept ${interaction.user.id} ${user.id} ${user1Item.id} ${user2Item.id} ${expiry} ${timeoutId} ${givequantity} ${receivequantity}`) - .setLabel("Accept") - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId(`trade decline ${interaction.user.id} ${user.id} ${user1Item.id} ${user2Item.id} ${expiry} ${timeoutId} ${givequantity} ${receivequantity}`) - .setLabel("Decline") - .setStyle(ButtonStyle.Danger), - ]); - - await interaction.reply({ content: `${user}`, embeds: [ tradeEmbed ], components: [ row ] }); - } - - private async autoDecline(interaction: CommandInteraction, user1Username: string, user2Username: string, user1CardNumber: string, user2CardNumber: string, user1CardName: string, user2CardName: string, user1Quantity: number, user2Quantity: number) { - AppLogger.LogSilly("Commands/Trade/AutoDecline", `Auto declining trade between ${user1Username} and ${user2Username}`); - - const tradeEmbed = new EmbedBuilder() - .setTitle("Trade Expired") - .setDescription(`Trade initiated between ${user1Username} and ${user2Username}`) - .setColor(EmbedColours.Error) - .setImage("https://media1.tenor.com/m/KkZwKl2AQ2QAAAAd/trade-offer.gif") - .addFields([ - { - name: `${user1Username} Receives`, - value: `${user2CardNumber}: ${user2CardName} x${user2Quantity}`, - inline: true, - }, - { - name: `${user2Username} Receives`, - value: `${user1CardNumber}: ${user1CardName} x${user1Quantity}`, - inline: true, - }, - { - name: "Expired", - value: new Date().toLocaleString(), - } - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId("trade expired accept") - .setLabel("Accept") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("trade expired declined") - .setLabel("Decline") - .setStyle(ButtonStyle.Danger) - .setDisabled(true), - ]); - - await interaction.editReply({ embeds: [ tradeEmbed ], components: [ row ]}); - } -} \ No newline at end of file diff --git a/src/commands/view.ts b/src/commands/view.ts deleted file mode 100644 index 9a1d447..0000000 --- a/src/commands/view.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { CommandInteraction, SlashCommandBuilder } from "discord.js"; -import { Command } from "../type/command"; -import AppLogger from "../client/appLogger"; -import CardSearchHelper from "../helpers/CardSearchHelper"; - -export default class View extends Command { - constructor() { - super(); - - this.CommandBuilder = new SlashCommandBuilder() - .setName("view") - .setDescription("Search for a card by its name") - .addStringOption(x => - x - .setName("name") - .setDescription("The card name to search for") - .setRequired(true)); - } - - public override async execute(interaction: CommandInteraction) { - const name = interaction.options.get("name", true); - - AppLogger.LogSilly("Commands/View", `Parameters: name=${name.value}`); - - await interaction.deferReply(); - - const searchResult = await CardSearchHelper.GenerateSearchQuery(name.value!.toString(), interaction.user.id, 7); - - if (!searchResult) { - await interaction.editReply("No results found"); - return; - } - - await interaction.editReply({ - embeds: [ searchResult.embed ], - components: [ searchResult.row ], - files: searchResult.attachments, - }); - } -} \ No newline at end of file diff --git a/src/constants/CardConstants.ts b/src/constants/CardConstants.ts deleted file mode 100644 index 60a7f59..0000000 --- a/src/constants/CardConstants.ts +++ /dev/null @@ -1,13 +0,0 @@ -export default class CardConstants { - public static readonly ClaimCost = 10; - public static readonly TimerGiveAmount = 10; - public static readonly DailyCurrency = 100; - public static readonly StartingCurrency = 300; - - // Multidrop - public static readonly MultidropCost = this.ClaimCost * 10; - public static readonly MultidropQuantity = 11; - - // Effects - public static readonly UnusedChanceUpChance = 0.5; -} \ No newline at end of file diff --git a/src/constants/CardRarity.ts b/src/constants/CardRarity.ts index 0fcdec7..629130a 100644 --- a/src/constants/CardRarity.ts +++ b/src/constants/CardRarity.ts @@ -9,93 +9,53 @@ export enum CardRarity { Legendary, } -export const CardRarityChoices = [ - { - name: "Bronze", - value: "bronze", - }, - { - name: "Silver", - value: "silver", - }, - { - name: "Gold", - value: "gold", - }, - { - name: "Manga", - value: "manga", - }, - { - name: "Legendary", - value: "legendary", - }, -]; - export function CardRarityToString(rarity: CardRarity): string { switch (rarity) { - case CardRarity.Unknown: - return "Unknown"; - case CardRarity.Bronze: - return "Bronze"; - case CardRarity.Silver: - return "Silver"; - case CardRarity.Gold: - return "Gold"; - case CardRarity.Legendary: - return "Legendary"; - case CardRarity.Manga: - return "Manga"; + case CardRarity.Unknown: + return "Unknown"; + case CardRarity.Bronze: + return "Bronze"; + case CardRarity.Silver: + return "Silver"; + case CardRarity.Gold: + return "Gold"; + case CardRarity.Legendary: + return "Legendary"; + case CardRarity.Manga: + return "Manga"; } } export function CardRarityToColour(rarity: CardRarity): number { switch (rarity) { - case CardRarity.Unknown: - return EmbedColours.Grey; - case CardRarity.Bronze: - return EmbedColours.BronzeCard; - case CardRarity.Silver: - return EmbedColours.SilverCard; - case CardRarity.Gold: - return EmbedColours.GoldCard; - case CardRarity.Legendary: - return EmbedColours.LegendaryCard; - case CardRarity.Manga: - return EmbedColours.MangaCard; + case CardRarity.Unknown: + return EmbedColours.Grey; + case CardRarity.Bronze: + return EmbedColours.BronzeCard; + case CardRarity.Silver: + return EmbedColours.SilverCard; + case CardRarity.Gold: + return EmbedColours.GoldCard; + case CardRarity.Legendary: + return EmbedColours.LegendaryCard; + 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; - } -} - -export function GetSacrificeAmount(rarity: CardRarity): number { - switch (rarity) { - case CardRarity.Bronze: - return 5; - case CardRarity.Silver: - return 10; - case CardRarity.Gold: - return 30; - case CardRarity.Manga: - return 40; - case CardRarity.Legendary: - return 100; - default: - return 0; + 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/constants/EffectDetails.ts b/src/constants/EffectDetails.ts deleted file mode 100644 index 9d1f2b6..0000000 --- a/src/constants/EffectDetails.ts +++ /dev/null @@ -1,23 +0,0 @@ -class EffectDetail { - public readonly id: string; - public readonly friendlyName: string; - public readonly duration: number; - public readonly cost: number; - public readonly cooldown: number; - - constructor(id: string, friendlyName: string, duration: number, cost: number, cooldown: number) { - this.id = id; - this.friendlyName = friendlyName; - this.duration = duration; - this.cost = cost; - this.cooldown = cooldown; - } -}; - -export const EffectDetails = new Map([ - [ "unclaimed", new EffectDetail("unclaimed", "Unclaimed Chance Up", 10 * 60 * 1000, 100, 3 * 60 * 60 * 1000) ], -]); - -export const EffectChoices = [ - { name: "Unclaimed Chance Up", value: "unclaimed" }, -]; diff --git a/src/constants/EmbedColours.ts b/src/constants/EmbedColours.ts index f270eef..6094dbf 100644 --- a/src/constants/EmbedColours.ts +++ b/src/constants/EmbedColours.ts @@ -1,14 +1,6 @@ export default class EmbedColours { - // General public static readonly Ok = 0x3050ba; - public static readonly Success = 0x50c878; - public static readonly Error = 0xff0000; - - // Colours public static readonly Grey = 0xd3d3d3; - public static readonly Green = 0x228B22; - - // Card Types public static readonly BronzeCard = 0xcd7f32; public static readonly SilverCard = 0xc0c0c0; public static readonly GoldCard = 0xffd700; diff --git a/src/constants/ErrorMessages.ts b/src/constants/ErrorMessages.ts deleted file mode 100644 index c8749ec..0000000 --- a/src/constants/ErrorMessages.ts +++ /dev/null @@ -1,8 +0,0 @@ -export default class ErrorMessages { - public static readonly BotSyncing = "Bot is currently syncing, please wait until its done."; - public static readonly SafeMode = "Safe Mode has been activated, please resync to continue."; - public static readonly UnableToFetchCard = "Unable to fetch card, please try again."; - public static readonly UnableToFetchUser = "Unable to fetch user, please try again."; - - public static readonly NotEnoughCurrency = (need: number, have: number) => `Not enough currency! You need ${need} currency, you have ${have}!`; -} \ No newline at end of file diff --git a/src/contracts/AppBaseEntity.ts b/src/contracts/AppBaseEntity.ts index 43bed74..8419f00 100644 --- a/src/contracts/AppBaseEntity.ts +++ b/src/contracts/AppBaseEntity.ts @@ -11,13 +11,13 @@ export default class AppBaseEntity { } @PrimaryColumn() - Id: string; + Id: string; @Column() - WhenCreated: Date; + WhenCreated: Date; @Column() - WhenUpdated: Date; + WhenUpdated: Date; public async Save(target: EntityTarget, entity: DeepPartial): Promise { this.WhenUpdated = new Date(); @@ -27,24 +27,12 @@ export default class AppBaseEntity { await repository.save(entity); } - public static async SaveAll(target: EntityTarget, entities: DeepPartial[]): Promise { - const repository = AppDataSource.getRepository(target); - - await repository.save(entities); - } - public static async Remove(target: EntityTarget, entity: T): Promise { const repository = AppDataSource.getRepository(target); await repository.remove(entity); } - public static async RemoveMany(target: EntityTarget, entity: T[]): Promise { - const repository = AppDataSource.getRepository(target); - - await repository.remove(entity); - } - public static async FetchAll(target: EntityTarget, relations?: string[]): Promise { const repository = AppDataSource.getRepository(target); diff --git a/src/contracts/CardBaseEntity.ts b/src/contracts/CardBaseEntity.ts new file mode 100644 index 0000000..d498405 --- /dev/null +++ b/src/contracts/CardBaseEntity.ts @@ -0,0 +1,60 @@ +import { Column, DeepPartial, EntityTarget, PrimaryColumn, ObjectLiteral, FindOptionsWhere } from "typeorm"; +import { v4 } from "uuid"; +import AppDataSource from "../database/dataSources/appDataSource"; +import CardDataSource from "../database/dataSources/cardDataSource"; + +export default class CardBaseEntity { + constructor() { + this.Id = v4(); + + this.WhenCreated = new Date(); + this.WhenUpdated = new Date(); + } + + @PrimaryColumn() + Id: string; + + @Column() + WhenCreated: Date; + + @Column() + WhenUpdated: Date; + + public async Save(target: EntityTarget, entity: DeepPartial): Promise { + this.WhenUpdated = new Date(); + + const repository = CardDataSource.getRepository(target); + + await repository.save(entity); + } + + public static async Remove(target: EntityTarget, entity: T): Promise { + const repository = CardDataSource.getRepository(target); + + await repository.remove(entity); + } + + public static async FetchAll(target: EntityTarget, relations?: string[]): Promise { + const repository = CardDataSource.getRepository(target); + + const all = await repository.find({ relations: relations || [] }); + + return all; + } + + public static async FetchOneById(target: EntityTarget, id: string, relations?: string[]): Promise { + const repository = CardDataSource.getRepository(target); + + const single = await repository.findOne({ where: ({ Id: id } as FindOptionsWhere), relations: relations || {} }); + + return single; + } + + public static async Any(target: EntityTarget): Promise { + const repository = CardDataSource.getRepository(target); + + const any = await repository.find(); + + return any.length > 0; + } +} \ No newline at end of file diff --git a/src/contracts/EventExecutors.ts b/src/contracts/EventExecutors.ts deleted file mode 100644 index 0696f45..0000000 --- a/src/contracts/EventExecutors.ts +++ /dev/null @@ -1,19 +0,0 @@ - -import { DMChannel, Guild, GuildBan, GuildMember, Message, NonThreadGuildBasedChannel, PartialGuildMember, PartialMessage } from "discord.js"; - -interface EventExecutors { - ChannelCreate: ((channel: NonThreadGuildBasedChannel) => void)[], - ChannelDelete: ((channel: DMChannel | NonThreadGuildBasedChannel) => void)[], - ChannelUpdate: ((channel: DMChannel | NonThreadGuildBasedChannel) => void)[], - GuildBanAdd: ((ban: GuildBan) => void)[], - GuildBanRemove: ((ban: GuildBan) => void)[], - GuildCreate: ((guild: Guild) => void)[], - GuildMemberAdd: ((member: GuildMember) => void)[], - GuildMemberRemove: ((member: GuildMember | PartialGuildMember) => void)[], - GuildMemebrUpdate: ((oldMember: GuildMember | PartialGuildMember, newMember: GuildMember) => void)[], - MessageCreate: ((message: Message) => void)[], - MessageDelete: ((message: Message | PartialMessage) => void)[], - MessageUpdate: ((oldMessage: Message | PartialMessage, newMessage: Message | PartialMessage) => void)[], -} - -export default EventExecutors; \ No newline at end of file diff --git a/src/contracts/ButtonEventItem.ts b/src/contracts/IButtonEventItem.ts similarity index 74% rename from src/contracts/ButtonEventItem.ts rename to src/contracts/IButtonEventItem.ts index e139334..061a9c9 100644 --- a/src/contracts/ButtonEventItem.ts +++ b/src/contracts/IButtonEventItem.ts @@ -1,10 +1,8 @@ import { Environment } from "../constants/Environment"; import { ButtonEvent } from "../type/buttonEvent"; -interface ButtonEventItem { +export default interface IButtonEventItem { ButtonId: string, Event: ButtonEvent, Environment: Environment, -} - -export default ButtonEventItem; \ No newline at end of file +} \ No newline at end of file diff --git a/src/contracts/ICommandItem.ts b/src/contracts/ICommandItem.ts index 0524a8d..3ebc670 100644 --- a/src/contracts/ICommandItem.ts +++ b/src/contracts/ICommandItem.ts @@ -1,11 +1,9 @@ import { Environment } from "../constants/Environment"; import { Command } from "../type/command"; -interface ICommandItem { +export default interface ICommandItem { Name: string, Command: Command, Environment: Environment, ServerId?: string, -} - -export default ICommandItem; \ No newline at end of file +} \ No newline at end of file diff --git a/src/contracts/IEventItem.ts b/src/contracts/IEventItem.ts new file mode 100644 index 0000000..b7cc7bf --- /dev/null +++ b/src/contracts/IEventItem.ts @@ -0,0 +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 diff --git a/src/contracts/IGDriveFolderListing.ts b/src/contracts/IGDriveFolderListing.ts index 1187bca..95e8609 100644 --- a/src/contracts/IGDriveFolderListing.ts +++ b/src/contracts/IGDriveFolderListing.ts @@ -1,4 +1,4 @@ -export interface IGDriveFolderListing { +export default interface IGDriveFolderListing { id: string, name: string, -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/contracts/SeriesMetadata.ts b/src/contracts/SeriesMetadata.ts deleted file mode 100644 index 4dd2eb9..0000000 --- a/src/contracts/SeriesMetadata.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { CardRarity } from "../constants/CardRarity"; - -export interface SeriesMetadata { - id: number, - name: string, - cards: CardMetadata[], -} - -export interface CardMetadata { - id: string, - name: string, - type: CardRarity, - path: string, - subseries?: string, - colour?: string, -} - -export interface DropResult { - series: SeriesMetadata, - card: CardMetadata, -} \ No newline at end of file diff --git a/src/contracts/StringDropdownEventItem.ts b/src/contracts/StringDropdownEventItem.ts deleted file mode 100644 index 1a7b0aa..0000000 --- a/src/contracts/StringDropdownEventItem.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {Environment} from "../constants/Environment"; -import {StringDropdownEvent} from "../type/stringDropdownEvent"; - -interface StringDropdownEventItem { - DropdownId: string, - Event: StringDropdownEvent, - Environment: Environment, -} - -export default StringDropdownEventItem; diff --git a/src/database/dataSources/cardDataSource.ts b/src/database/dataSources/cardDataSource.ts new file mode 100644 index 0000000..f32a7f2 --- /dev/null +++ b/src/database/dataSources/cardDataSource.ts @@ -0,0 +1,22 @@ +import { DataSource } from "typeorm"; +import * as dotenv from "dotenv"; + +dotenv.config(); + +const CardDataSource = new DataSource({ + type: "sqlite", + database: process.env.DB_CARD_FILE!, + synchronize: true, + logging: process.env.DB_LOGGING == "true", + entities: [ + "dist/database/entities/card/**/*.js", + ], + migrations: [ + "dist/database/migrations/card/**/*.js", + ], + subscribers: [ + "dist/database/subscribers/card/**/*.js", + ], +}); + +export default CardDataSource; \ No newline at end of file diff --git a/src/database/entities/app/Claim.ts b/src/database/entities/app/Claim.ts index 7cdee38..b4cde5e 100644 --- a/src/database/entities/app/Claim.ts +++ b/src/database/entities/app/Claim.ts @@ -12,10 +12,10 @@ export default class Claim extends AppBaseEntity { } @Column() - ClaimId: string; + ClaimId: string; @ManyToOne(() => Inventory, x => x.Claims) - Inventory: Inventory; + Inventory: Inventory; public SetInventory(inventory: Inventory) { this.Inventory = inventory; diff --git a/src/database/entities/app/Config.ts b/src/database/entities/app/Config.ts index e97728a..50915d0 100644 --- a/src/database/entities/app/Config.ts +++ b/src/database/entities/app/Config.ts @@ -12,10 +12,10 @@ export default class Config extends AppBaseEntity { } @Column() - Key: string; + Key: string; @Column() - Value: string; + Value: string; public SetValue(value: string) { this.Value = value; diff --git a/src/database/entities/app/Inventory.ts b/src/database/entities/app/Inventory.ts index c780dad..adec824 100644 --- a/src/database/entities/app/Inventory.ts +++ b/src/database/entities/app/Inventory.ts @@ -14,31 +14,21 @@ export default class Inventory extends AppBaseEntity { } @Column() - UserId: string; + UserId: string; @Column() - CardNumber: string; + CardNumber: string; @Column() - Quantity: number; + Quantity: number; @OneToMany(() => Claim, x => x.Inventory) - Claims: Claim[]; + Claims: Claim[]; public SetQuantity(quantity: number) { this.Quantity = quantity; } - public RemoveQuantity(amount: number) { - if (this.Quantity < amount) return; - - this.Quantity -= amount; - } - - public AddQuantity(amount: number) { - this.Quantity += amount; - } - public AddClaim(claim: Claim) { this.Claims.push(claim); } @@ -50,12 +40,4 @@ export default class Inventory extends AppBaseEntity { return single; } - - public static async FetchAllByUserId(userId: string): Promise { - const repository = AppDataSource.getRepository(Inventory); - - const all = await repository.find({ where: { UserId: userId }}); - - return all; - } -} +} \ No newline at end of file diff --git a/src/database/entities/app/User.ts b/src/database/entities/app/User.ts deleted file mode 100644 index 3a9018d..0000000 --- a/src/database/entities/app/User.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Column, Entity } from "typeorm"; -import AppBaseEntity from "../../../contracts/AppBaseEntity"; - -@Entity() -export default class User extends AppBaseEntity { - constructor(userId: string, currency: number) { - super(); - - this.Id = userId; - this.Currency = currency; - } - - @Column() - Currency: number; - - @Column({ nullable: true }) - LastUsedDaily?: Date; - - public AddCurrency(amount: number) { - this.Currency += amount; - } - - public RemoveCurrency(amount: number): boolean { - if (this.Currency < amount) return false; - - this.Currency -= amount; - - return true; - } - - public UpdateLastUsedDaily(lastUsedDaily: Date) { - this.LastUsedDaily = lastUsedDaily; - } -} \ No newline at end of file diff --git a/src/database/entities/app/UserEffect.ts b/src/database/entities/app/UserEffect.ts deleted file mode 100644 index 447b9c5..0000000 --- a/src/database/entities/app/UserEffect.ts +++ /dev/null @@ -1,86 +0,0 @@ -import {Column, Entity} from "typeorm"; -import AppBaseEntity from "../../../contracts/AppBaseEntity"; -import AppDataSource from "../../dataSources/appDataSource"; - -@Entity() -export default class UserEffect extends AppBaseEntity { - constructor(name: string, userId: string, unused: number, WhenExpires?: Date) { - super(); - - this.Name = name; - this.UserId = userId; - this.Unused = unused; - this.WhenExpires = WhenExpires; - } - - @Column() - Name: string; - - @Column() - UserId: string; - - @Column() - Unused: number; - - @Column({ nullable: true }) - WhenExpires?: Date; - - public AddUnused(amount: number) { - this.Unused += amount; - } - - public UseEffect(whenExpires: Date): boolean { - if (this.Unused == 0) { - return false; - } - - this.Unused -= 1; - this.WhenExpires = whenExpires; - - return true; - } - - public IsEffectActive(): boolean { - const now = new Date(); - - if (this.WhenExpires && now < this.WhenExpires) { - return true; - } - - return false; - } - - public static async FetchOneByUserIdAndName(userId: string, name: string): Promise { - const repository = AppDataSource.getRepository(UserEffect); - - const single = await repository.findOne({ where: { UserId: userId, Name: name } }); - - return single; - } - - public static async FetchAllByUserIdPaginated(userId: string, page: number = 0, itemsPerPage: number = 10): Promise<[UserEffect[], number]> { - const repository = AppDataSource.getRepository(UserEffect); - - const query = await repository.createQueryBuilder("effect") - .where("effect.UserId = :userId", { userId }) - .andWhere("effect.Unused > 0") - .orderBy("effect.Name", "ASC") - .skip(page * itemsPerPage) - .take(itemsPerPage) - .getManyAndCount(); - - return query; - } - - public static async FetchActiveEffectByUserId(userId: string): Promise { - const repository = AppDataSource.getRepository(UserEffect); - - const query = await repository.createQueryBuilder("effect") - .where("effect.UserId = :userId", { userId }) - .andWhere("effect.WhenExpires IS NOT NULL") - .andWhere("effect.WhenExpires > :now", { now: new Date() }) - .getOne(); - - return query; - } -} diff --git a/src/database/entities/card/Card.ts b/src/database/entities/card/Card.ts new file mode 100644 index 0000000..295c310 --- /dev/null +++ b/src/database/entities/card/Card.ts @@ -0,0 +1,53 @@ +import { Column, Entity, ManyToOne } from "typeorm"; +import CardBaseEntity from "../../../contracts/CardBaseEntity"; +import { CardRarity } from "../../../constants/CardRarity"; +import Series from "./Series"; +import CardDataSource from "../../dataSources/cardDataSource"; + +@Entity() +export default class Card extends CardBaseEntity { + constructor(cardNumber: string, name: string, rarity: CardRarity, path: string, fileName: string, series: Series) { + super(); + + this.CardNumber = cardNumber; + this.Name = name; + this.Rarity = rarity; + this.Path = path; + this.FileName = fileName; + this.Series = series; + } + + @Column() + CardNumber: string; + + @Column() + Name: string; + + @Column() + Rarity: CardRarity; + + @Column() + Path: string; + + @Column() + FileName: string; + + @ManyToOne(() => Series, x => x.Cards) + Series: Series; + + public static async FetchOneByCardNumber(cardNumber: string, relations?: string[]): Promise { + const repository = CardDataSource.getRepository(Card); + + const single = await repository.findOne({ where: { CardNumber: cardNumber }, relations: relations || [] }); + + return single; + } + + public static async FetchAllByRarity(rarity: CardRarity, relations?: string[]): Promise { + const repository = CardDataSource.getRepository(Card); + + const all = await repository.find({ where: { Rarity: rarity }, relations: relations || [] }); + + return all; + } +} \ No newline at end of file diff --git a/src/database/entities/card/Series.ts b/src/database/entities/card/Series.ts new file mode 100644 index 0000000..eb990cc --- /dev/null +++ b/src/database/entities/card/Series.ts @@ -0,0 +1,23 @@ +import { Column, Entity, OneToMany } from "typeorm"; +import CardBaseEntity from "../../../contracts/CardBaseEntity"; +import Card from "./Card"; + +@Entity() +export default class Series extends CardBaseEntity { + constructor(id: string, name: string, path: string) { + super(); + + this.Id = id; + this.Name = name; + this.Path = path; + } + + @Column() + Name: string; + + @Column() + Path: string; + + @OneToMany(() => Card, x => x.Series) + Cards: Card[]; +} \ No newline at end of file diff --git a/src/database/migrations/app/0.1.5/1694609771821-CreateClaim.ts b/src/database/migrations/app/0.1.5/1694609771821-CreateClaim.ts index ed048c7..22fe74c 100644 --- a/src/database/migrations/app/0.1.5/1694609771821-CreateClaim.ts +++ b/src/database/migrations/app/0.1.5/1694609771821-CreateClaim.ts @@ -1,17 +1,17 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import MigrationHelper from "../../../../helpers/MigrationHelper"; +import { MigrationInterface, QueryRunner } from "typeorm" +import MigrationHelper from "../../../../helpers/MigrationHelper" export class CreateClaim1694609771821 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { - MigrationHelper.Up("1694609771821-CreateClaim", "0.1.5", [ - "01-CreateClaim", - "02-MoveToClaim", - "03-AlterInventory", + MigrationHelper.Up('1694609771821-CreateClaim', '0.1.5', [ + '01-CreateClaim', + '02-MoveToClaim', + '03-AlterInventory', ], queryRunner); } - public async down(): Promise { + public async down(queryRunner: QueryRunner): Promise { } } diff --git a/src/database/migrations/app/0.1/1693769942868-CreateBase.ts b/src/database/migrations/app/0.1/1693769942868-CreateBase.ts index 006aa55..709cd3d 100644 --- a/src/database/migrations/app/0.1/1693769942868-CreateBase.ts +++ b/src/database/migrations/app/0.1/1693769942868-CreateBase.ts @@ -1,15 +1,15 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import MigrationHelper from "../../../../helpers/MigrationHelper"; +import { MigrationInterface, QueryRunner } from "typeorm" +import MigrationHelper from "../../../../helpers/MigrationHelper" export class CreateBase1693769942868 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { - MigrationHelper.Up("1693769942868-CreateBase", "0.1", [ + MigrationHelper.Up('1693769942868-CreateBase', '0.1', [ "01-table/Inventory", ], queryRunner); } - public async down(): Promise { + public async down(queryRunner: QueryRunner): Promise { } } diff --git a/src/database/migrations/app/0.2/1699814500650-createConfig.ts b/src/database/migrations/app/0.2/1699814500650-createConfig.ts index 2725eee..0a1f22e 100644 --- a/src/database/migrations/app/0.2/1699814500650-createConfig.ts +++ b/src/database/migrations/app/0.2/1699814500650-createConfig.ts @@ -1,15 +1,15 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import MigrationHelper from "../../../../helpers/MigrationHelper"; +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", [ + MigrationHelper.Up('1699814500650-createConfig', '0.2', [ "01-table/Config", ], queryRunner); } - public async down(): Promise { + public async down(queryRunner: QueryRunner): Promise { } } diff --git a/src/database/migrations/app/0.6/1713289062969-user.ts b/src/database/migrations/app/0.6/1713289062969-user.ts deleted file mode 100644 index 151db88..0000000 --- a/src/database/migrations/app/0.6/1713289062969-user.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import MigrationHelper from "../../../../helpers/MigrationHelper"; - -export class User1713289062969 implements MigrationInterface { - - public async up(queryRunner: QueryRunner): Promise { - MigrationHelper.Up("1713289062969-user", "0.6", [ - "01-table/User", - ], queryRunner); - } - - public async down(): Promise { - } - -} diff --git a/src/database/migrations/app/0.6/1715967355818-daily.ts b/src/database/migrations/app/0.6/1715967355818-daily.ts deleted file mode 100644 index 1c81d18..0000000 --- a/src/database/migrations/app/0.6/1715967355818-daily.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import MigrationHelper from "../../../../helpers/MigrationHelper"; - -export class Daily1715967355818 implements MigrationInterface { - - public async up(queryRunner: QueryRunner): Promise { - MigrationHelper.Up("1715967355818-daily", "0.6", [ - "01-table/User", - ], queryRunner); - } - - public async down(): Promise { - } - -} diff --git a/src/database/migrations/app/0.9/1729962056556-createUserEffect.ts b/src/database/migrations/app/0.9/1729962056556-createUserEffect.ts deleted file mode 100644 index f59b7d4..0000000 --- a/src/database/migrations/app/0.9/1729962056556-createUserEffect.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import MigrationHelper from "../../../../helpers/MigrationHelper"; - -export class CreateUserEffect1729962056556 implements MigrationInterface { - - public async up(queryRunner: QueryRunner): Promise { - MigrationHelper.Up("1729962056556-createUserEffect", "0.9", [ - "01-table-userEffect", - ], queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - MigrationHelper.Down("1729962056556-createUserEffect", "0.9", [ - "01-table-userEffect", - ], queryRunner); - } - -} diff --git a/src/database/migrations/card/.gitkeep b/src/database/migrations/card/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/helpers/CardDropHelper.ts b/src/helpers/CardDropHelper.ts new file mode 100644 index 0000000..9f65d69 --- /dev/null +++ b/src/helpers/CardDropHelper.ts @@ -0,0 +1,63 @@ +import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; +import { CardRarity, CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; +import CardRarityChances from "../constants/CardRarityChances"; +import Card from "../database/entities/card/Card"; + +export default class CardDropHelper { + public static async GetRandomCard(): Promise { + const randomRarity = Math.random() * 100; + + let cardRarity: CardRarity; + + const bronzeChance = CardRarityChances.Bronze; + const silverChance = bronzeChance + CardRarityChances.Silver; + const goldChance = silverChance + CardRarityChances.Gold; + const mangaChance = goldChance + CardRarityChances.Manga; + + if (randomRarity < bronzeChance) cardRarity = CardRarity.Bronze; + else if (randomRarity < silverChance) cardRarity = CardRarity.Silver; + else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; + else if (randomRarity < mangaChance) cardRarity = CardRarity.Manga; + else cardRarity = CardRarity.Legendary; + + const randomCard = await this.GetRandomCardByRarity(cardRarity); + + return randomCard; + } + + public static async GetRandomCardByRarity(rarity: CardRarity): Promise { + const allCards = await Card.FetchAllByRarity(rarity, [ "Series" ]); + + const randomCardIndex = Math.floor(Math.random() * allCards.length); + + const card = allCards[randomCardIndex]; + + 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/helpers/CardSearchHelper.ts b/src/helpers/CardSearchHelper.ts deleted file mode 100644 index df0265c..0000000 --- a/src/helpers/CardSearchHelper.ts +++ /dev/null @@ -1,116 +0,0 @@ -import {ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder} from "discord.js"; -import Fuse from "fuse.js"; -import {CoreClient} from "../client/client.js"; -import Inventory from "../database/entities/app/Inventory.js"; -import {readFileSync} from "fs"; -import path from "path"; -import AppLogger from "../client/appLogger.js"; -import GetCardsHelper from "./DropHelpers/GetCardsHelper.js"; -import DropEmbedHelper from "./DropHelpers/DropEmbedHelper.js"; - -interface ReturnedPage { - embed: EmbedBuilder, - row: ActionRowBuilder, - attachments: AttachmentBuilder[], - results: string[], -} - -export default class CardSearchHelper { - public static async GenerateSearchQuery(query: string, userid: string, pages: number): Promise { - AppLogger.LogSilly("CardSearchHelper/GenerateSearchQuery", `Parameters: query=${query}, userid=${userid}, pages=${pages}`); - - const fzf = new Fuse(CoreClient.Cards.flatMap(x => x.cards), { keys: ["name"] }); - const entries = fzf.search(query) - .splice(0, pages); - - const entry = entries[0]; - const results = entries - .flatMap(x => x.item.id); - - if (!entry) { - AppLogger.LogVerbose("CardSearchHelper/GenerateSearchQuery", `Unable to find entry: ${query}`); - - return undefined; - } - - const card = GetCardsHelper.GetCardByCardNumber(entry.item.id); - - if (!card) return undefined; - - const attachments = []; - let imageFileName = ""; - - if (!(card.card.path.startsWith("http://") || card.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", card.card.path)); - imageFileName = card.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - attachments.push(attachment); - } - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(userid, card.card.id); - const quantityClaimed = inventory?.Quantity ?? 0; - - const embed = DropEmbedHelper.GenerateDropEmbed(card, quantityClaimed, imageFileName); - - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`view 0 ${results.join(" ")}`) - .setLabel("Previous") - .setStyle(ButtonStyle.Primary) - .setDisabled(true), - new ButtonBuilder() - .setCustomId(`view 2 ${results.join(" ")}`) - .setLabel("Next") - .setStyle(ButtonStyle.Primary) - .setDisabled(pages == 1)); - - return { embed, row, attachments, results }; - } - - public static async GenerateSearchPageFromQuery(results: string[], userid: string, page: number): Promise { - const currentPageId = results[page - 1]; - - const card = GetCardsHelper.GetCardByCardNumber(currentPageId); - - if (!card) { - AppLogger.LogError("CardSearchHelper/GenerateSearchPageFromQuery", `Unable to find card by id: ${currentPageId}.`); - - return undefined; - } - - const attachments = []; - let imageFileName = ""; - - if (!(card.card.path.startsWith("http://") || card.card.path.startsWith("https://"))) { - const image = readFileSync(path.join(process.env.DATA_DIR!, "cards", card.card.path)); - imageFileName = card.card.path.split("/").pop()!; - - const attachment = new AttachmentBuilder(image, { name: imageFileName }); - - attachments.push(attachment); - } - - const inventory = await Inventory.FetchOneByCardNumberAndUserId(userid, card.card.id); - const quantityClaimed = inventory?.Quantity ?? 0; - - const embed = DropEmbedHelper.GenerateDropEmbed(card, quantityClaimed, imageFileName); - - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`view ${page - 1} ${results.join(" ")}`) - .setLabel("Previous") - .setStyle(ButtonStyle.Primary) - .setDisabled(page - 1 == 0), - new ButtonBuilder() - .setCustomId(`view ${page + 1} ${results.join(" ")}`) - .setLabel("Next") - .setStyle(ButtonStyle.Primary) - .setDisabled(page == results.length)); - - return { embed, row, attachments, results }; - } -} diff --git a/src/helpers/DropHelpers/DropEmbedHelper.ts b/src/helpers/DropHelpers/DropEmbedHelper.ts deleted file mode 100644 index 5956a27..0000000 --- a/src/helpers/DropHelpers/DropEmbedHelper.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; -import { DropResult } from "../../contracts/SeriesMetadata"; -import AppLogger from "../../client/appLogger"; -import { CardRarityToColour, CardRarityToString } from "../../constants/CardRarity"; -import StringTools from "../StringTools"; - -export default class DropEmbedHelper { - public static GenerateDropEmbed(drop: DropResult, quantityClaimed: number, imageFileName: string, claimedBy?: string, currency?: number): EmbedBuilder { - AppLogger.LogSilly("CardDropHelperMetadata/GenerateDropEmbed", `Parameters: drop=${drop.card.id}, quantityClaimed=${quantityClaimed}, imageFileName=${imageFileName}`); - - const description = drop.card.subseries ?? drop.series.name; - let colour = CardRarityToColour(drop.card.type); - - if (drop.card.colour && StringTools.IsHexCode(drop.card.colour)) { - const hexCode = Number("0x" + drop.card.colour); - - if (hexCode) { - colour = hexCode; - } else { - AppLogger.LogWarn("CardDropHelperMetadata/GenerateDropEmbed", `Card's colour override is invalid: ${drop.card.id}, ${drop.card.colour}`); - } - } else if (drop.card.colour) { - AppLogger.LogWarn("CardDropHelperMetadata/GenerateDropEmbed", `Card's colour override is invalid: ${drop.card.id}, ${drop.card.colour}`); - } - - let imageUrl = `attachment://${imageFileName}`; - - if (drop.card.path.startsWith("http://") || drop.card.path.startsWith("https://")) { - imageUrl = drop.card.path; - } - - const embed = new EmbedBuilder() - .setTitle(drop.card.name) - .setDescription(description) - .setFooter({ text: `${CardRarityToString(drop.card.type)} · ${drop.card.id}` }) - .setColor(colour) - .setImage(imageUrl) - .addFields([ - { - name: "Claimed", - value: `${quantityClaimed}`, - inline: true, - } - ]); - - if (claimedBy != null) { - embed.addFields([ - { - name: "Claimed by", - value: claimedBy, - inline: true, - } - ]); - } - - if (currency != null) { - embed.addFields([ - { - name: "Currency", - value: `${currency}`, - inline: true, - } - ]); - } - - return embed; - } - - public static GenerateDropButtons(drop: DropResult, claimId: string, userId: string, disabled: boolean = false): ActionRowBuilder { - AppLogger.LogSilly("CardDropHelperMetadata/GenerateDropButtons", `Parameters: drop=${drop.card.id}, claimId=${claimId}, userId=${userId}`); - - return new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`claim ${drop.card.id} ${claimId} ${userId}`) - .setLabel("Claim") - .setStyle(ButtonStyle.Success) - .setDisabled(disabled), - new ButtonBuilder() - .setCustomId(`sacrifice give ${userId} ${drop.card.id} 1`) - .setLabel(`Sacrifice`) - .setStyle(ButtonStyle.Danger), - new ButtonBuilder() - .setCustomId("reroll") - .setEmoji("🔁") - .setStyle(ButtonStyle.Primary),); - } -} \ No newline at end of file diff --git a/src/helpers/DropHelpers/GetCardsHelper.ts b/src/helpers/DropHelpers/GetCardsHelper.ts deleted file mode 100644 index 4c8648f..0000000 --- a/src/helpers/DropHelpers/GetCardsHelper.ts +++ /dev/null @@ -1,91 +0,0 @@ -import AppLogger from "../../client/appLogger"; -import { CoreClient } from "../../client/client"; -import CardConstants from "../../constants/CardConstants"; -import { CardRarity } from "../../constants/CardRarity"; -import CardRarityChances from "../../constants/CardRarityChances"; -import { DropResult } from "../../contracts/SeriesMetadata"; -import EffectHelper from "../EffectHelper"; -import GetUnclaimedCardsHelper from "./GetUnclaimedCardsHelper"; - -export default class GetCardsHelper { - public static async FetchCard(userId: string): Promise { - const hasChanceUpEffect = await EffectHelper.HasEffect(userId, "unclaimed"); - - if (hasChanceUpEffect && Math.random() <= CardConstants.UnusedChanceUpChance) { - return await GetUnclaimedCardsHelper.GetRandomCardUnclaimed(userId); - } - - return this.GetRandomCard(); - } - - public static GetRandomCard(): DropResult | undefined { - const randomRarity = Math.random() * 100; - - let cardRarity: CardRarity; - - const bronzeChance = CardRarityChances.Bronze; - const silverChance = bronzeChance + CardRarityChances.Silver; - const goldChance = silverChance + CardRarityChances.Gold; - const mangaChance = goldChance + CardRarityChances.Manga; - - if (randomRarity < bronzeChance) cardRarity = CardRarity.Bronze; - else if (randomRarity < silverChance) cardRarity = CardRarity.Silver; - else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; - else if (randomRarity < mangaChance) cardRarity = CardRarity.Manga; - else cardRarity = CardRarity.Legendary; - - const randomCard = this.GetRandomCardByRarity(cardRarity); - - AppLogger.LogSilly("CardDropHelperMetadata/GetRandomCard", `Random card: ${randomCard?.card.id} ${randomCard?.card.name}`); - - return randomCard; - } - - public static GetRandomCardByRarity(rarity: CardRarity): DropResult | undefined { - AppLogger.LogSilly("CardDropHelperMetadata/GetRandomCardByRarity", `Parameters: rarity=${rarity}`); - - const allCards = CoreClient.Cards - .flatMap(x => x.cards) - .filter(x => x.type == rarity); - - const randomCardIndex = Math.floor(Math.random() * allCards.length); - - const card = allCards[randomCardIndex]; - const series = CoreClient.Cards - .find(x => x.cards.includes(card)); - - if (!series) { - AppLogger.LogError("CardDropHelperMetadata/GetRandomCardByRarity", `Series not found for card ${card.id}`); - - return undefined; - } - - AppLogger.LogSilly("CardDropHelperMetadata/GetRandomCardByRarity", `Random card: ${card.id} ${card.name}`); - - return { - series: series, - card: card, - }; - } - - public static GetCardByCardNumber(cardNumber: string): DropResult | undefined { - AppLogger.LogSilly("CardDropHelperMetadata/GetCardByCardNumber", `Parameters: cardNumber=${cardNumber}`); - - const card = CoreClient.Cards - .flatMap(x => x.cards) - .find(x => x.id == cardNumber); - - const series = CoreClient.Cards - .find(x => x.cards.find(y => y.id == card?.id)); - - AppLogger.LogSilly("CardDropHelperMetadata/GetCardByCardNumber", `Card: ${card?.id} ${card?.name}`); - AppLogger.LogSilly("CardDropHelperMetadata/GetCardByCardNumber", `Series: ${series?.id} ${series?.name}`); - - if (!card || !series) { - AppLogger.LogVerbose("CardDropHelperMetadata/GetCardByCardNumber", `Unable to find card metadata: ${cardNumber}`); - return undefined; - } - - return { card, series }; - } -} diff --git a/src/helpers/DropHelpers/GetUnclaimedCardsHelper.ts b/src/helpers/DropHelpers/GetUnclaimedCardsHelper.ts deleted file mode 100644 index 94ce894..0000000 --- a/src/helpers/DropHelpers/GetUnclaimedCardsHelper.ts +++ /dev/null @@ -1,73 +0,0 @@ -import AppLogger from "../../client/appLogger"; -import { CoreClient } from "../../client/client"; -import { CardRarity } from "../../constants/CardRarity"; -import CardRarityChances from "../../constants/CardRarityChances"; -import { DropResult } from "../../contracts/SeriesMetadata"; -import Inventory from "../../database/entities/app/Inventory"; -import GetCardsHelper from "./GetCardsHelper"; - -export default class GetUnclaimedCardsHelper { - public static async GetRandomCardUnclaimed(userId: string): Promise { - const randomRarity = Math.random() * 100; - - let cardRarity: CardRarity; - - const bronzeChance = CardRarityChances.Bronze; - const silverChance = bronzeChance + CardRarityChances.Silver; - const goldChance = silverChance + CardRarityChances.Gold; - const mangaChance = goldChance + CardRarityChances.Manga; - - if (randomRarity < bronzeChance) cardRarity = CardRarity.Bronze; - else if (randomRarity < silverChance) cardRarity = CardRarity.Silver; - else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; - else if (randomRarity < mangaChance) cardRarity = CardRarity.Manga; - else cardRarity = CardRarity.Legendary; - - const randomCard = await this.GetRandomCardByRarityUnclaimed(cardRarity, userId); - - return randomCard; - } - - public static async GetRandomCardByRarityUnclaimed(rarity: CardRarity, userId: string): Promise { - const claimedCards = await Inventory.FetchAllByUserId(userId); - - if (!claimedCards || claimedCards.length == 0) { - // They don't have any cards, so safe to get any random card - return GetCardsHelper.GetRandomCardByRarity(rarity); - } - - const allCards = CoreClient.Cards - .flatMap(x => x.cards) - .filter(x => x.type == rarity) - .filter(x => !claimedCards.find(y => y.CardNumber == x.id && y.Quantity > 0)); - - if (!allCards || allCards.length == 0) { - // There is no card left unclaimed, fallback to any card - return GetCardsHelper.GetRandomCardByRarity(rarity); - }; - - const randomCardIndex = Math.floor(Math.random() * allCards.length); - - const card = allCards[randomCardIndex]; - - if (!card) { - AppLogger.LogError("CardDropHelperMetadata/GetRandomCardByRarityUnclaimed", `Card not found in index, ${randomCardIndex} of ${allCards.length}, User Id: ${userId}, rarity: ${rarity}`); - - return undefined; - } - - const series = CoreClient.Cards - .find(x => x.cards.includes(card)); - - if (!series) { - AppLogger.LogError("CardDropHelperMetadata/GetRandomCardByRarityUnclaimed", `Series not found for card ${card.id}, User Id: ${userId}, rarity: ${rarity}`); - - return undefined; - } - - return { - series: series, - card: card, - }; - } -} diff --git a/src/helpers/DropHelpers/MultidropEmbedHelper.ts b/src/helpers/DropHelpers/MultidropEmbedHelper.ts deleted file mode 100644 index 526993e..0000000 --- a/src/helpers/DropHelpers/MultidropEmbedHelper.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; -import { DropResult } from "../../contracts/SeriesMetadata"; -import { GetSacrificeAmount } from "../../constants/CardRarity"; -import DropEmbedHelper from "./DropEmbedHelper"; - -export default class MultidropEmbedHelper { - public static GenerateMultidropEmbed(drop: DropResult, quantityClaimed: number, imageFileName: string, cardsRemaining: number, claimedBy?: string, currency?: number): EmbedBuilder { - const dropEmbed = DropEmbedHelper.GenerateDropEmbed(drop, quantityClaimed, imageFileName, claimedBy, currency); - - dropEmbed.setFooter({ text: `${dropEmbed.data.footer?.text} · ${cardsRemaining} Remaining`}); - - return dropEmbed; - } - - public static GenerateMultidropButtons(drop: DropResult, cardsRemaining: number, userId: string, disabled = false): ActionRowBuilder { - return new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`multidrop keep ${drop.card.id} ${cardsRemaining} ${userId}`) - .setLabel("Keep") - .setStyle(ButtonStyle.Primary) - .setDisabled(disabled), - new ButtonBuilder() - .setCustomId(`multidrop sacrifice ${drop.card.id} ${cardsRemaining} ${userId}`) - .setLabel(`Sacrifice (+${GetSacrificeAmount(drop.card.type)} 🪙)`) - .setStyle(ButtonStyle.Secondary)); - } -} diff --git a/src/helpers/EffectHelper.ts b/src/helpers/EffectHelper.ts deleted file mode 100644 index 09e096c..0000000 --- a/src/helpers/EffectHelper.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; -import UserEffect from "../database/entities/app/UserEffect"; -import EmbedColours from "../constants/EmbedColours"; -import { EffectDetails } from "../constants/EffectDetails"; -import User from "../database/entities/app/User"; -import CardConstants from "../constants/CardConstants"; -import AppLogger from "../client/appLogger"; - -export default class EffectHelper { - public static async AddEffectToUserInventory(userId: string, name: string, quantity: number = 1) { - let effect = await UserEffect.FetchOneByUserIdAndName(userId, name); - - if (!effect) { - effect = new UserEffect(name, userId, quantity); - } else { - effect.AddUnused(quantity); - } - - await effect.Save(UserEffect, effect); - } - - public static async UseEffect(userId: string, name: string, whenExpires: Date): Promise { - const canUseEffect = await this.CanUseEffect(userId, name); - - if (!canUseEffect) return false; - - const effect = await UserEffect.FetchOneByUserIdAndName(userId, name); - - effect!.UseEffect(whenExpires); - - await effect!.Save(UserEffect, effect!); - - return true; - } - - public static async CanUseEffect(userId: string, name: string): Promise { - const effect = await UserEffect.FetchOneByUserIdAndName(userId, name); - const now = new Date(); - - if (!effect || effect.Unused == 0) { - return false; - } - - const effectDetail = EffectDetails.get(effect.Name); - - if (!effectDetail) { - return false; - } - - if (effect.WhenExpires && now < new Date(effect.WhenExpires.getTime() + effectDetail.cooldown)) { - return false; - } - - return true; - } - - public static async HasEffect(userId: string, name: string): Promise { - const effect = await UserEffect.FetchOneByUserIdAndName(userId, name); - const now = new Date(); - - if (!effect || !effect.WhenExpires) { - return false; - } - - if (now > effect.WhenExpires) { - return false; - } - - return true; - } - - public static async GenerateEffectListEmbed(userId: string, page: number): Promise<{ - embed: EmbedBuilder, - row: ActionRowBuilder, - }> { - const itemsPerPage = 10; - - const query = await UserEffect.FetchAllByUserIdPaginated(userId, page - 1, itemsPerPage); - const activeEffect = await UserEffect.FetchActiveEffectByUserId(userId); - - const effects = query[0]; - const count = query[1]; - - const totalPages = count > 0 ? Math.ceil(count / itemsPerPage) : 1; - - let description = "*none*"; - - if (effects.length > 0) { - description = effects.map(x => `${EffectDetails.get(x.Name)?.friendlyName} x${x.Unused}`).join("\n"); - } - - const embed = new EmbedBuilder() - .setTitle("Effects") - .setDescription(description) - .setColor(EmbedColours.Ok) - .setFooter({ text: `Page ${page} of ${totalPages}` }); - - if (activeEffect) { - embed.addFields([ - { - name: "Active", - value: `${EffectDetails.get(activeEffect.Name)?.friendlyName}`, - inline: true, - }, - { - name: "Expires", - value: ``, - inline: true, - }, - ]); - } - - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`effects list ${page - 1}`) - .setLabel("Previous") - .setStyle(ButtonStyle.Primary) - .setDisabled(page == 1), - new ButtonBuilder() - .setCustomId(`effects list ${page + 1}`) - .setLabel("Next") - .setStyle(ButtonStyle.Primary) - .setDisabled(page == totalPages), - ); - - return { - embed, - row, - }; - } - - public static async GenerateEffectBuyEmbed(userId: string, id: string, quantity: number, disabled: boolean): Promise<{ - embed: EmbedBuilder, - row: ActionRowBuilder, - } | string> { - const effectDetail = EffectDetails.get(id); - - if (!effectDetail) { - return "Effect detail not found!"; - } - - const totalCost = effectDetail.cost * quantity; - - let user = await User.FetchOneById(User, userId); - - if (!user) { - user = new User(userId, CardConstants.StartingCurrency); - await user.Save(User, user); - - AppLogger.LogInfo("EffectHelper", `Created initial user entity for : ${userId}`); - } - - if (!disabled && user.Currency < totalCost) { - return `You don't have enough currency to buy this! You have \`${user.Currency} Currency\` and need \`${totalCost} Currency\`!`; - } - - const embed = new EmbedBuilder() - .setTitle("Buy Effect") - .setDescription(effectDetail.friendlyName) - .setColor(EmbedColours.Ok) - .addFields([ - { - name: "Cost", - value: `${totalCost}`, - inline: true, - }, - { - name: "Quantity", - value: `${quantity}`, - inline: true, - }, - ]); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`effects buy confirm ${id} ${quantity}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setDisabled(disabled), - new ButtonBuilder() - .setCustomId(`effects buy cancel ${id} ${quantity}`) - .setLabel("Cancel") - .setStyle(ButtonStyle.Danger) - .setDisabled(disabled), - ]); - - return { - embed, - row, - } - } -} diff --git a/src/helpers/ImageHelper.ts b/src/helpers/ImageHelper.ts deleted file mode 100644 index 6156938..0000000 --- a/src/helpers/ImageHelper.ts +++ /dev/null @@ -1,79 +0,0 @@ -import {createCanvas, loadImage} from "canvas"; -import path from "path"; -import AppLogger from "../client/appLogger"; -import {existsSync} from "fs"; -import Inventory from "../database/entities/app/Inventory"; -import { Bitmap, Jimp } from "jimp"; -import axios from "axios"; - -interface CardInput { - id: string; - path: string; -} - -export default class ImageHelper { - public static async GenerateCardImageGrid(cards: CardInput[], userId?: string): Promise { - const gridWidth = 3; - const gridHeight = Math.ceil(cards.length / gridWidth); - - const imageWidth = 526; - const imageHeight = 712; - - const canvasWidth = imageWidth * gridWidth; - const canvasHeight = imageHeight * gridHeight; - - const canvas = createCanvas(canvasWidth, canvasHeight); - const ctx = canvas.getContext("2d"); - - for (let i = 0; i < cards.length; i++) { - try { - const card = cards[i]; - - const filePath = path.join(process.env.DATA_DIR!, "cards", card.path); - - let bitmap: Bitmap; - - if (existsSync(filePath)) { - const data = await Jimp.read(filePath); - - bitmap = data.bitmap; - } else if (card.path.startsWith("http://") || card.path.startsWith("https://")) { - const response = await axios.get(card.path, { responseType: "arraybuffer" }); - const buffer = Buffer.from(response.data); - const data = await Jimp.fromBuffer(buffer); - - bitmap = data.bitmap; - } else { - AppLogger.LogError("ImageHelper/GenerateCardImageGrid", `Failed to load image from path ${card.path}`); - continue; - } - - const imageData = Jimp.fromBitmap(bitmap); - - if (userId != null) { - const claimed = await Inventory.FetchOneByCardNumberAndUserId(userId, card.id); - - if (!claimed || claimed.Quantity == 0) { - imageData.greyscale(); - } - } - - const image = await loadImage(await imageData.getBuffer("image/png")); - - const x = i % gridWidth; - const y = Math.floor(i / gridWidth); - - const imageX = imageWidth * x; - const imageY = imageHeight * y; - - ctx.drawImage(image, imageX, imageY); - } - catch { - // TODO: Enable once we've investigated a fix - //AppLogger.CatchError("ImageHelper", e); - } - } - - return canvas.toBuffer(); - } -} diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts deleted file mode 100644 index 15c9c92..0000000 --- a/src/helpers/InventoryHelper.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder } from "discord.js"; -import Inventory from "../database/entities/app/Inventory"; -import { CoreClient } from "../client/client"; -import EmbedColours from "../constants/EmbedColours"; -import { CardRarity, CardRarityToString } from "../constants/CardRarity"; -import cloneDeep from "clone-deep"; -import AppLogger from "../client/appLogger"; -import ImageHelper from "./ImageHelper"; - -interface InventoryPage { - id: number, - name: string, - cards: InventoryPageCards[], - seriesSubpage: number, -} - -interface InventoryPageCards { - id: string, - name: string, - type: CardRarity, - quantity: number, - path: string, -} - -interface ReturnedInventoryPage { - embed: EmbedBuilder, - row1: ActionRowBuilder, - row2: ActionRowBuilder, - image: AttachmentBuilder, -} - - -export default class InventoryHelper { - public static async GenerateInventoryPage(username: string, userid: string, page: number): Promise { - AppLogger.LogSilly("Helpers/InventoryHelper", `Parameters: username=${username}, userid=${userid}, page=${page}`); - - const cardsPerPage = 9; - - const inventory = await Inventory.FetchAllByUserId(userid); - - if (!inventory || inventory.length == 0) return undefined; - - const clientCards = cloneDeep(CoreClient.Cards); - - const allSeriesClaimed = clientCards - .sort((a, b) => a.id - b.id) - .filter(x => { - x.cards = x.cards - .sort((a, b) => b.type - a.type) - .filter(y => inventory.find(z => z.CardNumber == y.id)) - .filter(y => inventory.find(z => z.CardNumber == y.id)!.Quantity > 0); - - return x; - }); - - const pages: InventoryPage[] = []; - - for (const series of allSeriesClaimed) { - const seriesCards = series.cards; - - for (let i = 0; i < seriesCards.length; i+= cardsPerPage) { - const cards = series.cards.slice(i, i + cardsPerPage); - const pageCards: InventoryPageCards[] = []; - - for (const card of cards) { - const item = inventory.find(x => x.CardNumber == card.id); - - if (!item) { - continue; - } - - pageCards.push({ - id: card.id, - name: card.name, - type: card.type, - quantity: item.Quantity, - path: card.path, - }); - } - - pages.push({ - id: series.id, - name: series.name, - cards: pageCards, - seriesSubpage: i / cardsPerPage, - }); - } - } - - const currentPage = pages[page]; - - if (!currentPage) { - return undefined; - } - - const embed = new EmbedBuilder() - .setTitle(username) - .setDescription(`**${currentPage.name} (${currentPage.seriesSubpage + 1})**\n${currentPage.cards.map(x => `[${x.id}] ${x.name} (${CardRarityToString(x.type)}) x${x.quantity}`).join("\n")}`) - .setFooter({ text: `Page ${page + 1} of ${pages.length}` }) - .setColor(EmbedColours.Ok) - .setImage("attachment://page.png"); - - const row1 = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`inventory ${userid} ${page - 1}`) - .setLabel("Previous") - .setStyle(ButtonStyle.Primary) - .setDisabled(page == 0), - new ButtonBuilder() - .setCustomId(`inventory ${userid} ${page + 1}`) - .setLabel("Next") - .setStyle(ButtonStyle.Primary) - .setDisabled(page + 1 == pages.length)); - - let pageNum = 0; - - const maxLength = 25; // Discord API limit - - const allPageOptions = pages.map(x => - new StringSelectMenuOptionBuilder() - .setLabel(`${x.name} (${x.seriesSubpage + 1})`.substring(0, 100)) - .setDescription(`Page ${pageNum + 1}`) - .setDefault(currentPage.id == x.id) - .setValue(`${userid} ${pageNum++}`)); - - const currentPageIndex = allPageOptions.indexOf(allPageOptions.find(x => x.data.default)!); - - let pageOptions: StringSelectMenuOptionBuilder[] = []; - - if (allPageOptions.length <= maxLength) { - pageOptions = allPageOptions; - } else { - let startIndex = currentPageIndex - Math.floor((maxLength - 1) / 2); - let endIndexOffset = 0; - - if (startIndex < 0) { - endIndexOffset = 0 - startIndex; - - startIndex = 0; - } - - let endIndex = currentPageIndex + Math.floor((maxLength - 1) / 2) + endIndexOffset; - - if (endIndex + 1 > allPageOptions.length) { - endIndex = allPageOptions.length; - } - - for (let i = startIndex; i < endIndex; i++) { - pageOptions.push(allPageOptions[i]); - } - } - - const row2 = new ActionRowBuilder() - .addComponents( - new StringSelectMenuBuilder() - .setCustomId("inventory") - .setPlaceholder(`${currentPage.name} (${currentPage.seriesSubpage + 1})`) - .addOptions(pageOptions)); - - const buffer = await ImageHelper.GenerateCardImageGrid(currentPage.cards.map(x => ({ id: x.id, path: x.path }))); - const image = new AttachmentBuilder(buffer, { name: "page.png" }); - - return { embed, row1, row2, image }; - } -} diff --git a/src/helpers/MigrationHelper.ts b/src/helpers/MigrationHelper.ts index 5946cb1..69fee4a 100644 --- a/src/helpers/MigrationHelper.ts +++ b/src/helpers/MigrationHelper.ts @@ -3,7 +3,7 @@ import { QueryRunner } from "typeorm"; export default class MigrationHelper { public static Up(migrationName: string, version: string, queryFiles: string[], queryRunner: QueryRunner) { - for (const path of queryFiles) { + for (let path of queryFiles) { const query = readFileSync(`${process.cwd()}/database/${version}/${migrationName}/Up/${path}.sql`).toString(); queryRunner.query(query); @@ -11,7 +11,7 @@ export default class MigrationHelper { } public static Down(migrationName: string, version: string, queryFiles: string[], queryRunner: QueryRunner) { - for (const path of queryFiles) { + for (let path of queryFiles) { const query = readFileSync(`${process.cwd()}/database/${version}/${migrationName}/Down/${path}.sql`).toString(); queryRunner.query(query); diff --git a/src/helpers/SeriesHelper.ts b/src/helpers/SeriesHelper.ts deleted file mode 100644 index 5469938..0000000 --- a/src/helpers/SeriesHelper.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; -import AppLogger from "../client/appLogger"; -import cloneDeep from "clone-deep"; -import { CoreClient } from "../client/client"; -import EmbedColours from "../constants/EmbedColours"; -import { CardRarityToString } from "../constants/CardRarity"; -import ImageHelper from "./ImageHelper"; - -export default class SeriesHelper { - public static async GenerateSeriesViewPage(seriesId: number, page: number, userId: string): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder, image: AttachmentBuilder } | null> { - AppLogger.LogSilly("Helpers/SeriesHelper", `Parameters: seriesId=${seriesId}, page=${page}`); - - const itemsPerPage = 9; - - const series = cloneDeep(CoreClient.Cards) - .find(x => x.id == seriesId); - - if (!series) { - AppLogger.LogVerbose("Helpers/SeriesHelper", `Unable to find series: ${seriesId}`); - return null; - } - - const totalPages = Math.ceil(series.cards.length / itemsPerPage); - const totalCards = series.cards.length; - - if (page > totalPages) { - AppLogger.LogVerbose("Helpers/SeriesHelper", `Trying to find page greater than what exists for this series. Page: ${page} but there are only ${totalPages} pages`); - return null; - } - - const cardsOnPage = series.cards.splice(page * itemsPerPage, itemsPerPage); - - const description = cardsOnPage - .map(x => `[${x.id}] ${x.name} (${CardRarityToString(x.type)})`) - .join("\n"); - - const embed = new EmbedBuilder() - .setTitle(series.name) - .setColor(EmbedColours.Ok) - .setDescription(description) - .setFooter({ text: `${series.id} · ${totalCards} cards · Page ${page + 1} of ${totalPages}` }) - .setImage("attachment://page.png"); - - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`series view ${seriesId} ${page - 1}`) - .setLabel("Previous") - .setStyle(ButtonStyle.Primary) - .setDisabled(page == 0), - new ButtonBuilder() - .setCustomId(`series view ${seriesId} ${page + 1}`) - .setLabel("Next") - .setStyle(ButtonStyle.Primary) - .setDisabled(page + 1 == totalPages)); - - const buffer = await ImageHelper.GenerateCardImageGrid(cardsOnPage.map(x => ({id: x.id, path: x.path})), userId); - const image = new AttachmentBuilder(buffer, { name: "page.png" }); - - return { embed, row, image }; - } - - public static GenerateSeriesListPage(page: number): { embed: EmbedBuilder, row: ActionRowBuilder } | null { - AppLogger.LogSilly("Helpers/InventoryHelper", `Parameters: page=${page}`); - - const itemsPerPage = 15; - - const series = cloneDeep(CoreClient.Cards) - .sort((a, b) => a.id - b.id); - - const totalPages = Math.ceil(series.length / itemsPerPage); - - if (page > totalPages) { - AppLogger.LogVerbose("Helpers/SeriesHelper", `Trying to find page greater than what exists for this series. Page: ${page} but there are only ${totalPages} pages`); - return null; - } - - const seriesOnPage = series.splice(page * itemsPerPage, itemsPerPage); - - const description = seriesOnPage - .map(x => `[${x.id}] ${x.name} (${x.cards.length} cards)`) - .join("\n"); - - const embed = new EmbedBuilder() - .setTitle("Series") - .setColor(EmbedColours.Ok) - .setDescription(description) - .setFooter({ text: `${CoreClient.Cards.length} series · Page ${page + 1} of ${totalPages}` }); - - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId(`series list ${page - 1}`) - .setLabel("Previous") - .setStyle(ButtonStyle.Primary) - .setDisabled(page == 0), - new ButtonBuilder() - .setCustomId(`series list ${page + 1}`) - .setLabel("Next") - .setStyle(ButtonStyle.Primary) - .setDisabled(page + 1 == totalPages)); - - return { embed, row }; - } -} diff --git a/src/helpers/StringTools.ts b/src/helpers/StringTools.ts index 1e43ded..0254dc5 100644 --- a/src/helpers/StringTools.ts +++ b/src/helpers/StringTools.ts @@ -1,7 +1,7 @@ export default class StringTools { public static Capitalise(str: string): string { const words = str.split(" "); - const result: string[] = []; + let result: string[] = []; words.forEach(word => { const firstLetter = word.substring(0, 1).toUpperCase(); @@ -26,31 +26,17 @@ export default class StringTools { public static RandomString(length: number) { let result = ""; - const characters = "abcdefghkmnpqrstuvwxyz23456789"; + const characters = 'abcdefghkmnpqrstuvwxyz23456789'; const charactersLength = characters.length; - for ( let i = 0; i < length; i++ ) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); + for ( var i = 0; i < length; i++ ) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } public static ReplaceAll(str: string, find: string, replace: string) { - return str.replace(new RegExp(find, "g"), replace); - } - - public static IsHexCode(str: string): boolean { - if (str.length != 6) return false; - - const characters = "0123456789abcdefABCDEF"; - - for (let i = 0; i < 6; i++) { - const char = str[i]; - - if (!characters.includes(char)) return false; - } - - return true; + return str.replace(new RegExp(find, 'g'), replace); } } \ No newline at end of file diff --git a/src/helpers/TimeLengthInput.ts b/src/helpers/TimeLengthInput.ts index aef58ba..95befa6 100644 --- a/src/helpers/TimeLengthInput.ts +++ b/src/helpers/TimeLengthInput.ts @@ -4,23 +4,23 @@ export default class TimeLengthInput { public readonly value: string; constructor(input: string) { - this.value = StringTools.ReplaceAll(input, ",", ""); + this.value = StringTools.ReplaceAll(input, ',', ''); } public GetDays(): number { - return this.GetValue("d"); + return this.GetValue('d'); } public GetHours(): number { - return this.GetValue("h"); + return this.GetValue('h'); } public GetMinutes(): number { - return this.GetValue("m"); + return this.GetValue('m'); } public GetSeconds(): number { - return this.GetValue("s"); + return this.GetValue('s'); } public GetMilliseconds(): number { @@ -106,7 +106,7 @@ export default class TimeLengthInput { } private GetValue(designation: string): number { - const valueSplit = this.value.split(" "); + const valueSplit = this.value.split(' '); const desString = valueSplit.find(x => x.charAt(x.length - 1) == designation); @@ -118,19 +118,4 @@ export default class TimeLengthInput { return desNumber; } - - public static ConvertFromMilliseconds(ms: number): TimeLengthInput { - const seconds = Math.floor(ms / 1000); - const minutes = Math.floor(seconds / 60); - const hours = Math.floor(minutes / 60); - const days = Math.floor(hours / 24); - - const remainingSeconds = seconds % 60; - const remainingMinutes = minutes % 60; - const remainingHours = hours % 24; - - const timeString = `${days}d ${remainingHours}h ${remainingMinutes}m ${remainingSeconds}s`; - - return new TimeLengthInput(timeString); - } } \ No newline at end of file diff --git a/src/helpers/TimerHelper.ts b/src/helpers/TimerHelper.ts deleted file mode 100644 index 535a6a7..0000000 --- a/src/helpers/TimerHelper.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { CronJob } from "cron"; -import { v4 } from "uuid"; -import { Primitive } from "../type/primitive"; - -interface Timer { - id: string; - job: CronJob; - context: Map; - onTick: ((context: Map) => void) | ((context: Map) => Promise); - runOnStart: boolean; -} - -export default class TimerHelper { - private _timers: Timer[]; - - constructor() { - this._timers = []; - } - - public AddTimer( - cronTime: string, - timeZone: string, - onTick: ((context: Map) => void) | ((context: Map) => Promise), - runOnStart: boolean = false): string { - const context = new Map(); - - const job = new CronJob( - cronTime, - () => { - onTick(context); - }, - null, - false, - timeZone, - ); - - const id = v4(); - - this._timers.push({ - id, - job, - context, - onTick, - runOnStart, - }); - - return id; - } - - public StartAllTimers() { - this._timers.forEach(timer => this.StartJob(timer)); - } - - public StopAllTimers() { - this._timers.forEach(timer => timer.job.stop()); - } - - public StartTimer(id: string) { - const timer = this._timers.find(x => x.id == id); - - if (!timer) return; - - this.StartJob(timer); - } - - public StopTimer(id: string) { - const timer = this._timers.find(x => x.id == id); - - if (!timer) return; - - timer.job.stop(); - } - - private StartJob(timer: Timer) { - timer.job.start(); - - if (timer.runOnStart) { - timer.onTick(timer.context); - } - } -} \ No newline at end of file diff --git a/src/hooks/ReloadDB.ts b/src/hooks/ReloadDB.ts index 9d99df7..25c6875 100644 --- a/src/hooks/ReloadDB.ts +++ b/src/hooks/ReloadDB.ts @@ -1,11 +1,10 @@ import { Request, Response } from "express"; -import CardMetadataFunction from "../Functions/CardMetadataFunction"; -import AppLogger from "../client/appLogger"; +import CardSetupFunction from "../Functions/CardSetupFunction"; export default async function ReloadDB(req: Request, res: Response) { - AppLogger.LogInfo("Hooks/ReloadDB", "Reloading Card DB..."); + console.log('Reloading Card DB...'); - await CardMetadataFunction.Execute(); + await CardSetupFunction.Execute(); res.sendStatus(200); } \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index 3ae885d..9619437 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -1,24 +1,9 @@ import { CoreClient } from "./client/client"; -import { Environment } from "./constants/Environment"; // Global Command Imports import About from "./commands/about"; -import AllBalance from "./commands/allbalance"; -import Balance from "./commands/balance"; -import Daily from "./commands/daily"; import Drop from "./commands/drop"; -import Effects from "./commands/effects"; import Gdrivesync from "./commands/gdrivesync"; -import Give from "./commands/give"; -import Id from "./commands/id"; -import Inventory from "./commands/inventory"; -import Multidrop from "./commands/multidrop"; -import Resync from "./commands/resync"; -import Sacrifice from "./commands/sacrifice"; -import Series from "./commands/series"; -import Stats from "./commands/stats"; -import Trade from "./commands/trade"; -import View from "./commands/view"; // Test Command Imports import Dropnumber from "./commands/stage/dropnumber"; @@ -26,57 +11,27 @@ import Droprarity from "./commands/stage/droprarity"; // Button Event Imports import Claim from "./buttonEvents/Claim"; -import EffectsButtonEvent from "./buttonEvents/Effects"; -import InventoryButtonEvent from "./buttonEvents/Inventory"; -import MultidropButtonEvent from "./buttonEvents/Multidrop"; import Reroll from "./buttonEvents/Reroll"; -import SacrificeButtonEvent from "./buttonEvents/Sacrifice"; -import SeriesEvent from "./buttonEvents/Series"; -import TradeButtonEvent from "./buttonEvents/Trade"; -import ViewButtonEvent from "./buttonEvents/View"; - -// String Dropdown Event Imports -import InventoryStringDropdown from "./stringDropdowns/Inventory"; +import { Environment } from "./constants/Environment"; export default class Registry { public static RegisterCommands() { // Global Commands - CoreClient.RegisterCommand("about", new About()); - CoreClient.RegisterCommand("allbalance", new AllBalance()); - CoreClient.RegisterCommand("balance", new Balance()); - CoreClient.RegisterCommand("daily", new Daily()); - CoreClient.RegisterCommand("drop", new Drop()); - CoreClient.RegisterCommand("effects", new Effects()); - CoreClient.RegisterCommand("gdrivesync", new Gdrivesync()); - CoreClient.RegisterCommand("give", new Give()); - CoreClient.RegisterCommand("id", new Id()); - CoreClient.RegisterCommand("inventory", new Inventory()); - CoreClient.RegisterCommand("multidrop", new Multidrop()); - CoreClient.RegisterCommand("resync", new Resync()); - CoreClient.RegisterCommand("sacrifice", new Sacrifice()); - CoreClient.RegisterCommand("series", new Series()); - CoreClient.RegisterCommand("stats", new Stats()); - CoreClient.RegisterCommand("trade", new Trade()); - CoreClient.RegisterCommand("view", new View()); + CoreClient.RegisterCommand('about', new About()); + CoreClient.RegisterCommand('drop', new Drop()); + CoreClient.RegisterCommand('gdrivesync', new Gdrivesync()); // Test Commands - CoreClient.RegisterCommand("dropnumber", new Dropnumber(), Environment.Test); - CoreClient.RegisterCommand("droprarity", new Droprarity(), Environment.Test); + CoreClient.RegisterCommand('dropnumber', new Dropnumber(), Environment.Test); + CoreClient.RegisterCommand('droprarity', new Droprarity(), Environment.Test); + } + + public static RegisterEvents() { + } public static RegisterButtonEvents() { - CoreClient.RegisterButtonEvent("claim", new Claim()); - CoreClient.RegisterButtonEvent("effects", new EffectsButtonEvent()); - CoreClient.RegisterButtonEvent("inventory", new InventoryButtonEvent()); - CoreClient.RegisterButtonEvent("multidrop", new MultidropButtonEvent()); - CoreClient.RegisterButtonEvent("reroll", new Reroll()); - CoreClient.RegisterButtonEvent("sacrifice", new SacrificeButtonEvent()); - CoreClient.RegisterButtonEvent("series", new SeriesEvent()); - CoreClient.RegisterButtonEvent("trade", new TradeButtonEvent()); - CoreClient.RegisterButtonEvent("view", new ViewButtonEvent()); - } - - public static RegisterStringDropdownEvents() { - CoreClient.RegisterStringDropdownEvent("inventory", new InventoryStringDropdown()); + CoreClient.RegisterButtonEvent('claim', new Claim()); + CoreClient.RegisterButtonEvent('reroll', new Reroll()); } } \ No newline at end of file diff --git a/src/stringDropdowns/Inventory.ts b/src/stringDropdowns/Inventory.ts deleted file mode 100644 index 2a218ea..0000000 --- a/src/stringDropdowns/Inventory.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {StringSelectMenuInteraction} from "discord.js"; -import {StringDropdownEvent} from "../type/stringDropdownEvent"; -import AppLogger from "../client/appLogger"; -import InventoryHelper from "../helpers/InventoryHelper"; - -export default class Inventory extends StringDropdownEvent { - public override async execute(interaction: StringSelectMenuInteraction) { - if (!interaction.guild) return; - - const userid = interaction.values[0].split(" ")[0]; - const page = interaction.values[0].split(" ")[1]; - - AppLogger.LogDebug("StringDropdown/Inventory", `Parameters: userid=${userid}, page=${page}`); - - await interaction.deferUpdate(); - - const member = interaction.guild.members.cache.find(x => x.id == userid) || await interaction.guild.members.fetch(userid); - - if (!member) { - await interaction.reply("Unable to find user."); - return; - } - - try { - const embed = await InventoryHelper.GenerateInventoryPage(member.user.username, member.user.id, Number(page)); - - if (!embed) { - await interaction.followUp("No page for user found."); - return; - } - - await interaction.editReply({ - files: [ embed.image ], - embeds: [ embed.embed ], - components: [ embed.row1, embed.row2 ], - }); - } catch (e) { - AppLogger.LogError("StringDropdown/Inventory", `Error generating inventory page for ${member.user.username} with id ${member.user.id}: ${e}`); - - await interaction.followUp("An error has occurred running this command."); - } - } -} diff --git a/src/timers/GiveCurrency.ts b/src/timers/GiveCurrency.ts deleted file mode 100644 index 93e48d1..0000000 --- a/src/timers/GiveCurrency.ts +++ /dev/null @@ -1,19 +0,0 @@ -import AppLogger from "../client/appLogger"; -import CardConstants from "../constants/CardConstants"; -import User from "../database/entities/app/User"; - -export default async function GiveCurrency() { - AppLogger.LogDebug("Timers/GiveCurrency", "Giving currency to every known user"); - - const users = await User.FetchAll(User); - - const usersFiltered = users.filter(x => x.Currency < 1000); - - for (const user of usersFiltered) { - user.AddCurrency(CardConstants.TimerGiveAmount); - } - - User.SaveAll(User, users); - - AppLogger.LogDebug("Timers/GiveCurrency", `Successfully gave +${CardConstants.TimerGiveAmount} currency to ${usersFiltered.length} users`); -} \ No newline at end of file diff --git a/src/timers/PurgeClaims.ts b/src/timers/PurgeClaims.ts deleted file mode 100644 index 4ca8902..0000000 --- a/src/timers/PurgeClaims.ts +++ /dev/null @@ -1,14 +0,0 @@ -import AppLogger from "../client/appLogger"; -import Claim from "../database/entities/app/Claim"; - -export default async function PurgeClaims() { - const claims = await Claim.FetchAll(Claim); - - const whenLastClaimable = new Date(Date.now() - (1000 * 60 * 2)); // 2 minutes ago - - const expiredClaims = claims.filter(x => x.WhenCreated < whenLastClaimable); - - await Claim.RemoveMany(Claim, expiredClaims); - - AppLogger.LogInfo("Timers/PurgeClaims", `Purged ${expiredClaims.length} claims from the database`); -} \ No newline at end of file diff --git a/src/type/buttonEvent.ts b/src/type/buttonEvent.ts index 8a45bd0..3a691cf 100644 --- a/src/type/buttonEvent.ts +++ b/src/type/buttonEvent.ts @@ -1,5 +1,7 @@ import { ButtonInteraction } from "discord.js"; -export abstract class ButtonEvent { - abstract execute(interaction: ButtonInteraction): Promise; +export class ButtonEvent { + public execute(interaction: ButtonInteraction) { + + } } \ No newline at end of file diff --git a/src/type/command.ts b/src/type/command.ts index 458a81e..10d091d 100644 --- a/src/type/command.ts +++ b/src/type/command.ts @@ -1,8 +1,9 @@ import { CommandInteraction } from "discord.js"; -export abstract class Command { - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- CommandBuilder type is dynamic depending on options and can't be strictly typed +export class Command { public CommandBuilder: any; + + public execute(interaction: CommandInteraction) { - abstract execute(interaction: CommandInteraction): Promise; + } } diff --git a/src/type/primitive.ts b/src/type/primitive.ts deleted file mode 100644 index b1e143b..0000000 --- a/src/type/primitive.ts +++ /dev/null @@ -1 +0,0 @@ -export type Primitive = string | number | boolean; \ No newline at end of file diff --git a/src/type/stringDropdownEvent.ts b/src/type/stringDropdownEvent.ts deleted file mode 100644 index c097cda..0000000 --- a/src/type/stringDropdownEvent.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {StringSelectMenuInteraction} from "discord.js"; - -export abstract class StringDropdownEvent { - abstract execute(interaction: StringSelectMenuInteraction): Promise; -} diff --git a/src/webhooks.ts b/src/webhooks.ts index 0b99816..ec30720 100644 --- a/src/webhooks.ts +++ b/src/webhooks.ts @@ -1,7 +1,6 @@ import bodyParser from "body-parser"; import express, { Application } from "express"; import ReloadDB from "./hooks/ReloadDB"; -import AppLogger from "./client/appLogger"; export default class Webhooks { private app: Application; @@ -20,12 +19,12 @@ export default class Webhooks { } private setupRoutes() { - this.app.post("/api/reload-db", ReloadDB); + this.app.post('/api/reload-db', ReloadDB); } private setupListen() { this.app.listen(this.port, () => { - AppLogger.LogInfo("Webhooks", `API listening on port ${this.port}`); + console.log(`API listening on port ${this.port}`); }); } } \ No newline at end of file diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/__functions__/discord.js/GenerateButtonInteractionMock.ts b/tests/__functions__/discord.js/GenerateButtonInteractionMock.ts deleted file mode 100644 index 2199477..0000000 --- a/tests/__functions__/discord.js/GenerateButtonInteractionMock.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ButtonInteraction } from "../../__types__/discord.js"; - -export default function GenerateButtonInteractionMock(): ButtonInteraction { - return { - guild: {}, - guildId: "guildId", - channel: { - isSendable: jest.fn().mockReturnValue(true), - send: jest.fn(), - }, - deferUpdate: jest.fn(), - editReply: jest.fn(), - message: { - createdAt: new Date(1000 * 60 * 27), - }, - user: { - id: "userId", - }, - customId: "customId", - update: jest.fn(), - reply: jest.fn(), - }; -} \ No newline at end of file diff --git a/tests/__functions__/discord.js/GenerateCommandInteractionMock.ts b/tests/__functions__/discord.js/GenerateCommandInteractionMock.ts deleted file mode 100644 index 128c25b..0000000 --- a/tests/__functions__/discord.js/GenerateCommandInteractionMock.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommandInteraction } from "../../__types__/discord.js"; - -export default function GenerateCommandInteractionMock(options?: { - subcommand?: string, -}): CommandInteraction { - return { - deferReply: jest.fn(), - editReply: jest.fn(), - isChatInputCommand: jest.fn().mockReturnValue(true), - options: { - getSubcommand: jest.fn().mockReturnValue(options?.subcommand), - }, - user: { - id: "userId", - }, - }; -} \ No newline at end of file diff --git a/tests/__types__/discord.js.ts b/tests/__types__/discord.js.ts deleted file mode 100644 index 3304af4..0000000 --- a/tests/__types__/discord.js.ts +++ /dev/null @@ -1,31 +0,0 @@ -export type ButtonInteraction = { - guild: object | null, - guildId: string | null, - channel: { - isSendable: jest.Func, - send: jest.Func, - } | null, - deferUpdate: jest.Func, - editReply: jest.Func, - message: { - createdAt: Date, - } | null, - user: { - id: string, - } | null, - customId: string, - update: jest.Func, - reply: jest.Func, -} - -export type CommandInteraction = { - deferReply: jest.Func, - editReply: jest.Func, - isChatInputCommand: jest.Func, - options: { - getSubcommand: jest.Func, - }, - user: { - id: string, - }, -} \ No newline at end of file diff --git a/tests/buttonEvents/Claim.test.ts b/tests/buttonEvents/Claim.test.ts deleted file mode 100644 index 1e7027c..0000000 --- a/tests/buttonEvents/Claim.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { ButtonInteraction, TextChannel } from "discord.js"; -import Claim from "../../src/buttonEvents/Claim"; -import { ButtonInteraction as ButtonInteractionType } from "../__types__/discord.js"; -import GenerateButtonInteractionMock from "../__functions__/discord.js/GenerateButtonInteractionMock"; - -jest.mock("../../src/client/appLogger"); - -let interaction: ButtonInteractionType; - -beforeEach(() => { - jest.useFakeTimers(); - jest.setSystemTime(1000 * 60 * 30); - - interaction = GenerateButtonInteractionMock(); - interaction.customId = "claim cardNumber claimId droppedBy userId"; -}); - -afterAll(() => { - jest.useRealTimers(); -}); - -test("GIVEN interaction.guild is null, EXPECT nothing to happen", async () => { - // Arrange - interaction.guild = null; - - // Act - const claim = new Claim(); - await claim.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.deferUpdate).not.toHaveBeenCalled(); - expect(interaction.editReply).not.toHaveBeenCalled(); - expect((interaction.channel as TextChannel).send).not.toHaveBeenCalled(); -}); - -test("GIVEN interaction.guildId is null, EXPECT nothing to happen", async () => { - // Arrange - interaction.guildId = null; - - // Act - const claim = new Claim(); - await claim.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.deferUpdate).not.toHaveBeenCalled(); - expect(interaction.editReply).not.toHaveBeenCalled(); - expect((interaction.channel as TextChannel).send).not.toHaveBeenCalled(); -}); - -test("GIVEN interaction.channel is null, EXPECT nothing to happen", async () => { - // Arrange - interaction.channel = null; - - // Act - const claim = new Claim(); - await claim.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.deferUpdate).not.toHaveBeenCalled(); - expect(interaction.editReply).not.toHaveBeenCalled(); -}); - -test("GIVEN channel is not sendable, EXPECT nothing to happen", async () => { - // Arrange - interaction.channel!.isSendable = jest.fn().mockReturnValue(false); - - // Act - const claim = new Claim(); - await claim.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.deferUpdate).not.toHaveBeenCalled(); - expect(interaction.editReply).not.toHaveBeenCalled(); - expect((interaction.channel as TextChannel).send).not.toHaveBeenCalled(); -}); - -test("GIVEN interaction.message was created more than 5 minutes ago, EXPECT error", async () => { - // Arrange - interaction.message!.createdAt = new Date(0); - - // Act - const claim = new Claim(); - await claim.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.channel!.send).toHaveBeenCalledTimes(1); - expect(interaction.channel!.send).toHaveBeenCalledWith("[object Object], Cards can only be claimed within 2 minutes of it being dropped!"); - - expect(interaction.editReply).not.toHaveBeenCalled(); -}); \ No newline at end of file diff --git a/tests/buttonEvents/Effects.test.ts b/tests/buttonEvents/Effects.test.ts deleted file mode 100644 index 8fb1023..0000000 --- a/tests/buttonEvents/Effects.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { ButtonInteraction } from "discord.js"; -import Effects from "../../src/buttonEvents/Effects"; -import GenerateButtonInteractionMock from "../__functions__/discord.js/GenerateButtonInteractionMock"; -import { ButtonInteraction as ButtonInteractionType } from "../__types__/discord.js"; -import List from "../../src/buttonEvents/Effects/List"; -import Use from "../../src/buttonEvents/Effects/Use"; -import AppLogger from "../../src/client/appLogger"; - -jest.mock("../../src/client/appLogger"); -jest.mock("../../src/buttonEvents/Effects/List"); -jest.mock("../../src/buttonEvents/Effects/Use"); - -let interaction: ButtonInteractionType; - -beforeEach(() => { - jest.resetAllMocks(); - - interaction = GenerateButtonInteractionMock(); - interaction.customId = "effects"; -}); - -test("GIVEN action is list, EXPECT list function to be called", async () => { - // Arrange - interaction.customId = "effects list"; - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(List).toHaveBeenCalledTimes(1); - expect(List).toHaveBeenCalledWith(interaction); - - expect(Use.Execute).not.toHaveBeenCalled(); -}); - -test("GIVEN action is use, EXPECT use function to be called", async () => { - // Arrange - interaction.customId = "effects use"; - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(Use.Execute).toHaveBeenCalledTimes(1); - expect(Use.Execute).toHaveBeenCalledWith(interaction); - - expect(List).not.toHaveBeenCalled(); -}); - -test.todo("GIVEN action is buy, EXPECT buy function to be called"); - -test("GIVEN action is invalid, EXPECT nothing to be called", async () => { - // Arrange - interaction.customId = "effects invalid"; - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(List).not.toHaveBeenCalled(); - expect(Use.Execute).not.toHaveBeenCalled(); - - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buttons/Effects", "Unknown action, invalid"); -}); diff --git a/tests/buttonEvents/Effects/Buy.test.ts b/tests/buttonEvents/Effects/Buy.test.ts deleted file mode 100644 index 3898504..0000000 --- a/tests/buttonEvents/Effects/Buy.test.ts +++ /dev/null @@ -1,350 +0,0 @@ -import {ButtonInteraction} from "discord.js"; -import Buy from "../../../src/buttonEvents/Effects/Buy"; -import GenerateButtonInteractionMock from "../../__functions__/discord.js/GenerateButtonInteractionMock"; -import { ButtonInteraction as ButtonInteractionType } from "../../__types__/discord.js"; -import AppLogger from "../../../src/client/appLogger"; -import EffectHelper from "../../../src/helpers/EffectHelper"; -import EmbedColours from "../../../src/constants/EmbedColours"; -import User from "../../../src/database/entities/app/User"; - -jest.mock("../../../src/client/appLogger"); -jest.mock("../../../src/helpers/EffectHelper"); -jest.mock("../../../src/database/entities/app/User"); - -let interaction: ButtonInteractionType; - -beforeEach(() => { - jest.resetAllMocks(); - - interaction = GenerateButtonInteractionMock(); - interaction.customId = "effects buy"; - -}); - -describe("Execute", () => { - test("GIVEN subaction is invalid, EXPECT error logged", async () => { - // Arrange - interaction.customId += " invalid"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy", "Unknown subaction, effects invalid"); - }); -}); - -describe("Confirm", () => { - let user: User; - - beforeEach(() => { - interaction.customId += " confirm"; - - user = { - Currency: 1000, - Save: jest.fn(), - RemoveCurrency: jest.fn(), - } as unknown as User; - - (User.FetchOneById as jest.Mock).mockResolvedValue(user); - }); - - test("EXPECT success embed generated", async () => { - // Assert - interaction.customId += " unclaimed 1"; - - const embed = { - id: "embed", - setColor: jest.fn(), - setFooter: jest.fn(), - }; - const row = { - id: "row", - }; - - (EffectHelper.GenerateEffectBuyEmbed as jest.Mock).mockResolvedValue({ - embed, - row, - }); - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.update).toHaveBeenCalledTimes(1); - expect(interaction.update).toHaveBeenCalledWith({ - embeds: [ embed ], - components: [ row ], - }); - - expect(EffectHelper.GenerateEffectBuyEmbed).toHaveBeenCalledTimes(1); - expect(EffectHelper.GenerateEffectBuyEmbed).toHaveBeenCalledWith("userId", "unclaimed", 1, true); - - expect(embed.setColor).toHaveBeenCalledTimes(1); - expect(embed.setColor).toHaveBeenCalledWith(EmbedColours.Success); - - expect(embed.setFooter).toHaveBeenCalledTimes(1); - expect(embed.setFooter).toHaveBeenCalledWith({ text: "Purchased" }); - - expect(interaction.reply).not.toHaveBeenCalled(); - expect(AppLogger.LogError).not.toHaveBeenCalled(); - - expect(User.FetchOneById).toHaveBeenCalledTimes(1); - expect(User.FetchOneById).toHaveBeenCalledWith(User, "userId"); - - expect(user.RemoveCurrency).toHaveBeenCalledTimes(1); - expect(user.RemoveCurrency).toHaveBeenCalledWith(100); - - expect(user.Save).toHaveBeenCalledTimes(1); - expect(user.Save).toHaveBeenCalledWith(User, user); - - expect(EffectHelper.AddEffectToUserInventory).toHaveBeenCalledTimes(1); - expect(EffectHelper.AddEffectToUserInventory).toHaveBeenCalledWith("userId", "unclaimed", 1); - }); - - test("GIVEN id is not supplied, EXPECT error", async () => { - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Confirm", "Not enough parameters"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN quantity is not supplied, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Confirm", "Not enough parameters"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN quantity is not a number, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed invalid"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Confirm", "Invalid number"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN quantity is 0, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed 0"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Confirm", "Invalid number"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN user is not found, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed 1"; - - (User.FetchOneById as jest.Mock).mockResolvedValue(undefined); - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Confirm", "Unable to find user"); - - expect(EffectHelper.AddEffectToUserInventory).not.toHaveBeenCalled(); - - expect(interaction.update).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - }); - - test("GIVEN user does not have enough currency, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed 1"; - - user.Currency = 0; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("You don't have enough currency to buy this! You have `0 Currency` and need `100 Currency`!"); - - expect(EffectHelper.AddEffectToUserInventory).not.toHaveBeenCalled(); - - expect(interaction.update).not.toHaveBeenCalled(); - - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); - - test("GIVEN GenerateEffectBuyEmbed returns with a string, EXPECT error replied", async () => { - // Assert - interaction.customId += " unclaimed 1"; - - (EffectHelper.GenerateEffectBuyEmbed as jest.Mock).mockResolvedValue("Test error"); - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Test error"); - - expect(EffectHelper.GenerateEffectBuyEmbed).toHaveBeenCalledTimes(1); - - expect(interaction.update).not.toHaveBeenCalled(); - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); -}); - -describe("Cancel", () => { - beforeEach(() => { - interaction.customId += " cancel"; - }); - - test("EXPECT embed generated", async () => { - // Assert - interaction.customId += " unclaimed 1"; - - const embed = { - id: "embed", - setColor: jest.fn(), - setFooter: jest.fn(), - }; - const row = { - id: "row", - }; - - (EffectHelper.GenerateEffectBuyEmbed as jest.Mock).mockResolvedValue({ - embed, - row, - }); - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.update).toHaveBeenCalledTimes(1); - expect(interaction.update).toHaveBeenCalledWith({ - embeds: [ embed ], - components: [ row ], - }); - - expect(EffectHelper.GenerateEffectBuyEmbed).toHaveBeenCalledTimes(1); - expect(EffectHelper.GenerateEffectBuyEmbed).toHaveBeenCalledWith("userId", "unclaimed", 1, true); - - expect(embed.setColor).toHaveBeenCalledTimes(1); - expect(embed.setColor).toHaveBeenCalledWith(EmbedColours.Error); - - expect(embed.setFooter).toHaveBeenCalledTimes(1); - expect(embed.setFooter).toHaveBeenCalledWith({ text: "Cancelled" }); - - expect(interaction.reply).not.toHaveBeenCalled(); - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); - - test("GIVEN id is not supplied, EXPECT error", async () => { - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Cancel", "Not enough parameters"); - - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN quantity is not supplied, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Cancel", "Not enough parameters"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN quantity is not a number, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed invalid"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Cancel", "Invalid number"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN quantity is 0, EXPECT error", async () => { - // Assert - interaction.customId += " unclaimed 0"; - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Buy Cancel", "Invalid number"); - - expect(EffectHelper.GenerateEffectBuyEmbed).not.toHaveBeenCalled(); - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); - - test("GIVEN GenerateEffectBuyEmbed returns with a string, EXPECT error replied", async () => { - // Assert - interaction.customId += " unclaimed 1"; - - (EffectHelper.GenerateEffectBuyEmbed as jest.Mock).mockResolvedValue("Test error"); - - // Act - await Buy.Execute(interaction as unknown as ButtonInteraction); - - // Assert - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Test error"); - - expect(EffectHelper.GenerateEffectBuyEmbed).toHaveBeenCalledTimes(1); - - expect(interaction.update).not.toHaveBeenCalled(); - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); -}); diff --git a/tests/buttonEvents/Effects/List.test.ts b/tests/buttonEvents/Effects/List.test.ts deleted file mode 100644 index 5b42c61..0000000 --- a/tests/buttonEvents/Effects/List.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, EmbedBuilder } from "discord.js"; -import List from "../../../src/buttonEvents/Effects/List"; -import EffectHelper from "../../../src/helpers/EffectHelper"; -import { mock } from "jest-mock-extended"; - -jest.mock("../../../src/helpers/EffectHelper"); - -let interaction: ReturnType>; - -beforeEach(() => { - jest.resetAllMocks(); - - (EffectHelper.GenerateEffectListEmbed as jest.Mock).mockResolvedValue({ - embed: mock(), - row: mock>(), - }); - - interaction = mock(); - interaction.user.id = "userId"; - interaction.customId = "effects list 1"; -}); - -test("GIVEN pageOption is NOT a number, EXPECT error", async () => { - // Arrange - interaction.customId = "effects list invalid"; - - // Act - await List(interaction); - - // Assert - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Page option is not a valid number") - - expect(EffectHelper.GenerateEffectListEmbed).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); -}); - -test("GIVEN pageOption is a number, EXPECT interaction updated", async () => { - // Arrange - interaction.customId = "effects list 1"; - - // Act - await List(interaction); - - // Assert - expect(EffectHelper.GenerateEffectListEmbed).toHaveBeenCalledTimes(1); - expect(EffectHelper.GenerateEffectListEmbed).toHaveBeenCalledWith("userId", 1); - - expect(interaction.update).toHaveBeenCalledTimes(1); -}); \ No newline at end of file diff --git a/tests/buttonEvents/Effects/Use.test.ts b/tests/buttonEvents/Effects/Use.test.ts deleted file mode 100644 index 86391cc..0000000 --- a/tests/buttonEvents/Effects/Use.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { ButtonInteraction, InteractionResponse, InteractionUpdateOptions, MessagePayload } from "discord.js"; -import Use from "../../../src/buttonEvents/Effects/Use"; -import { mock } from "jest-mock-extended"; -import AppLogger from "../../../src/client/appLogger"; -import EffectHelper from "../../../src/helpers/EffectHelper"; - -jest.mock("../../../src/client/appLogger"); -jest.mock("../../../src/helpers/EffectHelper"); - -beforeEach(() => { - jest.resetAllMocks(); - - jest.useFakeTimers(); - jest.setSystemTime(0); -}); - -afterAll(() => { - jest.useRealTimers(); -}); - -describe("Execute", () => { - test("GIVEN subaction is unknown, EXPECT nothing to be called", async () => { - // Arrange - const interaction = mock(); - interaction.customId = "effects use invalud"; - - // Act - await Use.Execute(interaction); - - // Assert - expect(interaction.reply).not.toHaveBeenCalled(); - expect(interaction.update).not.toHaveBeenCalled(); - }); -}); - -describe("UseConfirm", () => { - let interaction = mock(); - - beforeEach(() => { - interaction = mock(); - interaction.customId = "effects use confirm"; - }); - - test("GIVEN effectDetail is not found, EXPECT error", async () => { - // Arrange - interaction.customId += " invalid"; - - // Act - await Use.Execute(interaction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Button/Effects/Use", "Effect not found, invalid"); - - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Effect not found in system!"); - }); - - test("GIVEN EffectHelper.UseEffect failed, EXPECT error", async () => { - // Arrange - interaction.customId += " unclaimed"; - interaction.user.id = "userId"; - - (EffectHelper.UseEffect as jest.Mock).mockResolvedValue(false); - - const whenExpires = new Date(Date.now() + 10 * 60 * 1000); - - // Act - await Use.Execute(interaction); - - // Assert - expect(EffectHelper.UseEffect).toHaveBeenCalledTimes(1); - expect(EffectHelper.UseEffect).toHaveBeenCalledWith("userId", "unclaimed", whenExpires); - - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Unable to use effect! Please make sure you have it in your inventory and is not on cooldown"); - }); - - test("GIVEN EffectHelper.UseEffect succeeded, EXPECT interaction updated", async () => { - let updatedWith; - - // Arrange - interaction.customId += " unclaimed"; - interaction.user.id = "userId"; - interaction.update.mockImplementation(async (opts: string | MessagePayload | InteractionUpdateOptions) => { - updatedWith = opts; - - return mock>(); - }); - - (EffectHelper.UseEffect as jest.Mock).mockResolvedValue(true); - - const whenExpires = new Date(Date.now() + 10 * 60 * 1000); - - // Act - await Use.Execute(interaction); - - // Assert - expect(EffectHelper.UseEffect).toHaveBeenCalledTimes(1); - expect(EffectHelper.UseEffect).toHaveBeenCalledWith("userId", "unclaimed", whenExpires); - - expect(interaction.update).toHaveBeenCalledTimes(1); - expect(updatedWith).toMatchSnapshot(); - }); -}); - -describe("UseCancel", () => { - let interaction = mock(); - - beforeEach(() => { - interaction = mock(); - interaction.customId = "effects use cancel"; - }); - - test("GIVEN effectDetail is not found, EXPECT error", async () => { - // Arrange - interaction.customId += " invalid"; - - // Act - await Use.Execute(interaction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Button/Effects/Cancel", "Effect not found, invalid"); - - expect(interaction.reply).toHaveBeenCalledTimes(1); - expect(interaction.reply).toHaveBeenCalledWith("Effect not found in system!"); - }); - - test("GIVEN effectDetail is found, EXPECT interaction updated", async () => { - let updatedWith; - - // Arrange - interaction.customId += " unclaimed"; - interaction.user.id = "userId"; - interaction.update.mockImplementation(async (opts: string | MessagePayload | InteractionUpdateOptions) => { - updatedWith = opts; - - return mock>(); - }); - // Act - await Use.Execute(interaction); - - // Assert - expect(interaction.update).toHaveBeenCalledTimes(1); - expect(updatedWith).toMatchSnapshot(); - }); -}); \ No newline at end of file diff --git a/tests/buttonEvents/Effects/__snapshots__/Use.test.ts.snap b/tests/buttonEvents/Effects/__snapshots__/Use.test.ts.snap deleted file mode 100644 index 6cec0f4..0000000 --- a/tests/buttonEvents/Effects/__snapshots__/Use.test.ts.snap +++ /dev/null @@ -1,95 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`UseCancel GIVEN effectDetail is found, EXPECT interaction updated 1`] = ` -{ - "components": [ - { - "components": [ - { - "custom_id": "effects use confirm unclaimed", - "disabled": true, - "emoji": undefined, - "label": "Confirm", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects use cancel unclaimed", - "disabled": true, - "emoji": undefined, - "label": "Cancel", - "style": 4, - "type": 2, - }, - ], - "type": 1, - }, - ], - "embeds": [ - { - "color": 13882323, - "description": "The effect from your inventory has not been used", - "fields": [ - { - "inline": true, - "name": "Effect", - "value": "Unclaimed Chance Up", - }, - { - "inline": true, - "name": "Expires", - "value": "10m", - }, - ], - "title": "Effect Use Cancelled", - }, - ], -} -`; - -exports[`UseConfirm GIVEN EffectHelper.UseEffect succeeded, EXPECT interaction updated 1`] = ` -{ - "components": [ - { - "components": [ - { - "custom_id": "effects use confirm unclaimed", - "disabled": true, - "emoji": undefined, - "label": "Confirm", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects use cancel unclaimed", - "disabled": true, - "emoji": undefined, - "label": "Cancel", - "style": 4, - "type": 2, - }, - ], - "type": 1, - }, - ], - "embeds": [ - { - "color": 2263842, - "description": "You now have an active effect!", - "fields": [ - { - "inline": true, - "name": "Effect", - "value": "Unclaimed Chance Up", - }, - { - "inline": true, - "name": "Expires", - "value": "", - }, - ], - "title": "Effect Used", - }, - ], -} -`; diff --git a/tests/buttonEvents/Multidrop.test.ts b/tests/buttonEvents/Multidrop.test.ts deleted file mode 100644 index 5c9da42..0000000 --- a/tests/buttonEvents/Multidrop.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -describe("execute", () => { - describe("GIVEN randomCard image is hosted locally", () => { - test.todo("EXPECT image to be uploaded directly"); - }); - - describe("GIVEN randomCard image is hosted via http", () => { - test.todo("EXPECT image link to be directly added to embed"); - }); - - describe("GIVEN randomCard image is hosted via https", () => { - test.todo("EXPECT image link to be directly added to embed"); - }); -}); diff --git a/tests/buttonEvents/Reroll.test.ts b/tests/buttonEvents/Reroll.test.ts deleted file mode 100644 index 2021aac..0000000 --- a/tests/buttonEvents/Reroll.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -describe("GIVEN valid conditions", () => { - test.todo("EXPECT user.RemoveCurrency to be called"); - - test.todo("GIVEN user is saved"); -}); - -test.todo("GIVEN user.RemoveCurrency fails, EXPECT error replied"); \ No newline at end of file diff --git a/tests/commands/__snapshots__/effects.test.ts.snap b/tests/commands/__snapshots__/effects.test.ts.snap deleted file mode 100644 index 474b505..0000000 --- a/tests/commands/__snapshots__/effects.test.ts.snap +++ /dev/null @@ -1,106 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`EXPECT CommandBuilder to be defined 1`] = ` -{ - "contexts": undefined, - "default_member_permissions": undefined, - "default_permission": undefined, - "description": "Effects", - "description_localizations": undefined, - "dm_permission": undefined, - "integration_types": undefined, - "name": "effects", - "name_localizations": undefined, - "nsfw": undefined, - "options": [ - { - "description": "List all effects I have", - "description_localizations": undefined, - "name": "list", - "name_localizations": undefined, - "options": [ - { - "autocomplete": undefined, - "choices": undefined, - "description": "The page number", - "description_localizations": undefined, - "max_value": undefined, - "min_value": 1, - "name": "page", - "name_localizations": undefined, - "required": false, - "type": 10, - }, - ], - "type": 1, - }, - { - "description": "Use an effect in your inventory", - "description_localizations": undefined, - "name": "use", - "name_localizations": undefined, - "options": [ - { - "autocomplete": undefined, - "choices": [ - { - "name": "Unclaimed Chance Up", - "name_localizations": undefined, - "value": "unclaimed", - }, - ], - "description": "The effect id to use", - "description_localizations": undefined, - "max_length": undefined, - "min_length": undefined, - "name": "id", - "name_localizations": undefined, - "required": true, - "type": 3, - }, - ], - "type": 1, - }, - { - "description": "Buy more effects", - "description_localizations": undefined, - "name": "buy", - "name_localizations": undefined, - "options": [ - { - "autocomplete": undefined, - "choices": [ - { - "name": "Unclaimed Chance Up", - "name_localizations": undefined, - "value": "unclaimed", - }, - ], - "description": "The effect id to buy", - "description_localizations": undefined, - "max_length": undefined, - "min_length": undefined, - "name": "id", - "name_localizations": undefined, - "required": true, - "type": 3, - }, - { - "autocomplete": undefined, - "choices": undefined, - "description": "The amount to buy", - "description_localizations": undefined, - "max_value": undefined, - "min_value": 1, - "name": "quantity", - "name_localizations": undefined, - "required": false, - "type": 10, - }, - ], - "type": 1, - }, - ], - "type": 1, -} -`; diff --git a/tests/commands/drop.test.ts b/tests/commands/drop.test.ts deleted file mode 100644 index 81b5f4a..0000000 --- a/tests/commands/drop.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { CommandInteraction } from "discord.js"; -import Drop from "../../src/commands/drop"; -import GenerateCommandInteractionMock from "../__functions__/discord.js/GenerateCommandInteractionMock"; -import { CommandInteraction as CommandInteractionMock } from "../__types__/discord.js"; -import { CoreClient } from "../../src/client/client"; -import Config from "../../src/database/entities/app/Config"; -import User from "../../src/database/entities/app/User"; -import GetCardsHelper from "../../src/helpers/DropHelpers/GetCardsHelper"; -import Inventory from "../../src/database/entities/app/Inventory"; -import DropEmbedHelper from "../../src/helpers/DropHelpers/DropEmbedHelper"; -import CardConstants from "../../src/constants/CardConstants"; -import * as uuid from "uuid"; - -jest.mock("../../src/database/entities/app/Config"); -jest.mock("../../src/database/entities/app/User"); -jest.mock("../../src/helpers/DropHelpers/GetCardsHelper"); -jest.mock("../../src/database/entities/app/Inventory"); -jest.mock("../../src/helpers/DropHelpers/DropEmbedHelper"); - -jest.mock("uuid"); - -beforeEach(() => { - (Config.GetValue as jest.Mock).mockResolvedValue("false"); -}); - -describe("execute", () => { - describe("GIVEN user is in the database", () => { - let interaction: CommandInteractionMock; - let user: User; - const randomCard = { - card: { - id: "cardId", - path: "https://google.com/", - } - }; - - beforeAll(async () => { - // Arrange - CoreClient.AllowDrops = true; - - interaction = GenerateCommandInteractionMock(); - - user = { - Currency: 500, - RemoveCurrency: jest.fn().mockReturnValue(true), - Save: jest.fn(), - } as unknown as User; - - (User.FetchOneById as jest.Mock).mockResolvedValue(user); - (GetCardsHelper.FetchCard as jest.Mock).mockResolvedValue(randomCard); - (Inventory.FetchOneByCardNumberAndUserId as jest.Mock).mockResolvedValue({ - Quantity: 1, - }); - (DropEmbedHelper.GenerateDropEmbed as jest.Mock).mockReturnValue({ - type: "Embed", - }); - (DropEmbedHelper.GenerateDropButtons as jest.Mock).mockReturnValue({ - type: "Button", - }); - - (uuid.v4 as jest.Mock).mockReturnValue("uuid"); - - // Act - const drop = new Drop(); - await drop.execute(interaction as unknown as CommandInteraction); - }); - - test("EXPECT user to be fetched", () => { - expect(User.FetchOneById).toHaveBeenCalledTimes(1); - expect(User.FetchOneById).toHaveBeenCalledWith(User, "userId"); - }); - - test("EXPECT user.RemoveCurrency to be called", () => { - expect(user.RemoveCurrency).toHaveBeenCalledTimes(1); - expect(user.RemoveCurrency).toHaveBeenCalledWith(CardConstants.ClaimCost); - }); - - test("EXPECT user to be saved", () => { - expect(user.Save).toHaveBeenCalledTimes(1); - expect(user.Save).toHaveBeenCalledWith(User, user); - }); - - test("EXPECT random card to be fetched", () => { - expect(GetCardsHelper.FetchCard).toHaveBeenCalledTimes(1); - expect(GetCardsHelper.FetchCard).toHaveBeenCalledWith("userId"); - }); - - test("EXPECT interaction to be deferred", () => { - expect(interaction.deferReply).toHaveBeenCalledTimes(1); - }); - - test("EXPECT Inventory.FetchOneByCardNumberAndUserId to be called", () => { - expect(Inventory.FetchOneByCardNumberAndUserId).toHaveBeenCalledTimes(1); - expect(Inventory.FetchOneByCardNumberAndUserId).toHaveBeenCalledWith("userId", "cardId"); - }); - - test("EXPECT DropEmbedHelper.GenerateDropEmbed to be called", () => { - expect(DropEmbedHelper.GenerateDropEmbed).toHaveBeenCalledTimes(1); - expect(DropEmbedHelper.GenerateDropEmbed).toHaveBeenCalledWith(randomCard, 1, "", undefined, 500); - }); - - test("EXPECT DropEmbedHelper.GenerateDropButtons to be called", () => { - expect(DropEmbedHelper.GenerateDropButtons).toHaveBeenCalledTimes(1); - expect(DropEmbedHelper.GenerateDropButtons).toHaveBeenCalledWith(randomCard, "uuid", "userId"); - }); - - test("EXPECT interaction to be edited", () => { - expect(interaction.editReply).toHaveBeenCalledTimes(1); - expect(interaction.editReply).toHaveBeenCalledWith({ - embeds: [ { type: "Embed" } ], - files: [], - components: [ { type: "Button" } ], - }); - }); - - describe("AND randomCard path is not a url", () => { - test.todo("EXPECT image read from file system"); - - test.todo("EXPECT files on the embed to contain the image as an attachment"); - }); - }); - - describe("GIVEN user is not in the database", () => { - test.todo("EXPECT new user to be created"); - }); - - describe("GIVEN user.RemoveCurrency fails", () => { - test.todo("EXPECT error replied"); - }); - - describe("GIVEN randomCard returns null", () => { - test.todo("EXPECT error logged"); - - test.todo("EXPECT error replied"); - }); - - describe("GIVEN the code throws an error", () => { - test.todo("EXPECT error logged"); - - test.todo("EXPECT interaction edited with error"); - }); -}); \ No newline at end of file diff --git a/tests/commands/effects.test.ts b/tests/commands/effects.test.ts deleted file mode 100644 index 33f612d..0000000 --- a/tests/commands/effects.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import Effects from "../../src/commands/effects"; -import List from "../../src/commands/effects/List"; -import Use from "../../src/commands/effects/Use"; -import Buy from "../../src/commands/effects/Buy"; -import AppLogger from "../../src/client/appLogger"; -import GenerateCommandInteractionMock from "../__functions__/discord.js/GenerateCommandInteractionMock"; -import { CommandInteraction } from "discord.js"; - -jest.mock("../../src/commands/effects/List"); -jest.mock("../../src/commands/effects/Use"); -jest.mock("../../src/commands/effects/Buy"); -jest.mock("../../src/client/appLogger"); - -beforeEach(() => { - jest.resetAllMocks(); -}); - -test("EXPECT CommandBuilder to be defined", async () => { - // Act - const effects = new Effects(); - - // Assert - expect(effects.CommandBuilder).toMatchSnapshot(); -}); - -describe("execute", () => { - test("GIVEN interaction subcommand is list, EXPECT buy function called", async () => { - // Arrange - const interaction = GenerateCommandInteractionMock({ - subcommand: "list", - }); - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as CommandInteraction); - - // Assert - expect(List).toHaveBeenCalledTimes(1); - expect(List).toHaveBeenCalledWith(interaction); - - expect(Use).not.toHaveBeenCalled(); - expect(Buy).not.toHaveBeenCalled(); - - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); - - test("GIVEN interaction subcommand is use, EXPECT buy function called", async () => { - // Arrange - const interaction = GenerateCommandInteractionMock({ - subcommand: "use", - }); - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as CommandInteraction); - - // Assert - expect(Use).toHaveBeenCalledTimes(1); - expect(Use).toHaveBeenCalledWith(interaction); - - expect(List).not.toHaveBeenCalled(); - expect(Buy).not.toHaveBeenCalled(); - - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); - - test("GIVEN interaction subcommand is buy, EXPECT buy function called", async () => { - // Arrange - const interaction = GenerateCommandInteractionMock({ - subcommand: "buy", - }); - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as CommandInteraction); - - // Assert - expect(Buy).toHaveBeenCalledTimes(1); - expect(Buy).toHaveBeenCalledWith(interaction); - - expect(List).not.toHaveBeenCalled(); - expect(Use).not.toHaveBeenCalled(); - - expect(AppLogger.LogError).not.toHaveBeenCalled(); - }); - - test("GIVEN interaction subcommand is invalid, EXPECT error logged", async () => { - // Arrange - const interaction = GenerateCommandInteractionMock({ - subcommand: "invalid", - }); - - // Act - const effects = new Effects(); - await effects.execute(interaction as unknown as CommandInteraction); - - // Assert - expect(AppLogger.LogError).toHaveBeenCalledTimes(1); - expect(AppLogger.LogError).toHaveBeenCalledWith("Commands/Effects", "Invalid subcommand: invalid"); - - expect(List).not.toHaveBeenCalled(); - expect(Use).not.toHaveBeenCalled(); - expect(Buy).not.toHaveBeenCalled(); - }); -}); \ No newline at end of file diff --git a/tests/commands/effects/Buy.test.ts b/tests/commands/effects/Buy.test.ts deleted file mode 100644 index 87e4219..0000000 --- a/tests/commands/effects/Buy.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -jest.mock("../../../src/helpers/EffectHelper"); - -describe("Buy", () => { - test.todo("GIVEN result returns a string, EXPECT interaction replied with string"); - - test.todo("GIVEN result returns an embed, EXPECT interaction replied with embed and row"); - - test.todo("GIVEN quantity option is not supplied, EXPECT quantity to default to 1"); -}); diff --git a/tests/commands/multidrop.test.ts b/tests/commands/multidrop.test.ts deleted file mode 100644 index 5c9da42..0000000 --- a/tests/commands/multidrop.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -describe("execute", () => { - describe("GIVEN randomCard image is hosted locally", () => { - test.todo("EXPECT image to be uploaded directly"); - }); - - describe("GIVEN randomCard image is hosted via http", () => { - test.todo("EXPECT image link to be directly added to embed"); - }); - - describe("GIVEN randomCard image is hosted via https", () => { - test.todo("EXPECT image link to be directly added to embed"); - }); -}); diff --git a/tests/helpers/DropHelpers/DropEmbedHelper.test.ts b/tests/helpers/DropHelpers/DropEmbedHelper.test.ts deleted file mode 100644 index 743f6c7..0000000 --- a/tests/helpers/DropHelpers/DropEmbedHelper.test.ts +++ /dev/null @@ -1,3 +0,0 @@ -describe("GenerateDropButtons", () => { - test.todo("EXPECT row to be returned"); -}); \ No newline at end of file diff --git a/tests/helpers/DropHelpers/GetCardsHelper.test.ts b/tests/helpers/DropHelpers/GetCardsHelper.test.ts deleted file mode 100644 index 421d4ef..0000000 --- a/tests/helpers/DropHelpers/GetCardsHelper.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import GetCardsHelper from "../../../src/helpers/DropHelpers/GetCardsHelper"; -import EffectHelper from "../../../src/helpers/EffectHelper"; -import GetUnclaimedCardsHelper from "../../../src/helpers/DropHelpers/GetUnclaimedCardsHelper"; -import CardConstants from "../../../src/constants/CardConstants"; - -jest.mock("../../../src/helpers/EffectHelper"); -jest.mock("../../../src/helpers/DropHelpers/GetUnclaimedCardsHelper"); - -beforeEach(() => { - jest.resetAllMocks(); -}); - -describe("FetchCard", () => { - test("GIVEN user has the unclaimed effect AND unused chance is within constraint, EXPECT unclaimed card returned", async () => { - // Arrange - (EffectHelper.HasEffect as jest.Mock).mockResolvedValue(true); - GetCardsHelper.GetRandomCard = jest.fn(); - Math.random = jest.fn().mockReturnValue(CardConstants.UnusedChanceUpChance - 0.1); - - // Act - await GetCardsHelper.FetchCard("userId"); - - // Assert - expect(EffectHelper.HasEffect).toHaveBeenCalledTimes(1); - expect(EffectHelper.HasEffect).toHaveBeenCalledWith("userId", "unclaimed"); - - expect(GetUnclaimedCardsHelper.GetRandomCardUnclaimed).toHaveBeenCalledTimes(1); - expect(GetUnclaimedCardsHelper.GetRandomCardUnclaimed).toHaveBeenCalledWith("userId"); - - expect(GetCardsHelper.GetRandomCard).not.toHaveBeenCalled(); - }); - - test("GIVEN user has unclaimed effect AND unused chance is NOT within constraint, EXPECT random card returned", async () => { - // Arrange - (EffectHelper.HasEffect as jest.Mock).mockResolvedValue(true); - GetCardsHelper.GetRandomCard = jest.fn(); - Math.random = jest.fn().mockReturnValue(CardConstants.UnusedChanceUpChance + 0.1); - - // Act - await GetCardsHelper.FetchCard("userId"); - - // Assert - expect(EffectHelper.HasEffect).toHaveBeenCalledTimes(1); - expect(EffectHelper.HasEffect).toHaveBeenCalledWith("userId", "unclaimed"); - - expect(GetCardsHelper.GetRandomCard).toHaveBeenCalledTimes(1); - - expect(GetUnclaimedCardsHelper.GetRandomCardUnclaimed).not.toHaveBeenCalled(); - }); - - test("GIVEN user does NOT have unclaimed effect, EXPECT random card returned", async () => { - // Arrange - (EffectHelper.HasEffect as jest.Mock).mockResolvedValue(false); - GetCardsHelper.GetRandomCard = jest.fn(); - Math.random = jest.fn().mockReturnValue(CardConstants.UnusedChanceUpChance + 0.1); - - // Act - await GetCardsHelper.FetchCard("userId"); - - // Assert - expect(EffectHelper.HasEffect).toHaveBeenCalledTimes(1); - expect(EffectHelper.HasEffect).toHaveBeenCalledWith("userId", "unclaimed"); - - expect(GetCardsHelper.GetRandomCard).toHaveBeenCalledTimes(1); - - expect(GetUnclaimedCardsHelper.GetRandomCardUnclaimed).not.toHaveBeenCalled(); - }); -}); \ No newline at end of file diff --git a/tests/helpers/EffectHelper.test.ts b/tests/helpers/EffectHelper.test.ts deleted file mode 100644 index dcab744..0000000 --- a/tests/helpers/EffectHelper.test.ts +++ /dev/null @@ -1,127 +0,0 @@ -import EffectHelper from "../../src/helpers/EffectHelper"; -import UserEffect from "../../src/database/entities/app/UserEffect"; - -jest.mock("../../src/database/entities/app/UserEffect"); - -describe("GenerateEffectListEmbed", () => { - test("GIVEN user has an effect, EXPECT detailed embed to be returned", async () => { - // Arrange - (UserEffect.FetchAllByUserIdPaginated as jest.Mock).mockResolvedValue([ - [ - { - Name: "unclaimed", - Unused: 1, - } - ], - 1, - ]); - - // Act - const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); - - // Assert - expect(result).toMatchSnapshot(); - }); - - test("GIVEN user has more than 1 page of effects, EXPECT pagination enabled", async () => { - const effects: { - Name: string, - Unused: number, - }[] = []; - - for (let i = 0; i < 15; i++) { - effects.push({ - Name: "unclaimed", - Unused: 1, - }); - } - - // Arrange - (UserEffect.FetchAllByUserIdPaginated as jest.Mock).mockResolvedValue([ - effects, - 15, - ]); - - // Act - const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); - - // Assert - expect(result).toMatchSnapshot(); - }); - - test("GIVEN user is on a page other than 1, EXPECT pagination enabled", async () => { - const effects: { - Name: string, - Unused: number, - }[] = []; - - for (let i = 0; i < 15; i++) { - effects.push({ - Name: "unclaimed", - Unused: 1, - }); - } - - // Arrange - (UserEffect.FetchAllByUserIdPaginated as jest.Mock).mockResolvedValue([ - effects, - 15, - ]); - - // Act - const result = await EffectHelper.GenerateEffectListEmbed("userId", 2); - - // Assert - expect(result).toMatchSnapshot(); - }); - - test("GIVEN user does NOT have an effect, EXPECT empty embed to be returned", async () => { - // Arrange - (UserEffect.FetchAllByUserIdPaginated as jest.Mock).mockResolvedValue([ - [], - 0, - ]); - - // Act - const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); - - // Assert - expect(result).toMatchSnapshot(); - }); - - test("GIVEN there is an active effect, EXPECT field added", async () => { - // Arrange - (UserEffect.FetchAllByUserIdPaginated as jest.Mock).mockResolvedValue([ - [ - { - Name: "unclaimed", - Unused: 1, - } - ], - 1, - ]); - - (UserEffect.FetchActiveEffectByUserId as jest.Mock).mockResolvedValue({ - Name: "unclaimed", - WhenExpires: new Date(1738174052), - }); - - // Act - const result = await EffectHelper.GenerateEffectListEmbed("userId", 1); - - // Assert - expect(result).toMatchSnapshot(); - }); -}); - -describe("GenerateEffectBuyEmbed", () => { - test.todo("GIVEN Effect Details are not found, EXPECT error"); - - test.todo("GIVEN user is not in database, EXPECT blank user created"); - - test.todo("GIVEN user does not have enough currency, EXPECT error"); - - test.todo("GIVEN user does have enough currency, EXPECT embed returned"); - - test.todo("GIVEN disabled boolean is true, EXPECT buttons to be disabled"); -}); \ No newline at end of file diff --git a/tests/helpers/TimeLengthInput.test.ts b/tests/helpers/TimeLengthInput.test.ts deleted file mode 100644 index 6a23d67..0000000 --- a/tests/helpers/TimeLengthInput.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import TimeLengthInput from "../../src/helpers/TimeLengthInput"; - -describe("ConvertFromMilliseconds", () => { - test("EXPECT 1000ms to be outputted as a second", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(1000); - expect(timeLength.GetLengthShort()).toBe("1s"); - }); - - test("EXPECT 60000ms to be outputted as a minute", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(60000); - expect(timeLength.GetLengthShort()).toBe("1m"); - }); - - test("EXPECT 3600000ms to be outputted as an hour", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(3600000); - expect(timeLength.GetLengthShort()).toBe("1h"); - }); - - test("EXPECT 86400000ms to be outputted as a day", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(86400000); - expect(timeLength.GetLengthShort()).toBe("1d"); - }); - - test("EXPECT a combination to be outputted correctly", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(90061000); - expect(timeLength.GetLengthShort()).toBe("1d 1h 1m 1s"); - }); - - test("EXPECT 0ms to be outputted as empty", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(0); - expect(timeLength.GetLengthShort()).toBe(""); - }); - - test("EXPECT 123456789ms to be outputted correctly", () => { - const timeLength = TimeLengthInput.ConvertFromMilliseconds(123456789); - expect(timeLength.GetLengthShort()).toBe("1d 10h 17m 36s"); - }); -}); \ No newline at end of file diff --git a/tests/helpers/__snapshots__/EffectHelper.test.ts.snap b/tests/helpers/__snapshots__/EffectHelper.test.ts.snap deleted file mode 100644 index fc3317e..0000000 --- a/tests/helpers/__snapshots__/EffectHelper.test.ts.snap +++ /dev/null @@ -1,216 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`GenerateEffectListEmbed GIVEN there is an active effect, EXPECT field added 1`] = ` -{ - "embed": { - "color": 3166394, - "description": "Unclaimed Chance Up x1", - "fields": [ - { - "inline": true, - "name": "Active", - "value": "Unclaimed Chance Up", - }, - { - "inline": true, - "name": "Expires", - "value": "", - }, - ], - "footer": { - "icon_url": undefined, - "text": "Page 1 of 1", - }, - "title": "Effects", - }, - "row": { - "components": [ - { - "custom_id": "effects list 0", - "disabled": true, - "emoji": undefined, - "label": "Previous", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects list 2", - "disabled": true, - "emoji": undefined, - "label": "Next", - "style": 1, - "type": 2, - }, - ], - "type": 1, - }, -} -`; - -exports[`GenerateEffectListEmbed GIVEN user does NOT have an effect, EXPECT empty embed to be returned 1`] = ` -{ - "embed": { - "color": 3166394, - "description": "*none*", - "footer": { - "icon_url": undefined, - "text": "Page 1 of 1", - }, - "title": "Effects", - }, - "row": { - "components": [ - { - "custom_id": "effects list 0", - "disabled": true, - "emoji": undefined, - "label": "Previous", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects list 2", - "disabled": true, - "emoji": undefined, - "label": "Next", - "style": 1, - "type": 2, - }, - ], - "type": 1, - }, -} -`; - -exports[`GenerateEffectListEmbed GIVEN user has an effect, EXPECT detailed embed to be returned 1`] = ` -{ - "embed": { - "color": 3166394, - "description": "Unclaimed Chance Up x1", - "footer": { - "icon_url": undefined, - "text": "Page 1 of 1", - }, - "title": "Effects", - }, - "row": { - "components": [ - { - "custom_id": "effects list 0", - "disabled": true, - "emoji": undefined, - "label": "Previous", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects list 2", - "disabled": true, - "emoji": undefined, - "label": "Next", - "style": 1, - "type": 2, - }, - ], - "type": 1, - }, -} -`; - -exports[`GenerateEffectListEmbed GIVEN user has more than 1 page of effects, EXPECT pagination enabled 1`] = ` -{ - "embed": { - "color": 3166394, - "description": "Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1", - "footer": { - "icon_url": undefined, - "text": "Page 1 of 2", - }, - "title": "Effects", - }, - "row": { - "components": [ - { - "custom_id": "effects list 0", - "disabled": true, - "emoji": undefined, - "label": "Previous", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects list 2", - "disabled": false, - "emoji": undefined, - "label": "Next", - "style": 1, - "type": 2, - }, - ], - "type": 1, - }, -} -`; - -exports[`GenerateEffectListEmbed GIVEN user is on a page other than 1, EXPECT pagination enabled 1`] = ` -{ - "embed": { - "color": 3166394, - "description": "Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1 -Unclaimed Chance Up x1", - "footer": { - "icon_url": undefined, - "text": "Page 2 of 2", - }, - "title": "Effects", - }, - "row": { - "components": [ - { - "custom_id": "effects list 1", - "disabled": false, - "emoji": undefined, - "label": "Previous", - "style": 1, - "type": 2, - }, - { - "custom_id": "effects list 3", - "disabled": true, - "emoji": undefined, - "label": "Next", - "style": 1, - "type": 2, - }, - ], - "type": 1, - }, -} -`; diff --git a/tests/timers/PurgeClaims.test.ts b/tests/timers/PurgeClaims.test.ts deleted file mode 100644 index 6d0d09b..0000000 --- a/tests/timers/PurgeClaims.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -describe("PurgeClaims", () => { - test.todo("EXPECT claims to be fetched"); - - test.todo("EXPECT Claim.RemoveMany to remove the claims older than 2 minutes"); - - test.todo("EXPECT info logged"); -}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c63e681..8585cbd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,121 +3,167 @@ "@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" + "@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.25.9", "@babel/code-frame@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815" - integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g== +"@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== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.25.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.0.tgz#f02ba6d34e88fadd5e8861e8b38902f43cc1c819" - integrity sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA== +"@babel/compat-data@^7.22.9": + 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", "@babel/core@^7.23.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + 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.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.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.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.0.tgz#505cc7c90d92513f458a477e5ef0703e7c91b8d7" - integrity sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w== +"@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/parser" "^7.26.0" - "@babel/types" "^7.26.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" + "@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.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@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.25.9" - "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== +"@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.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/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/types" "^7.22.5" -"@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.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@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/template" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/types" "^7.22.15" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0": - version "7.26.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.1.tgz#44e02499960df2cdce2c456372a3e8e0c3c5c975" - integrity sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw== +"@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/types" "^7.26.0" + "@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.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" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + 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.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.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.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.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + +"@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.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": + version "7.22.10" + 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.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== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -133,28 +179,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-import-meta@^7.10.4": +"@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -169,13 +201,13 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -189,7 +221,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -217,14 +249,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": +"@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -232,223 +257,145 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== +"@babel/runtime@^7.21.0": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" + regenerator-runtime "^0.14.0" -"@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== +"@babel/template@^7.22.15": + 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.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" - debug "^4.3.1" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@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== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@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.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.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.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@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.25.9" - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== +"@bconnorwhite/module@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@bconnorwhite/module/-/module-2.0.2.tgz#557846110bb89412e9689ac778358bc2b1af0c4a" + integrity sha512-ck1me5WMgZKp06gnJrVKEkytpehTTQbvsAMbF1nGPeHri/AZNhj87++PSE2LOxmZqM0EtGMaqeLdx7Lw7SUnTA== dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" + find-up "^5.0.0" + read-json-safe "^1.0.5" + types-pkg-json "^1.1.0" -"@discordjs/builders@^1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.9.0.tgz#71fa6de91132bd1deaff2a9daea7aa5d5c9f124a" - integrity sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg== +"@discordjs/builders@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.6.5.tgz#3e23912eaab1d542b61ca0fa7202e5aaef2b7200" + integrity sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg== dependencies: - "@discordjs/formatters" "^0.5.0" - "@discordjs/util" "^1.1.1" - "@sapphire/shapeshift" "^4.0.0" - discord-api-types "0.37.97" + "@discordjs/formatters" "^0.3.2" + "@discordjs/util" "^1.0.1" + "@sapphire/shapeshift" "^3.9.2" + discord-api-types "0.37.50" fast-deep-equal "^3.1.3" - ts-mixer "^6.0.4" - tslib "^2.6.3" + ts-mixer "^6.0.3" + tslib "^2.6.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== -"@discordjs/collection@^2.1.0", "@discordjs/collection@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.1.1.tgz#901917bc538c12b9c3613036d317847baee08cae" - integrity sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg== - -"@discordjs/formatters@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.5.0.tgz#2d284c4271bc41984339936df1d0164e470f3b7a" - integrity sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g== +"@discordjs/formatters@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.2.tgz#3ae054f7b3097cc0dc7645fade37a3f20fa1fb4b" + integrity sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA== dependencies: - discord-api-types "0.37.97" + discord-api-types "0.37.50" -"@discordjs/rest@^2.0.0", "@discordjs/rest@^2.3.0", "@discordjs/rest@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.4.0.tgz#63bfc816af58af844914e3589d7eae609cd199b5" - integrity sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw== +"@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== dependencies: - "@discordjs/collection" "^2.1.1" - "@discordjs/util" "^1.1.1" - "@sapphire/async-queue" "^1.5.3" - "@sapphire/snowflake" "^3.5.3" - "@vladfrangu/async_event_emitter" "^2.4.6" - discord-api-types "0.37.97" - magic-bytes.js "^1.10.0" - tslib "^2.6.3" - undici "6.19.8" + "@discordjs/collection" "^1.5.3" + "@discordjs/util" "^1.0.1" + "@sapphire/async-queue" "^1.5.0" + "@sapphire/snowflake" "^3.5.1" + "@vladfrangu/async_event_emitter" "^2.2.2" + discord-api-types "0.37.50" + magic-bytes.js "^1.0.15" + tslib "^2.6.1" + undici "5.22.1" -"@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.1.1.tgz#bafcde0faa116c834da1258d78ec237080bbab29" - integrity sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g== - -"@discordjs/ws@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.1.1.tgz#bffbfd46838258ab09054ed98ddef1a36f6507a3" - integrity sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA== - dependencies: - "@discordjs/collection" "^2.1.0" - "@discordjs/rest" "^2.3.0" - "@discordjs/util" "^1.1.0" - "@sapphire/async-queue" "^1.5.2" - "@types/ws" "^8.5.10" - "@vladfrangu/async_event_emitter" "^2.2.4" - discord-api-types "0.37.83" - tslib "^2.6.2" - ws "^8.16.0" - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" - integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/config-array@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" - integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== - dependencies: - "@eslint/object-schema" "^2.1.4" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/core@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" - integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== - -"@eslint/eslintrc@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" - integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.13.0": - version "9.13.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.13.0.tgz#c5f89bcd57eb54d5d4fa8b77693e9c28dc97e547" - integrity sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA== - -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== - -"@eslint/plugin-kit@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz#cd14fe2db79fa639839dfef4105e83bad1814482" - integrity sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw== - dependencies: - levn "^0.4.1" - -"@humanfs/core@^0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.0.tgz#08db7a8c73bb07673d9ebd925f2dad746411fcec" - integrity sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw== - -"@humanfs/node@^0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.5.tgz#a9febb7e7ad2aff65890fdc630938f8d20aa84ba" - integrity sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg== - dependencies: - "@humanfs/core" "^0.19.0" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": +"@discordjs/util@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.1.tgz#7d6f97b65425d3a8b46ea1180150dee6991a88cf" + integrity sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA== -"@humanwhocodes/retry@^0.3.0", "@humanwhocodes/retry@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@inquirer/figures@^1.0.3": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.7.tgz#d050ccc0eabfacc0248c4ff647a9dfba1b01594b" - integrity sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== +"@discordjs/ws@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.1.tgz#fab8aa4c1667040a95b5268a2875add27353d323" + integrity sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g== dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@discordjs/collection" "^1.5.3" + "@discordjs/rest" "^2.0.1" + "@discordjs/util" "^1.0.1" + "@sapphire/async-queue" "^1.5.0" + "@types/ws" "^8.5.5" + "@vladfrangu/async_event_emitter" "^2.2.2" + discord-api-types "0.37.50" + tslib "^2.6.1" + ws "^8.13.0" + +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -461,7 +408,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": +"@istanbuljs/schema@^0.1.2": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -646,7 +593,7 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.6.3": +"@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== @@ -658,311 +605,43 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jimp/core@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-1.6.0.tgz#3ef241bf02f40431bb382aea665e5187a2c05eef" - integrity sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: - "@jimp/file-ops" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - await-to-js "^3.0.0" - exif-parser "^0.1.12" - file-type "^16.0.0" - mime "3" - -"@jimp/diff@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/diff/-/diff-1.6.0.tgz#f8d058bfad64751c5e5c135499d1a784f797c5c8" - integrity sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw== - dependencies: - "@jimp/plugin-resize" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - pixelmatch "^5.3.0" - -"@jimp/file-ops@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/file-ops/-/file-ops-1.6.0.tgz#ae9c6aa65b2c9a5a16515a8fdf83b55f51100087" - integrity sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ== - -"@jimp/js-bmp@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/js-bmp/-/js-bmp-1.6.0.tgz#ff7c4306e764745063e249ee926d0dd807924abf" - integrity sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - bmp-ts "^1.0.9" - -"@jimp/js-gif@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/js-gif/-/js-gif-1.6.0.tgz#0efa5d83317a89d6eda936e2ae1df2b7d122a38d" - integrity sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - gifwrap "^0.10.1" - omggif "^1.0.10" - -"@jimp/js-jpeg@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/js-jpeg/-/js-jpeg-1.6.0.tgz#e47da6758346548079f0ac8ff215d0d9d1ec435e" - integrity sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - jpeg-js "^0.4.4" - -"@jimp/js-png@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/js-png/-/js-png-1.6.0.tgz#c857adfdbfcb7107a6511c3b2939ffbad0fefedc" - integrity sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - pngjs "^7.0.0" - -"@jimp/js-tiff@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/js-tiff/-/js-tiff-1.6.0.tgz#f18fa3d59f52fda339acfdcadbe7363bed912e81" - integrity sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - utif2 "^4.1.0" - -"@jimp/plugin-blit@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-1.6.0.tgz#fed35aefbb5757599a4299a9ff6c06cc3466f46f" - integrity sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA== - dependencies: - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-blur@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-1.6.0.tgz#781b3be9de2744e5eb6ab86ec05ee7d2ce5092e8" - integrity sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/utils" "1.6.0" - -"@jimp/plugin-circle@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-1.6.0.tgz#2314dc7955068cb4a000de4eceb02890eb131c88" - integrity sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw== - dependencies: - "@jimp/types" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-color@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-1.6.0.tgz#927c83ee932070ad285266840728c21ac39bf27b" - integrity sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - tinycolor2 "^1.6.0" - zod "^3.23.8" - -"@jimp/plugin-contain@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-1.6.0.tgz#d08900ecf85ac564a6f9f3fc0d61cc8d5e43626e" - integrity sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/plugin-blit" "1.6.0" - "@jimp/plugin-resize" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-cover@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-1.6.0.tgz#07ffb2f3d6ac53616c66f1131cd66ced17e3ca3e" - integrity sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/plugin-crop" "1.6.0" - "@jimp/plugin-resize" "1.6.0" - "@jimp/types" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-crop@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-1.6.0.tgz#59f2b20869330fd768d1743d845b8ba9ed9bc52a" - integrity sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-displace@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-1.6.0.tgz#41b3257a6c0f64c749c29c1a2e64ba7df31a7a25" - integrity sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q== - dependencies: - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-dither@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-1.6.0.tgz#10c17070dcbec565904f11b7986e90ae20850b6f" - integrity sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ== - dependencies: - "@jimp/types" "1.6.0" - -"@jimp/plugin-fisheye@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-1.6.0.tgz#2831c0060598b27bf004bf8a70adfeec003d4fcc" - integrity sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA== - dependencies: - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-flip@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-1.6.0.tgz#75c87bdb0f0ca9db44b320cc9671aa201e52b5c3" - integrity sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg== - dependencies: - "@jimp/types" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-hash@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-hash/-/plugin-hash-1.6.0.tgz#8de89dfbbb6be671f9cdb2b59816acf3f07c4298" - integrity sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/js-bmp" "1.6.0" - "@jimp/js-jpeg" "1.6.0" - "@jimp/js-png" "1.6.0" - "@jimp/js-tiff" "1.6.0" - "@jimp/plugin-color" "1.6.0" - "@jimp/plugin-resize" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - any-base "^1.1.0" - -"@jimp/plugin-mask@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-1.6.0.tgz#2b5a437e5d9a9906dcabb7a7baf4d5cd7d2361b1" - integrity sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA== - dependencies: - "@jimp/types" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-print@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-1.6.0.tgz#ccef327f53afb47617aa66ca65435447380faf34" - integrity sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/js-jpeg" "1.6.0" - "@jimp/js-png" "1.6.0" - "@jimp/plugin-blit" "1.6.0" - "@jimp/types" "1.6.0" - parse-bmfont-ascii "^1.0.6" - parse-bmfont-binary "^1.0.6" - parse-bmfont-xml "^1.1.6" - simple-xml-to-json "^1.2.2" - zod "^3.23.8" - -"@jimp/plugin-quantize@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-quantize/-/plugin-quantize-1.6.0.tgz#880095fc0ead41321d94bf54895e366dd7d079d6" - integrity sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg== - dependencies: - image-q "^4.0.0" - zod "^3.23.8" - -"@jimp/plugin-resize@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-1.6.0.tgz#331e8912ed68746846145019bc6e2ea057e6f175" - integrity sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/types" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-rotate@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-1.6.0.tgz#de271f39a3ac9e853b02e01d3d44ab086d12e099" - integrity sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/plugin-crop" "1.6.0" - "@jimp/plugin-resize" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/plugin-threshold@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-1.6.0.tgz#11479cf59131ea95dcaff6a1403af1964593a3fa" - integrity sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/plugin-color" "1.6.0" - "@jimp/plugin-hash" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - zod "^3.23.8" - -"@jimp/types@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-1.6.0.tgz#27022730fd673653e1430e6bd8ac6f6de1596f89" - integrity sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg== - dependencies: - zod "^3.23.8" - -"@jimp/utils@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-1.6.0.tgz#e196f3953ea1ebc88f50cf0d490adb24aeffe596" - integrity sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA== - dependencies: - "@jimp/types" "1.6.0" - tinycolor2 "^1.6.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@ljharb/through@^2.3.9": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.9.tgz#85f221eb82f9d555e180e87d6e50fb154af85408" + integrity sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ== + "@mapbox/node-pre-gyp@^1.0.0": version "1.0.11" resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" @@ -999,10 +678,21 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" "@pnpm/config.env-replace@^1.1.0": version "1.1.0" @@ -1017,9 +707,9 @@ graceful-fs "4.2.10" "@pnpm/npm-conf@^2.1.0": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" - integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" @@ -1032,33 +722,43 @@ dependencies: any-observable "^0.3.0" -"@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.3.tgz#03cd2a2f3665068f314736bdc56eee2025352422" - integrity sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w== +"@sapphire/async-queue@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" + integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== -"@sapphire/shapeshift@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz#86c1b41002ff5d0b2ad21cbc3418b06834b89040" - integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== +"@sapphire/shapeshift@^3.9.2": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.2.tgz#a9c12cd51e1bc467619bb56df804450dd14871ac" + integrity sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA== dependencies: fast-deep-equal "^3.1.3" lodash "^4.17.21" -"@sapphire/snowflake@3.5.3", "@sapphire/snowflake@^3.5.3": - version "3.5.3" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.3.tgz#0c102aa2ec5b34f806e9bc8625fc6a5e1d0a0c6a" - integrity sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ== +"@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== "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0", "@sindresorhus/is@^5.3.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + "@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" @@ -1074,15 +774,29 @@ resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== -"@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== +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + 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" @@ -1091,302 +805,230 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + 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.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + 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.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + 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" "@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + 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/clone-deep@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/clone-deep/-/clone-deep-4.0.4.tgz#6932f2d0a4b4ef337d97cb72e6ecdf091c05145d" - integrity sha512-vXh6JuuaAha6sqEbJueYdh5zNBPPgG1OYumuz2UvLvriN6ABHDSW8ludREGWJb1MLIzbwZn4q4zUbUCerJTJfA== +"@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" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" "@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + 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/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/express-serve-static-core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" - integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== +"@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@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== +"@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" "^5.0.0" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" "@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + 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" "*" -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.1": + version "4.0.1" + 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": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== +"@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" + 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.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + 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.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + 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.5.14": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== +"@types/jest@^29.0.0": + 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" -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" -"@types/luxon@~3.4.0": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.4.2.tgz#e4fc7214a420173cea47739c33cdf10874694db7" - integrity sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA== +"@types/mime@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" + integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== "@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" + integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== -"@types/node@*", "@types/node@^22.8.1": - version "22.8.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.8.1.tgz#b39d4b98165e2ae792ce213f610c7c6108ccfa16" - integrity sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg== +"@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 "~6.19.8" + undici-types "~5.26.4" -"@types/node@16.9.1": - version "16.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708" - integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== +"@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== + dependencies: + undici-types "~5.25.1" -"@types/normalize-package-data@^2.4.3": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/normalize-package-data@^2.4.1": + 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/qs@*": - version "6.9.16" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" - integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== + 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.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + 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" + integrity sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA== + dependencies: + "@types/node" "*" "@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + 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.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + 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/send" "*" "@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + 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/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/uuid@^9.0.0": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.6.tgz#c91ae743d8344a54b2b0c691195f5ff5265f6dfb" + integrity sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew== -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@types/ws@^8.5.10": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== +"@types/ws@^8.5.5": + 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" "*" "@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + 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.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + 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" "*" -"@typescript-eslint/eslint-plugin@8.11.0", "@typescript-eslint/eslint-plugin@^8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz#c3f087d20715fa94310b30666c08b3349e0ab084" - integrity sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.11.0" - "@typescript-eslint/type-utils" "8.11.0" - "@typescript-eslint/utils" "8.11.0" - "@typescript-eslint/visitor-keys" "8.11.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@8.11.0", "@typescript-eslint/parser@^8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.11.0.tgz#2ad1481388dc1c937f50b2d138c9ca57cc6c5cce" - integrity sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg== - dependencies: - "@typescript-eslint/scope-manager" "8.11.0" - "@typescript-eslint/types" "8.11.0" - "@typescript-eslint/typescript-estree" "8.11.0" - "@typescript-eslint/visitor-keys" "8.11.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz#9d399ce624118966732824878bc9a83593a30405" - integrity sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ== - dependencies: - "@typescript-eslint/types" "8.11.0" - "@typescript-eslint/visitor-keys" "8.11.0" - -"@typescript-eslint/type-utils@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz#b7f9e6120c1ddee8a1a07615646642ad85fc91b5" - integrity sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg== - dependencies: - "@typescript-eslint/typescript-estree" "8.11.0" - "@typescript-eslint/utils" "8.11.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.11.0.tgz#7c766250502097f49bbc2e651132e6bf489e20b8" - integrity sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw== - -"@typescript-eslint/typescript-estree@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz#35fe5d3636fc5727c52429393415412e552e222b" - integrity sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg== - dependencies: - "@typescript-eslint/types" "8.11.0" - "@typescript-eslint/visitor-keys" "8.11.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.11.0.tgz#4480d1e9f2bb18ea3510c79f870a1aefc118103d" - integrity sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.11.0" - "@typescript-eslint/types" "8.11.0" - "@typescript-eslint/typescript-estree" "8.11.0" - -"@typescript-eslint/visitor-keys@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz#273de1cbffe63d9f9cd7dfc20b5a5af66310cb92" - integrity sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw== - dependencies: - "@typescript-eslint/types" "8.11.0" - eslint-visitor-keys "^3.4.3" - -"@vladfrangu/async_event_emitter@^2.2.4", "@vladfrangu/async_event_emitter@^2.4.6": - version "2.4.6" - resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" - integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== +"@vladfrangu/async_event_emitter@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz#84c5a3f8d648842cec5cc649b88df599af32ed88" + integrity sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1395,23 +1037,28 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.12.0: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - -agent-base@6: +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" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agentkeepalive@^4.1.3: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + aggregate-error@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" @@ -1420,15 +1067,16 @@ aggregate-error@^4.0.0: clean-stack "^4.0.0" indent-string "^5.0.0" -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +all-package-names@^2.0.2: + version "2.0.713" + resolved "https://registry.yarnpkg.com/all-package-names/-/all-package-names-2.0.713.tgz#4693690ac02d8adc19fe269f02e1095dd31adce8" + integrity sha512-JvEzctY1eqTWrwagvOvMkO0KT6eOEzosRIz+aa6fwiN8r/OSwBo+ICS1gDZuT49R1lqpRw1XOK/LvJTcExK2Qw== dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + commander-version "^1.1.0" + p-lock "^2.0.0" + parse-json-object "^2.0.1" + progress "^2.0.3" + types-json "^1.2.2" ansi-align@^3.0.1: version "3.0.1" @@ -1477,9 +1125,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^2.2.1: version "2.2.1" @@ -1505,16 +1153,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0, ansi-styles@^6.2.1: +ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -any-base@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" - integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== - any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" @@ -1551,6 +1194,14 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1568,38 +1219,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -atomically@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.0.3.tgz#27e47bbe39994d324918491ba7c0edb7783e56cb" - integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw== - dependencies: - stubborn-fs "^1.2.5" - when-exit "^2.1.1" - -await-to-js@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/await-to-js/-/await-to-js-3.0.0.tgz#70929994185616f4675a91af6167eb61cc92868f" - integrity sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g== - -axios@^1.8.4: - version "1.8.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447" - integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -1635,25 +1254,22 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.8.3" babel-preset-jest@^29.6.3: version "29.6.3" @@ -1673,6 +1289,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + bignumber.js@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" @@ -1687,15 +1308,28 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bmp-ts@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/bmp-ts/-/bmp-ts-1.0.9.tgz#0fd124ba812be9b786b29e5b186ee76d74ff5538" - integrity sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw== +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.3, body-parser@^1.20.2: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== +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" @@ -1705,24 +1339,31 @@ body-parser@1.20.3, body-parser@^1.20.2: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.13.0" + qs "6.11.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" -boxen@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-8.0.1.tgz#7e9fcbb45e11a2d7e6daa8fdcebfc3242fc19fe3" - integrity sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw== +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== dependencies: ansi-align "^3.0.1" - camelcase "^8.0.0" - chalk "^5.3.0" + camelcase "^7.0.1" + chalk "^5.2.0" cli-boxes "^3.0.0" - string-width "^7.2.0" - type-fest "^4.21.0" - widest-line "^5.0.0" - wrap-ansi "^9.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" brace-expansion@^1.1.7: version "1.1.11" @@ -1739,24 +1380,24 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - fill-range "^7.1.1" + fill-range "^7.0.1" -browserslist@^4.24.0: - version "4.24.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" - integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== +browserslist@^4.21.9: + 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.30001669" - electron-to-chromium "^1.5.41" - node-releases "^2.0.18" - update-browserslist-db "^1.1.1" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" -bs-logger@^0.2.6: +bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== @@ -1791,42 +1432,101 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== dependencies: - run-applescript "^7.0.0" + run-applescript "^5.0.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== -call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.13" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.13.tgz#b7012bb4a2acdb18cb54d2dff751d766b3500842" + integrity sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA== dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + "@types/http-cache-semantics" "^4.0.1" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +callsites@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" + integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -1837,31 +1537,15 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelcase@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" - integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== +camelcase@^7.0.1: + version "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.30001669: - version "1.0.30001673" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz#5aa291557af1c71340e809987367410aab7a5a9e" - integrity sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw== - -canvas@^2.11.2: - version "2.11.2" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" - integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - nan "^2.17.0" - simple-get "^3.0.3" - -chalk-template@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" - integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== - dependencies: - chalk "^5.2.0" +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" @@ -1883,7 +1567,7 @@ chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1891,7 +1575,7 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.2.0, chalk@^5.3.0: +chalk@^5.0.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -1917,9 +1601,14 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== clean-stack@^4.0.0: version "4.2.0" @@ -1960,9 +1649,9 @@ cli-highlight@^2.1.11: yargs "^16.0.0" cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== cli-truncate@^0.2.1: version "0.2.1" @@ -2005,14 +1694,12 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" + mimic-response "^1.0.0" clone@^1.0.2: version "1.0.4" @@ -2034,7 +1721,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-convert@^1.9.0, color-convert@^1.9.3: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2053,56 +1740,28 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color-support@^1.1.2: +color-support@^1.1.2, color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== +commander-version@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/commander-version/-/commander-version-1.1.0.tgz#fbfaea4632921a42f8f855f96bcaa3d9920a6296" + integrity sha512-9aNW4N6q6EPDUszLRH6k9IwO6OoGYh3HRgUF/fA7Zs+Mz1v1x5akSqT7QGB8JsGY7AG7qMA7oRRB/4yyn33FYA== dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" + "@bconnorwhite/module" "^2.0.2" + commander "^6.1.0" -colors@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -component-emitter@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== +commander@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== concat-map@0.0.1: version "0.0.1" @@ -2117,15 +1776,16 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -configstore@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-7.0.0.tgz#4461561fc51cb40e5ee1161230bc0337e069cc6b" - integrity sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ== +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== dependencies: - atomically "^2.0.3" - dot-prop "^9.0.0" - graceful-fs "^4.2.11" - xdg-basedir "^5.1.0" + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" @@ -2154,29 +1814,24 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -cookiejar@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== +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" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^8.3.6: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== +cosmiconfig@^8.1.3: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: - import-fresh "^3.3.0" + import-fresh "^3.2.1" js-yaml "^4.1.0" - parse-json "^5.2.0" + parse-json "^5.0.0" path-type "^4.0.0" create-jest@^29.7.0: @@ -2192,15 +1847,7 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -cron@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/cron/-/cron-3.1.7.tgz#3423d618ba625e78458fff8cb67001672d49ba0d" - integrity sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw== - dependencies: - "@types/luxon" "~3.4.0" - luxon "~3.4.0" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2209,15 +1856,24 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + date-fns@^1.27.2: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -dayjs@^1.11.9: - version "1.11.13" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" - integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== +date-fns@^2.29.3: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" debug@2.6.9: version "2.6.9" @@ -2226,52 +1882,52 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== +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" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "^2.1.3" + ms "2.1.2" -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: - mimic-response "^2.0.0" + mimic-response "^3.1.0" dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" - integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== - -default-browser@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" - integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" defaults@^1.0.3: version "1.0.4" @@ -2280,24 +1936,20 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -del@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-7.1.0.tgz#0de0044d556b649ff05387f1fa7c885e155fd1b6" - integrity sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg== +del@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-7.0.0.tgz#79db048bec96f83f344b46c1a66e35d9c09fe8ac" + integrity sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q== dependencies: globby "^13.1.2" graceful-fs "^4.2.10" @@ -2308,11 +1960,6 @@ del@^7.1.0: rimraf "^3.0.2" slash "^4.0.0" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -2329,9 +1976,9 @@ destroy@1.2.0: integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== detect-newline@^3.0.0: version "3.1.0" @@ -2350,59 +1997,49 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -discord-api-types@0.37.100: - version "0.37.100" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.100.tgz#5979892d39511bc7f1dbb9660d2d2cad698b3de7" - integrity sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA== +discord-api-types@0.37.50: + version "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.83: - version "0.37.83" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.83.tgz#a22a799729ceded8176ea747157837ddf4708b1f" - integrity sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA== - -discord-api-types@0.37.97: - version "0.37.97" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.97.tgz#d658573f726ad179261d538dbad4e7e8eca48d11" - integrity sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA== - -discord.js@^14.16.3: - version "14.16.3" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.16.3.tgz#9553366953c992469f47a55af2a11c2054a9babe" - integrity sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA== +discord.js@^14.3.0: + version "14.13.0" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.13.0.tgz#e7a00bdba70adb9e266a06884ca1acaf9a0b5c20" + integrity sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA== dependencies: - "@discordjs/builders" "^1.9.0" - "@discordjs/collection" "1.5.3" - "@discordjs/formatters" "^0.5.0" - "@discordjs/rest" "^2.4.0" - "@discordjs/util" "^1.1.1" - "@discordjs/ws" "1.1.1" - "@sapphire/snowflake" "3.5.3" - discord-api-types "0.37.100" - fast-deep-equal "3.1.3" - lodash.snakecase "4.1.1" - tslib "^2.6.3" - undici "6.19.8" + "@discordjs/builders" "^1.6.5" + "@discordjs/collection" "^1.5.3" + "@discordjs/formatters" "^0.3.2" + "@discordjs/rest" "^2.0.1" + "@discordjs/util" "^1.0.1" + "@discordjs/ws" "^1.0.1" + "@sapphire/snowflake" "^3.5.1" + "@types/ws" "^8.5.5" + discord-api-types "0.37.50" + fast-deep-equal "^3.1.3" + lodash.snakecase "^4.1.1" + tslib "^2.6.1" + undici "5.22.1" + ws "^8.13.0" -dot-prop@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92" - integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ== +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: - type-fest "^4.18.2" + is-obj "^2.0.0" + +dot-prop@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-7.2.0.tgz#468172a3529779814d21a779c1ba2f6d76609809" + integrity sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA== + dependencies: + type-fest "^2.11.2" dotenv@^16.0.0, dotenv@^16.0.3: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== eastasianwidth@^0.2.0: version "0.2.0" @@ -2414,17 +2051,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.41: - version "1.5.47" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz#ef0751bc19b28be8ee44cd8405309de3bf3b20c7" - integrity sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ== +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" @@ -2436,11 +2066,6 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -emoji-regex@^10.3.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2451,20 +2076,34 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - 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== -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== error-ex@^1.3.1: version "1.3.2" @@ -2473,49 +2112,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^4.0.0: version "4.0.0" @@ -2542,123 +2142,16 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" - integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" - integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== - -eslint@^9.13.0: - version "9.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.13.0.tgz#7659014b7dda1ff876ecbd990f726e11c61596e6" - integrity sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.11.0" - "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.7.0" - "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.13.0" - "@eslint/plugin-kit" "^0.2.0" - "@humanfs/node" "^0.16.5" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.1" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.1.0" - eslint-visitor-keys "^4.1.0" - espree "^10.2.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - text-table "^0.2.0" - -espree@^10.0.1, espree@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" - integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== - dependencies: - acorn "^8.12.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.1.0" - esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - 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== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2674,30 +2167,25 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== dependencies: cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" + get-stream "^6.0.1" + human-signals "^4.3.0" is-stream "^3.0.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" onetime "^6.0.0" - signal-exit "^4.1.0" + signal-exit "^3.0.7" strip-final-newline "^3.0.0" -exif-parser@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" - integrity sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw== - -exit-hook@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-4.0.0.tgz#c1e16ebd03d3166f837b1502dac755bb5c460d58" - integrity sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ== +exit-hook@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-3.2.0.tgz#7d86bc361a4d79278001b72a0509318a6f468f20" + integrity sha512-aIQN7Q04HGAV/I5BszisuHTZHXNoC23WtLkxdCLuYZMdWviRD0TMIt2bnUBi9MrHaF/hH8b3gwG9iaAUHKnJGA== exit@^0.1.2: version "0.1.2" @@ -2716,36 +2204,36 @@ expect@^29.0.0, expect@^29.7.0: jest-util "^29.7.0" express@^4.18.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + 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.3" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.7.1" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~2.0.0" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" + finalhandler "1.2.0" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.3" + merge-descriptors "1.0.1" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.13.0" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -2761,15 +2249,15 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.3.0, fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== +fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2777,25 +2265,15 @@ fast-glob@^3.3.0, fast-glob@^3.3.2: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-safe-stringify@^2.0.4, fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -2806,16 +2284,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fecha@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" - integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -2838,61 +2306,34 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== +figures@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f" + integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== dependencies: - flat-cache "^4.0.0" + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.2.0" -file-stream-rotator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz#007019e735b262bb6c6f0197e58e5c87cb96cec3" - integrity sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ== - dependencies: - moment "^2.29.1" - -file-type@^16.0.0: - version "16.5.4" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd" - integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw== - dependencies: - readable-web-to-node-stream "^3.0.0" - strtok3 "^6.2.4" - token-types "^4.1.1" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== +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 "~2.0.0" + 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-simple@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" - integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== - 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" @@ -2909,60 +2350,18 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: - flatted "^3.2.9" - keyv "^4.5.4" + locate-path "^7.1.0" + path-exists "^5.0.0" -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.2.tgz#83ad9ced7c03feaad97e293d6f6091011e1659c8" - integrity sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" - integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - mime-types "^2.1.12" - -formidable@^1.2.1: - version "1.2.6" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" - integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== +form-data-encoder@^2.1.2: + version "2.1.4" + 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" @@ -2991,16 +2390,11 @@ fsevents@^2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.2: +function-bind@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -fuse.js@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" - integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== - gauge@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" @@ -3016,6 +2410,20 @@ gauge@^3.0.0: strip-ansi "^6.0.1" wide-align "^1.1.2" +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + 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" @@ -3026,69 +2434,33 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-east-asian-width@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" - integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" + function-bind "^1.1.1" + has "^1.0.3" has-proto "^1.0.1" has-symbols "^1.0.3" - hasown "^2.0.0" - -get-intrinsic@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" + pump "^3.0.0" -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -gifwrap@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.10.1.tgz#9ed46a5d51913b482d4221ce9c727080260b681e" - integrity sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw== - dependencies: - image-q "^4.0.0" - omggif "^1.0.10" - github-url-from-git@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" @@ -3101,37 +2473,6 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" - integrity sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^4.0.1" - minimatch "^10.0.0" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -3144,23 +2485,29 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: - ini "4.1.1" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - globby@^13.1.2: version "13.2.2" resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" @@ -3172,33 +2519,50 @@ globby@^13.1.2: merge2 "^1.4.1" slash "^4.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: - get-intrinsic "^1.1.3" + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.9: +graceful-fs@^4.2.10, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" 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== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -3216,64 +2580,60 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +has@^1.0.3: + 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" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== -hosted-git-info@^7.0.0, hosted-git-info@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" - integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: - lru-cache "^10.0.1" + lru-cache "^6.0.0" + +hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + 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" @@ -3285,6 +2645,31 @@ http-errors@2.0.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" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -3298,10 +2683,17 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -3310,31 +2702,31 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^6.0.4: - version "6.0.5" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" - integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== +ignore-walk@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== dependencies: minimatch "^9.0.0" -ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -image-q@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/image-q/-/image-q-4.0.0.tgz#31e075be7bae3c1f42a85c469b4732c358981776" - integrity sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw== - dependencies: - "@types/node" "16.9.1" - -import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3342,10 +2734,15 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^3.0.2, import-local@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -3360,15 +2757,20 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indent-string@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== -index-to-position@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-0.1.2.tgz#e11bfe995ca4d8eddb1ec43274488f3c201a7f09" - integrity sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" @@ -3383,10 +2785,10 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== ini@^1.3.4, ini@~1.3.0: version "1.3.8" @@ -3440,15 +2842,19 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^9.2.15: - version "9.3.7" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.7.tgz#0b562bf843812208844741c9aec9244c939b83d4" - integrity sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w== +inquirer@^9.2.6: + version "9.2.10" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.10.tgz#495a846fd6722ffadba896bd9d93e1e5a7add5c7" + integrity sha512-tVVNFIXU8qNHoULiazz612GFl+yqNfjMTbLuViNJE/d860Qxrd3NMrse8dm40VUQLOQeULvaQF8lpAhvysjeyA== dependencies: - "@inquirer/figures" "^1.0.3" + "@ljharb/through" "^2.3.9" ansi-escapes "^4.3.2" + chalk "^5.3.0" + cli-cursor "^3.1.0" cli-width "^4.1.0" external-editor "^3.1.0" + figures "^5.0.0" + lodash "^4.17.21" mute-stream "1.0.0" ora "^5.4.1" run-async "^3.0.0" @@ -3456,7 +2862,11 @@ inquirer@^9.2.15: string-width "^4.2.3" strip-ansi "^6.0.1" wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.2" + +ip@^2.0.0: + version "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" @@ -3468,17 +2878,24 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-core-module@^2.13.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - hasown "^2.0.2" + ci-info "^3.2.0" + +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-docker@^3.0.0: version "3.0.0" @@ -3512,18 +2929,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-in-ci@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-1.0.0.tgz#9a86bbda7e42c6129902e0574c54b018fbb6ab88" - integrity sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg== - is-inside-container@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" @@ -3531,13 +2943,13 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" -is-installed-globally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" - integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: - global-directory "^4.0.1" - is-path-inside "^4.0.0" + global-dirs "^3.0.0" + is-path-inside "^3.0.2" is-interactive@^1.0.0: version "1.0.0" @@ -3549,6 +2961,20 @@ is-interactive@^2.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-name-taken@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-name-taken/-/is-name-taken-2.0.0.tgz#c36e6515e07621dc48cd026b6b015a504942fae1" + integrity sha512-W+FUWF5g7ONVJTx3rldZeVizmPzrMMUdscpSQ96vyYerx+4b2NcqaujLJJDWruGzE0FjzGZO9RFIipOGxx/WIw== + dependencies: + all-package-names "^2.0.2" + package-name-conflict "^1.0.3" + validate-npm-package-name "^3.0.0" + is-npm@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" @@ -3559,6 +2985,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-observable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" @@ -3571,18 +3002,16 @@ is-path-cwd@^3.0.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-3.0.0.tgz#889b41e55c8588b1eb2a96a61d05740a674521c7" integrity sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA== +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-path-inside@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-promise@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -3610,12 +3039,17 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-unicode-supported@^1.3.0: +is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== @@ -3625,12 +3059,17 @@ is-url-superb@^6.1.0: resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-6.1.0.tgz#182f0d92b482412afeadfba8e6ea2c76680e3631" integrity sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ== -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: - is-inside-container "^1.0.0" + is-docker "^2.0.0" + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== isarray@~1.0.0: version "1.0.0" @@ -3642,20 +3081,15 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - issue-regex@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-4.3.0.tgz#e73db1b475fa12b93ddc66c36ebd5a5f57d0d838" - integrity sha512-7731a/t2llyrk8Hdwl1x3LkhIFGzxHQGpJA7Ur9cIRViakQF2y25Lwhx8Ziy1B068+kBYUmYPBzw5uo3DdWrdQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-4.1.0.tgz#e2039123748a48e6711eed7a9eb392f2c17c9341" + integrity sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + version "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: version "5.2.1" @@ -3669,13 +3103,13 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + 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.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" + "@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" @@ -3698,39 +3132,13 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jackspeak@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.2.tgz#11f9468a3730c6ff6f56823a820d7e3be9bef015" - integrity sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw== - dependencies: - "@isaacs/cliui" "^8.0.2" - -jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - 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" @@ -3909,11 +3317,11 @@ jest-message-util@^29.7.0: stack-utils "^2.0.3" jest-mock-extended@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/jest-mock-extended/-/jest-mock-extended-3.0.7.tgz#3d902dabad99d7831bbe5fccee85ab0371c22675" - integrity sha512-7lsKdLFcW9B9l5NzZ66S/yTQ9k8rFtnwYdCNuRU/81fqDWicNDVhitTSPnrGmNeNm0xyw0JHexEOShrIKRCIRQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/jest-mock-extended/-/jest-mock-extended-3.0.5.tgz#ebf208e363f4f1db603b81fb005c4055b7c1c8b7" + integrity sha512-/eHdaNPUAXe7f65gHH5urc8SbRVWjYxBqmCgax2uqOBJy8UUcCBMN1upj1eZ8y/i+IqpyEm4Kq0VKss/GCCTdw== dependencies: - ts-essentials "^10.0.0" + ts-essentials "^7.0.3" jest-mock@^29.7.0: version "29.7.0" @@ -4038,7 +3446,19 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.0.0, jest-util@^29.7.0: +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== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +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== @@ -4096,44 +3516,6 @@ jest@^29.0.0: import-local "^3.0.2" jest-cli "^29.7.0" -jimp@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-1.6.0.tgz#7c7e5133c8dc06706e1ed35e771c685af393bfd2" - integrity sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg== - dependencies: - "@jimp/core" "1.6.0" - "@jimp/diff" "1.6.0" - "@jimp/js-bmp" "1.6.0" - "@jimp/js-gif" "1.6.0" - "@jimp/js-jpeg" "1.6.0" - "@jimp/js-png" "1.6.0" - "@jimp/js-tiff" "1.6.0" - "@jimp/plugin-blit" "1.6.0" - "@jimp/plugin-blur" "1.6.0" - "@jimp/plugin-circle" "1.6.0" - "@jimp/plugin-color" "1.6.0" - "@jimp/plugin-contain" "1.6.0" - "@jimp/plugin-cover" "1.6.0" - "@jimp/plugin-crop" "1.6.0" - "@jimp/plugin-displace" "1.6.0" - "@jimp/plugin-dither" "1.6.0" - "@jimp/plugin-fisheye" "1.6.0" - "@jimp/plugin-flip" "1.6.0" - "@jimp/plugin-hash" "1.6.0" - "@jimp/plugin-mask" "1.6.0" - "@jimp/plugin-print" "1.6.0" - "@jimp/plugin-quantize" "1.6.0" - "@jimp/plugin-resize" "1.6.0" - "@jimp/plugin-rotate" "1.6.0" - "@jimp/plugin-threshold" "1.6.0" - "@jimp/types" "1.6.0" - "@jimp/utils" "1.6.0" - -jpeg-js@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" - integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4154,10 +3536,10 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.1: version "3.0.1" @@ -4169,68 +3551,35 @@ 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== -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - 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== -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== dependencies: json-buffer "3.0.1" -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -ky@^1.2.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/ky/-/ky-1.7.2.tgz#b97d9b997ba51ff1e152f0815d3d27b86513eb1c" - integrity sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg== - -latest-version@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-9.0.0.tgz#e91ed216e7a4badc6f73b66c65adb46c58ec6ba1" - integrity sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA== +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== dependencies: - package-json "^10.0.0" + package-json "^8.1.0" leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -4304,17 +3653,24 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.memoize@^4.1.2: +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.snakecase@4.1.1: +lodash.snakecase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== @@ -4344,13 +3700,13 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-symbols@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" - integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== dependencies: - chalk "^5.3.0" - is-unicode-supported "^1.3.0" + chalk "^5.0.0" + is-unicode-supported "^1.1.0" log-update@^2.3.0: version "2.3.0" @@ -4361,38 +3717,15 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -logform@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" - integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== - dependencies: - colors "^1.2.1" - fast-safe-stringify "^2.0.4" - fecha "^2.3.3" - ms "^2.1.1" - triple-beam "^1.3.0" +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -logform@^2.6.0, logform@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" - integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -lru-cache@^10.0.1, lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.1.tgz#3a732fbfedb82c5ba7bca6564ad3f42afcb6e147" - integrity sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^5.1.1: version "5.1.1" @@ -4401,15 +3734,22 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -luxon@~3.4.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" - integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" -magic-bytes.js@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz#c41cf4bc2f802992b05e64962411c9dd44fdef92" - integrity sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ== +lru-cache@^7.5.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +magic-bytes.js@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.0.15.tgz#3c9d2b7d45bb8432482646b5f74bbf6725274616" + integrity sha512-bpRmwbRHqongRhA+mXzbLWjVy7ylqmfMBYaQkSs6pac0z6hBTvsgrH0r4FBYd/UYVJBmS6Rp/O+oCCQVLzKV1g== make-dir@^3.1.0: version "3.1.0" @@ -4425,11 +3765,33 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@^1.3.6: +make-error@1.x: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -4437,25 +3799,20 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - 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@^13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" - integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== +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.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +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" @@ -4467,17 +3824,17 @@ 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, methods@~1.1.2: +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.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.3" + braces "^3.0.2" picomatch "^2.3.1" mime-db@1.52.0: @@ -4485,7 +3842,7 @@ mime-db@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.12, mime-types@~2.1.24, mime-types@~2.1.34: +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== @@ -4497,16 +3854,6 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -4522,31 +3869,29 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@9.0.5, minimatch@^9.0.0, minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== +mimic-response@^4.0.0: + version "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.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" -minimatch@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" - integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -4565,7 +3910,46 @@ minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^3.0.0: +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -4577,12 +3961,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minizlib@^2.1.1: +minizlib@^2.0.0, minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -4590,7 +3969,7 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^1.0.3: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -4600,17 +3979,17 @@ mkdirp@^2.1.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== -moment@^2.29.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - 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.3, ms@^2.1.1, ms@^2.1.3: +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.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== @@ -4649,17 +4028,12 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.17.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3: +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== @@ -4671,6 +4045,11 @@ new-github-release-url@^2.0.0: dependencies: type-fest "^2.5.1" +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -4678,15 +4057,31 @@ node-fetch@^2.6.7: 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" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== nopt@^5.0.0: version "5.0.0" @@ -4695,76 +4090,88 @@ nopt@^5.0.0: dependencies: abbrev "1" -normalize-package-data@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" - integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== +normalize-package-data@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: - hosted-git-info "^7.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -np@^10.0.7: - version "10.0.7" - resolved "https://registry.yarnpkg.com/np/-/np-10.0.7.tgz#6f0dc3c7440c8ac95d55a2fa5d488c3d0848b7a5" - integrity sha512-vIPKQwOYKpQU40PU5x/vLfN2haj8ObxMvR1QGt7EZnBPWdm4WEbHdumYAnMV7AeR9kACsMqcqAP37sAo5cW5jA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +np@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/np/-/np-8.0.4.tgz#67d68e95cf443ddff5b3aed3ceb0c2a03375be38" + integrity sha512-a4s1yESHcIwsrk/oaTekfbhb1R/2z2yyfVLX6Atl54w/9+QR01qeYyK3vMWgJ0UY+kYsGzQXausgvUX0pkmIMg== dependencies: - chalk "^5.3.0" - chalk-template "^1.1.0" - cosmiconfig "^8.3.6" - del "^7.1.0" + chalk "^5.2.0" + cosmiconfig "^8.1.3" + del "^7.0.0" escape-goat "^4.0.0" escape-string-regexp "^5.0.0" - execa "^8.0.1" - exit-hook "^4.0.0" + execa "^7.1.1" + exit-hook "^3.2.0" github-url-from-git "^1.5.0" - hosted-git-info "^7.0.1" - ignore-walk "^6.0.4" + has-yarn "^3.0.0" + hosted-git-info "^6.1.1" + ignore-walk "^6.0.3" import-local "^3.1.0" - inquirer "^9.2.15" - is-installed-globally "^1.0.0" + inquirer "^9.2.6" + is-installed-globally "^0.4.0" is-interactive "^2.0.0" is-scoped "^3.0.0" issue-regex "^4.1.0" listr "^0.14.3" listr-input "^0.2.1" - log-symbols "^6.0.0" - meow "^13.2.0" + log-symbols "^5.1.0" + meow "^12.0.1" new-github-release-url "^2.0.0" - npm-name "^8.0.0" - onetime "^7.0.0" - open "^10.0.4" + npm-name "^7.1.0" + onetime "^6.0.0" + open "^9.1.0" + ow "^1.1.1" p-memoize "^7.1.1" - p-timeout "^6.1.2" + p-timeout "^6.1.1" path-exists "^5.0.0" - pkg-dir "^8.0.0" - read-package-up "^11.0.0" - read-pkg "^9.0.1" + pkg-dir "^7.0.0" + read-pkg-up "^9.1.0" rxjs "^7.8.1" - semver "^7.6.0" + semver "^7.5.1" symbol-observable "^4.0.0" terminal-link "^3.0.0" - update-notifier "^7.0.0" + update-notifier "^6.0.2" -npm-name@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/npm-name/-/npm-name-8.0.0.tgz#05aeda9748706ffad66d9ecec8188b99d6e3908b" - integrity sha512-DIuCGcKYYhASAZW6Xh/tiaGMko8IHOHe0n3zOA7SzTi0Yvy00x8L7sa5yNiZ75Ny58O/KeRtNouy8Ut6gPbKiw== +npm-name@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/npm-name/-/npm-name-7.1.0.tgz#03fba1e9fe9d239de8c8c40abd6a37a90e9571f9" + integrity sha512-0Sxf+7tQUOkQ9HuYVSdvq7gZNAOPp1ZJjHiKzpJhsQw9m1YjNfARC0SxWuuUWefChsbvu+DWrwWFfGQWLHmLjg== dependencies: + got "^11.8.5" + is-name-taken "^2.0.0" is-scoped "^3.0.0" is-url-superb "^6.1.0" - ky "^1.2.0" lodash.zip "^4.2.0" org-regex "^1.0.0" - p-map "^7.0.1" - registry-auth-token "^5.0.2" + p-map "^5.5.0" + registry-auth-token "^4.2.2" registry-url "^6.0.1" - validate-npm-package-name "^5.0.0" + validate-npm-package-name "^3.0.0" npm-run-path@^4.0.1: version "4.0.1" @@ -4774,9 +4181,9 @@ npm-run-path@^4.0.1: path-key "^3.0.0" npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== dependencies: path-key "^4.0.0" @@ -4790,6 +4197,16 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -4800,20 +4217,10 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -omggif@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" - integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== +object-inspect@^1.9.0: + version "1.12.3" + 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" @@ -4822,20 +4229,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.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" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -4857,34 +4257,15 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== dependencies: - mimic-function "^5.0.0" - -open@^10.0.4: - version "10.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" - integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== - dependencies: - default-browser "^5.2.1" + default-browser "^4.0.0" define-lazy-prop "^3.0.0" is-inside-container "^1.0.0" - is-wsl "^3.1.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" + is-wsl "^2.2.0" ora@^5.4.1: version "5.4.1" @@ -4911,6 +4292,27 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +ow@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ow/-/ow-1.1.1.tgz#354a0f7df9d8d0cf961b29116daf972ef6be1632" + integrity sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA== + dependencies: + "@sindresorhus/is" "^5.3.0" + callsites "^4.0.0" + dot-prop "^7.2.0" + lodash.isequal "^4.5.0" + vali-date "^1.0.0" + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4925,6 +4327,13 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -4939,11 +4348,30 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-lock@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-lock/-/p-lock-2.1.0.tgz#6f9dbc55d3aac5b0f75c8ec47f3a6f1b954135f8" + integrity sha512-pi2yT8gNhVrV4LgsUvJWQy58TXH1HG2+NXDby9+UrsS/9fXb0FJH9aCxbdHJ0EAQ6XC7ggSP6GAzuR5puDArUQ== + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-map@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" @@ -4951,11 +4379,6 @@ p-map@^5.5.0: dependencies: aggregate-error "^4.0.0" -p-map@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.2.tgz#7c5119fada4755660f70199a66aa3fe2f85a1fe8" - integrity sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q== - p-memoize@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/p-memoize/-/p-memoize-7.1.1.tgz#53b1d0e6007288f7261cfa11a7603b84c9261bfa" @@ -4964,35 +4387,30 @@ p-memoize@^7.1.1: mimic-fn "^4.0.0" type-fest "^3.0.0" -p-timeout@^6.1.2: - version "6.1.3" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.3.tgz#9635160c4e10c7b4c3db45b7d5d26f911d9fd853" - integrity sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw== +p-timeout@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" + integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -package-json@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-10.0.1.tgz#e49ee07b8de63b638e7f1b5bb353733e428fe7d7" - integrity sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg== +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== dependencies: - ky "^1.2.0" - registry-auth-token "^5.0.2" - registry-url "^6.0.1" - semver "^7.6.0" + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" -pako@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +package-name-conflict@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/package-name-conflict/-/package-name-conflict-1.0.3.tgz#5147d35e8ae7f93401f1b3f9f3763c070463f25c" + integrity sha512-DPBNWSUWC0wPofXeNThao0uP4a93J7r90UyhagmJS0QcacTTkorZwXYsOop70phn1hKdcf/2e9lJIhazS8bx5A== parent-module@^1.0.0: version "1.0.1" @@ -5001,25 +4419,21 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-bmfont-ascii@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" - integrity sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA== - -parse-bmfont-binary@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" - integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== - -parse-bmfont-xml@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz#016b655da7aebe6da38c906aca16bf0415773767" - integrity sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA== +parse-json-object@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-json-object/-/parse-json-object-1.1.0.tgz#eef60211cec368259723d8586ecec7252f8fcdb2" + integrity sha512-4w5s6uJY1tW9REY8UwUOyaZKSKsrbQrMEzlV/Le/g5t4iMWuuyK83pZZ0OZimSOL9iyv2ORvRSgz71Ekd7iD3g== dependencies: - xml-parse-from-string "^1.0.0" - xml2js "^0.5.0" + types-json "^1.0.6" -parse-json@^5.2.0: +parse-json-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-json-object/-/parse-json-object-2.0.1.tgz#a441bd8c36d2c33a69516286e7e4138a23607ee0" + integrity sha512-/oF7PUUBjCqHmMEE6xIQeX5ZokQ9+miudACzPt4KBU2qi6CxZYPdisPXx4ad7wpZJYi2ZpcW2PacLTU3De3ebw== + dependencies: + types-json "^1.2.0" + +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -5029,15 +4443,6 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-json@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.1.0.tgz#91cdc7728004e955af9cb734de5684733b24a717" - integrity sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA== - dependencies: - "@babel/code-frame" "^7.22.13" - index-to-position "^0.1.2" - type-fest "^4.7.1" - parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" @@ -5090,46 +4495,20 @@ 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-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-scurry@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" - integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +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" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -peek-readable@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" - integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== - picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picocolors@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -5141,13 +4520,6 @@ pirates@^4.0.4: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -pixelmatch@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.3.0.tgz#5e5321a7abedfb7962d60dbf345deda87cb9560a" - integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q== - dependencies: - pngjs "^6.0.0" - pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -5155,27 +4527,12 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-8.0.0.tgz#8f3de8ba83d46b72a05c80bfd4e579f060fa91e2" - integrity sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ== - dependencies: - find-up-simple "^1.0.0" - -pngjs@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" - integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== - -pngjs@^7.0.0: +pkg-dir@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-7.0.0.tgz#a8b7446020ebbc6ac739db6c5415a65d17090e26" - integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -5191,10 +4548,23 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" prompts@^2.0.1: version "2.4.2" @@ -5217,15 +4587,13 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" pupa@^3.1.0: version "3.1.0" @@ -5235,27 +4603,42 @@ pupa@^3.1.0: escape-goat "^4.0.0" pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + 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.13.0, qs@^6.9.1: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +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.6" + 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" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "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" @@ -5277,29 +4660,41 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -read-package-up@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/read-package-up/-/read-package-up-11.0.0.tgz#71fb879fdaac0e16891e6e666df22de24a48d5ba" - integrity sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ== - dependencies: - find-up-simple "^1.0.0" - read-pkg "^9.0.0" - type-fest "^4.6.0" +read-file-safe@^1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/read-file-safe/-/read-file-safe-1.0.10.tgz#9ac9118f12cb122614612211f90dad9daf732e39" + integrity sha512-qW25fd2uMX3dV6Ui/R0jYK1MhTpjx8FO/VHaHTXzwWsGnkNwLRcqYfCXd9qDM+NZ273DPUvP2RaimYuLSu1K/g== -read-pkg@^9.0.0, read-pkg@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-9.0.1.tgz#b1b81fb15104f5dbb121b6bbdee9bbc9739f569b" - integrity sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA== +read-json-safe@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/read-json-safe/-/read-json-safe-1.0.5.tgz#c459443b8e6eb3a2672cf68ddc81d2f4ef95c8d7" + integrity sha512-SJyNY/U9+vW35FPus22Qvv1oilnR7PCfN2E70uKQEGaJS313A5/cz9Yhv7ZtWzZ+XIwrtEPxXf10BOyYemHehA== dependencies: - "@types/normalize-package-data" "^2.4.3" - normalize-package-data "^6.0.0" - parse-json "^8.0.0" - type-fest "^4.6.0" - unicorn-magic "^0.1.0" + parse-json-object "^1.0.5" + read-file-safe "^1.0.5" + +read-pkg-up@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-9.1.0.tgz#38ca48e0bc6c6b260464b14aad9bcd4e5b1fbdc3" + integrity sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg== + dependencies: + find-up "^6.3.0" + read-pkg "^7.1.0" + type-fest "^2.5.0" + +read-pkg@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-7.1.0.tgz#438b4caed1ad656ba359b3e00fd094f3c427a43e" + integrity sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg== + dependencies: + "@types/normalize-package-data" "^2.4.1" + normalize-package-data "^3.0.2" + parse-json "^5.2.0" + type-fest "^2.0.0" readable-stream@2.3.7: version "2.3.7" @@ -5314,19 +4709,6 @@ readable-stream@2.3.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -5336,37 +4718,31 @@ readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" - integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +registry-auth-token@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" + rc "1.2.8" -readable-web-to-node-stream@^3.0.0: - 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.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" - integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== - -registry-auth-token@^5.0.2: +registry-auth-token@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== dependencies: "@pnpm/npm-conf" "^2.1.0" -registry-url@^6.0.1: +registry-url@^6.0.0, registry-url@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== @@ -5378,6 +4754,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -5409,6 +4790,20 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -5425,6 +4820,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5437,10 +4837,12 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -run-applescript@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" - integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" @@ -5483,40 +4885,39 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-stable-stringify@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" - integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== - -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@>=0.6.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== - scoped-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-3.0.0.tgz#cd7ede7d942f2ae90da53272102ff2d73129c46f" integrity sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg== +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.1, 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== + dependencies: + lru-cache "^6.0.0" -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +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" @@ -5532,33 +4933,21 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== +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 "~2.0.0" + encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.19.0" + 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== -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -5572,13 +4961,6 @@ sha.js@^2.4.11: inherits "^2.0.1" safe-buffer "^5.0.1" -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -5591,52 +4973,20 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" - integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -simple-xml-to-json@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/simple-xml-to-json/-/simple-xml-to-json-1.2.3.tgz#79c7188ff99ae209a267b70ee0db06b0e4597787" - integrity sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA== - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -5657,6 +5007,28 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -5679,9 +5051,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -5692,24 +5064,37 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.20" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" - integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sqlite3@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.6.tgz#1d4fbc90fe4fbd51e952e0a90fd8f6c2b9098e97" + integrity sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^4.2.0" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + sqlstring@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" stack-utils@^2.0.3: version "2.0.6" @@ -5731,15 +5116,6 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5775,16 +5151,7 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string-width@^7.0.0, string-width@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" - integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string_decoder@^1.1.1, string_decoder@^1.3.0: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -5798,13 +5165,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -5833,7 +5193,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1, strip-ansi@^7.1.0: +strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -5865,36 +5225,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@^6.2.4: - version "6.3.0" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" - integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw== - dependencies: - "@tokenizer/token" "^0.3.0" - peek-readable "^4.1.0" - -stubborn-fs@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2" - integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g== - -superagent@5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-5.2.2.tgz#6ff726c5642795b2c27009e92687c8e69a6bb07d" - integrity sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.2" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - form-data "^3.0.0" - formidable "^1.2.1" - methods "^1.1.2" - mime "^2.4.4" - qs "^6.9.1" - readable-stream "^3.4.0" - semver "^6.3.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -5944,10 +5274,10 @@ symbol-observable@^4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== -tar@^6.1.11: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -5973,16 +5303,6 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -6002,10 +5322,10 @@ through@^2.3.6, through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tinycolor2@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" - integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== tmp@^0.0.33: version "0.0.33" @@ -6019,6 +5339,11 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -6031,70 +5356,44 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -token-types@^4.1.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.1.tgz#0f897f03665846982806e138977dbe72d44df753" - integrity sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ== - 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" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -triple-beam@^1.2.0, triple-beam@^1.3.0, triple-beam@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-essentials@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-10.0.2.tgz#8c7aa74ed79580ffe49df5ca28d06cc6bea0ff3c" - integrity sha512-Xwag0TULqriaugXqVdDiGZ5wuZpqABZlpwQ2Ho4GDyiu/R2Xjkp/9+zcFxL7uzeLl/QCPrflnvpVYyS3ouT7Zw== +ts-essentials@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-jest@^29.0.0: - version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" - integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: - bs-logger "^0.2.6" - ejs "^3.1.10" - fast-json-stable-stringify "^2.1.0" + bs-logger "0.x" + fast-json-stable-stringify "2.x" jest-util "^29.0.0" json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.6.3" - yargs-parser "^21.1.1" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" -ts-mixer@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" - integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== +ts-mixer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" + integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.6.3: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" - integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" +tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-detect@4.0.8: version "4.0.8" @@ -6106,12 +5405,12 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^1.0.2: +type-fest@^1.0.1, type-fest@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.5.1: +type-fest@^2.0.0, type-fest@^2.11.2, type-fest@^2.13.0, type-fest@^2.5.0, type-fest@^2.5.1: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== @@ -6121,16 +5420,6 @@ type-fest@^3.0.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== -type-fest@^4.18.2: - version "4.40.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.40.0.tgz#62bc09caccb99a75e1ad6b9b4653e8805e5e1eee" - integrity sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw== - -type-fest@^4.21.0, type-fest@^4.6.0, type-fest@^4.7.1: - version "4.26.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" - integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -6139,99 +5428,135 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typeorm@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" - integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== +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" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typeorm@0.3.17: + version "0.3.17" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949" + integrity sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig== dependencies: "@sqltools/formatter" "^1.2.5" app-root-path "^3.1.0" buffer "^6.0.3" chalk "^4.1.2" cli-highlight "^2.1.11" - dayjs "^1.11.9" + date-fns "^2.29.3" debug "^4.3.4" dotenv "^16.0.3" - glob "^10.3.10" + glob "^8.1.0" mkdirp "^2.1.3" - reflect-metadata "^0.2.1" + reflect-metadata "^0.1.13" sha.js "^2.4.11" tslib "^2.5.0" uuid "^9.0.0" yargs "^17.6.2" -typescript-eslint@^8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.11.0.tgz#74a0551972d675b4141672cec3acc5139b7399c0" - integrity sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA== +types-eslintrc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/types-eslintrc/-/types-eslintrc-1.0.3.tgz#b277d301caca6c330477cbaa67bf6f79ac3d6fee" + integrity sha512-zKTR6aKHEudQpl+JoZjS3qh0B5IzSpQK/BCpYBECujcnKtqL87DJJ1sJKe5B8k/y8/UJ5sukq42QDvlaJyCO2w== dependencies: - "@typescript-eslint/eslint-plugin" "8.11.0" - "@typescript-eslint/parser" "8.11.0" - "@typescript-eslint/utils" "8.11.0" + types-json "^1.2.2" + +types-json@^1.0.6, types-json@^1.2.0, types-json@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/types-json/-/types-json-1.2.2.tgz#91ebe6de59e741ab38a98b071708a29494cedfe6" + integrity sha512-VfVLISHypS7ayIHvhacOESOTib4Sm4mAhnsgR8fzQdGp89YoBwMqvGmqENjtYehUQzgclT+7NafpEXkK/MHKwA== + +types-pkg-json@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/types-pkg-json/-/types-pkg-json-1.2.1.tgz#890fe4f231000a721299831ef3e17a489b1e635e" + integrity sha512-Wj75lCkPwfj1BhmaJxMPpTQj9YGpihjs3WICigt1IjTAswr7zPXP0iJYPZjU0Rw/IriODhMJjAImkCIxt9KeuQ== + dependencies: + types-eslintrc "^1.0.3" + types-json "^1.2.2" typescript@^5.0.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== -undici-types@~6.19.8: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +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@6.19.8: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1" - integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== +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== -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== +undici@5.22.1, undici@^5.26.2: + version "5.27.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== + dependencies: + "@fastify/busboy" "^2.0.0" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + 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== -update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.0" +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== -update-notifier@^7.0.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-7.3.1.tgz#49af1ad6acfa0ea01c0d0f3c04047c154ead7096" - integrity sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA== +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: - boxen "^8.0.1" - chalk "^5.3.0" - configstore "^7.0.0" - is-in-ci "^1.0.0" - is-installed-globally "^1.0.0" + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" + is-installed-globally "^0.4.0" is-npm "^6.0.0" - latest-version "^9.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" pupa "^3.1.0" - semver "^7.6.3" + semver "^7.3.7" + semver-diff "^4.0.0" xdg-basedir "^5.1.0" -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -utif2@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/utif2/-/utif2-4.1.0.tgz#e768d37bd619b995d56d9780b5d2b4611a3d932b" - integrity sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w== - dependencies: - pako "^1.0.11" - 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" @@ -6243,20 +5568,25 @@ utils-merge@1.0.1: integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + 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 "^2.0.0" -validate-npm-package-license@^3.0.4: +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg== + +validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -6264,10 +5594,12 @@ validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" - integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" vary@~1.1.2: version "1.1.2" @@ -6301,98 +5633,26 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -when-exit@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.3.tgz#5831cdbed8ad4984645da98c4a00d4ee3a3757e7" - integrity sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw== - -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.2: +wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" -widest-line@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" - integrity sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== dependencies: - string-width "^7.0.0" - -winston-daily-rotate-file@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-5.0.0.tgz#8cd94800025490e47c00ec892b655a5821f4266d" - integrity sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw== - dependencies: - file-stream-rotator "^0.6.1" - object-hash "^3.0.0" - triple-beam "^1.4.1" - winston-transport "^4.7.0" - -winston-discord-transport@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/winston-discord-transport/-/winston-discord-transport-1.3.0.tgz#5fcef49a1a4838183921a44d6df029af55a5c8d0" - integrity sha512-oyns2ea9cQie+qBTTgfZq17pTRie41tEIE38s4ZR5ifSp4E0n8hAD7XBoLXxV0xJwLjm8IPBKzETtG8L9AvVfg== - dependencies: - logform "2.1.2" - superagent "5.2.2" - winston-transport "4.3.0" - -winston-transport@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" - integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== - dependencies: - readable-stream "^2.3.6" - triple-beam "^1.2.0" - -winston-transport@^4.7.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.8.0.tgz#a15080deaeb80338455ac52c863418c74fcf38ea" - integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA== - dependencies: - logform "^2.6.1" - readable-stream "^4.5.2" - triple-beam "^1.3.0" - -winston@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.15.0.tgz#4df7b70be091bc1a38a4f45b969fa79589b73ff5" - integrity sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow== - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.6.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.7.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + string-width "^5.0.1" wrap-ansi@^3.0.1: version "3.0.1" @@ -6429,20 +5689,21 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" @@ -6451,34 +5712,16 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^8.16.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -xdg-basedir@^5.1.0: +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== -xml-parse-from-string@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" - integrity sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g== - -xml2js@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" - integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -6499,7 +5742,7 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.1.1: +yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -6535,12 +5778,7 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yoctocolors-cjs@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" - integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== - -zod@^3.23.8: - version "3.24.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.3.tgz#1f40f750a05e477396da64438e0e1c0995dafd87" - integrity sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==