From 89e3e92fa6ec9dc41fe8e8886db4767ac57fddba Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Fri, 27 Jun 2025 17:04:32 -0700 Subject: [PATCH] feat: rewrite to be more generic --- package.json | 14 +- pnpm-lock.yaml | 663 ++++++++++++++++++++++++----------------- src/config/channels.ts | 119 +++++++- src/index.ts | 30 +- src/modules/standup.ts | 85 +++++- src/utils/logger.ts | 2 +- 6 files changed, 593 insertions(+), 320 deletions(-) diff --git a/package.json b/package.json index 424087c..bebb392 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,18 @@ "author": "Naomi Carrigan", "license": "See license in LICENSE.md", "devDependencies": { - "@nhcarrigan/eslint-config": "5.1.0", + "@nhcarrigan/eslint-config": "5.2.0", "@nhcarrigan/typescript-config": "4.0.0", - "@types/node": "22.13.1", + "@types/node": "24.0.6", "@types/node-schedule": "2.1.7", - "@vitest/coverage-istanbul": "3.0.5", - "eslint": "9.20.0", - "typescript": "5.7.3", - "vitest": "3.0.5" + "@vitest/coverage-istanbul": "3.2.4", + "eslint": "9.30.0", + "typescript": "5.8.3", + "vitest": "3.2.4" }, "dependencies": { "@nhcarrigan/logger": "1.0.0", - "discord.js": "14.18.0", + "discord.js": "14.21.0", "node-schedule": "2.1.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8108c37..3f6f406 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,36 +12,36 @@ importers: specifier: 1.0.0 version: 1.0.0 discord.js: - specifier: 14.18.0 - version: 14.18.0 + specifier: 14.21.0 + version: 14.21.0 node-schedule: specifier: 2.1.1 version: 2.1.1 devDependencies: '@nhcarrigan/eslint-config': - specifier: 5.1.0 - version: 5.1.0(@typescript-eslint/utils@8.25.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.7.3)(vitest@3.0.5(@types/node@22.13.1)) + specifier: 5.2.0 + version: 5.2.0(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6)) '@nhcarrigan/typescript-config': specifier: 4.0.0 - version: 4.0.0(typescript@5.7.3) + version: 4.0.0(typescript@5.8.3) '@types/node': - specifier: 22.13.1 - version: 22.13.1 + specifier: 24.0.6 + version: 24.0.6 '@types/node-schedule': specifier: 2.1.7 version: 2.1.7 '@vitest/coverage-istanbul': - specifier: 3.0.5 - version: 3.0.5(vitest@3.0.5(@types/node@22.13.1)) + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4(@types/node@24.0.6)) eslint: - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.30.0 + version: 9.30.0 typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 vitest: - specifier: 3.0.5 - version: 3.0.5(@types/node@22.13.1) + specifier: 3.2.4 + version: 3.2.4(@types/node@24.0.6) packages: @@ -112,8 +112,8 @@ packages: resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} - '@discordjs/builders@1.10.1': - resolution: {integrity: sha512-OWo1fY4ztL1/M/DUyRPShB4d/EzVfuUvPTRRHRIt/YxBrUYSz0a+JicD5F5zHFoNs2oTuWavxCOVFV1UljHTng==} + '@discordjs/builders@1.11.2': + resolution: {integrity: sha512-F1WTABdd8/R9D1icJzajC4IuLyyS8f3rTOz66JsSI3pKvpCAtsMBweu8cyNYsIyvcrKAVn9EPK+Psoymq+XC0A==} engines: {node: '>=16.11.0'} '@discordjs/collection@1.5.3': @@ -124,20 +124,20 @@ packages: resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} engines: {node: '>=18'} - '@discordjs/formatters@0.6.0': - resolution: {integrity: sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw==} + '@discordjs/formatters@0.6.1': + resolution: {integrity: sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==} engines: {node: '>=16.11.0'} - '@discordjs/rest@2.4.3': - resolution: {integrity: sha512-+SO4RKvWsM+y8uFHgYQrcTl/3+cY02uQOH7/7bKbVZsTfrfpoE62o5p+mmV+s7FVhTX82/kQUGGbu4YlV60RtA==} + '@discordjs/rest@2.5.1': + resolution: {integrity: sha512-Tg9840IneBcbrAjcGaQzHUJWFNq1MMWZjTdjJ0WS/89IffaNKc++iOvffucPxQTF/gviO9+9r8kEPea1X5J2Dw==} engines: {node: '>=18'} '@discordjs/util@1.1.1': resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==} engines: {node: '>=18'} - '@discordjs/ws@1.2.1': - resolution: {integrity: sha512-PBvenhZG56a6tMWF/f4P6f4GxZKJTBG95n7aiGSPTnodmz4N5g60t79rSIAq7ywMbv8A4jFtexMruH+oe51aQQ==} + '@discordjs/ws@1.2.3': + resolution: {integrity: sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==} engines: {node: '>=16.11.0'} '@es-joy/jsdoccomment@0.49.0': @@ -319,40 +319,44 @@ packages: eslint: optional: true - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.17.0': resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + '@eslint/js@9.30.0': + resolution: {integrity: sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -401,8 +405,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@nhcarrigan/eslint-config@5.1.0': - resolution: {integrity: sha512-TS6kwPTcm8pFzp34FRq+8PR+0jgVr7FDUDrfilAKtWDArqZSabTMtTt+N1rJyNHQqBHs7de/pUYNWiLpThy2Bw==} + '@nhcarrigan/eslint-config@5.2.0': + resolution: {integrity: sha512-YpTTqhviKMlRwKF+RC/GYiA5i2jTCmg8uftuiufldneNV5HMbGpTfBbV7tpa8++5mpYJc4+eZaf40QbDiz84dQ==} engines: {node: '>=22', pnpm: '>=9'} peerDependencies: eslint: '>=9' @@ -556,6 +560,12 @@ packages: peerDependencies: eslint: '>=8.40.0' + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -568,8 +578,8 @@ packages: '@types/node-schedule@2.1.7': resolution: {integrity: sha512-G7Z3R9H7r3TowoH6D2pkzUHPhcJrDF4Jz1JOQ80AX0K2DWTHoN9VC94XzFAPNMdbW9TBzMZ3LjpFi7RYdbxtXA==} - '@types/node@22.13.1': - resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + '@types/node@24.0.6': + resolution: {integrity: sha512-ZOyn+gOs749xU7ovp+Ibj0g1o3dFRqsfPnT22C2t5JzcRvgsEDpGawPbCISGKLudJk9Y0wiu9sYd6kUh0pc9TA==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -676,10 +686,10 @@ packages: resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-istanbul@3.0.5': - resolution: {integrity: sha512-yTcIwrpLHOyPP28PXXLRv1NzzKCrqDnmT7oVypTa1Q24P6OwGT4Wi6dXNEaJg33vmrPpoe81f31kwB5MtfM+ow==} + '@vitest/coverage-istanbul@3.2.4': + resolution: {integrity: sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==} peerDependencies: - vitest: 3.0.5 + vitest: 3.2.4 '@vitest/eslint-plugin@1.1.24': resolution: {integrity: sha512-7IaENe4NNy33g0iuuy5bHY69JYYRjpv4lMx6H5Wp30W7ez2baLHwxsXF5TM4wa8JDYZt8ut99Ytoj7GiDO01hw==} @@ -694,37 +704,34 @@ packages: vitest: optional: true - '@vitest/expect@3.0.5': - resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.0.5': - resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.0.5': - resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@3.0.7': - resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/runner@3.0.5': - resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/snapshot@3.0.5': - resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@3.0.5': - resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} - - '@vitest/utils@3.0.5': - resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@vladfrangu/async_event_emitter@2.4.6': resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} @@ -745,6 +752,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -941,6 +953,15 @@ packages: supports-color: optional: true + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -960,11 +981,11 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - discord-api-types@0.37.119: - resolution: {integrity: sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==} + discord-api-types@0.38.13: + resolution: {integrity: sha512-FELWJRgLVQuR7Az8RhdEZE0k6QNjSW9PCUcU1iyP2Gke8HrJmnMceSS9pD93UM64s3tvZzJPajpPLjWZJylf4g==} - discord.js@14.18.0: - resolution: {integrity: sha512-SvU5kVUvwunQhN2/+0t55QW/1EHfB1lp0TtLZUSXVHDmyHTrdOj5LRKdR0zLcybaA15F+NtdWuWmGOX9lE+CAw==} + discord.js@14.21.0: + resolution: {integrity: sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ==} engines: {node: '>=18'} doctrine@2.1.0: @@ -1009,6 +1030,9 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -1110,8 +1134,8 @@ packages: peerDependencies: eslint: '>=8.56.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@1.3.0: @@ -1126,8 +1150,12 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.0: - resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.30.0: + resolution: {integrity: sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1140,6 +1168,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@6.2.1: resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} engines: {node: '>=6.0.0'} @@ -1163,8 +1195,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: @@ -1183,6 +1215,14 @@ packages: fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1489,6 +1529,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1568,6 +1611,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1950,8 +1996,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -2000,6 +2046,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2022,16 +2071,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -2091,8 +2144,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -2100,11 +2153,11 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - undici@6.21.1: - resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} update-browserslist-db@1.1.2: @@ -2119,8 +2172,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-node@3.0.5: - resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -2164,16 +2217,16 @@ packages: yaml: optional: true - vitest@3.0.5: - resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.5 - '@vitest/ui': 3.0.5 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2277,7 +2330,7 @@ snapshots: '@babel/traverse': 7.26.9 '@babel/types': 7.26.9 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2344,7 +2397,7 @@ snapshots: '@babel/parser': 7.26.9 '@babel/template': 7.26.9 '@babel/types': 7.26.9 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2354,12 +2407,12 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@discordjs/builders@1.10.1': + '@discordjs/builders@1.11.2': dependencies: - '@discordjs/formatters': 0.6.0 + '@discordjs/formatters': 0.6.1 '@discordjs/util': 1.1.1 '@sapphire/shapeshift': 4.0.0 - discord-api-types: 0.37.119 + discord-api-types: 0.38.13 fast-deep-equal: 3.1.3 ts-mixer: 6.0.4 tslib: 2.8.1 @@ -2368,33 +2421,33 @@ snapshots: '@discordjs/collection@2.1.1': {} - '@discordjs/formatters@0.6.0': + '@discordjs/formatters@0.6.1': dependencies: - discord-api-types: 0.37.119 + discord-api-types: 0.38.13 - '@discordjs/rest@2.4.3': + '@discordjs/rest@2.5.1': dependencies: '@discordjs/collection': 2.1.1 '@discordjs/util': 1.1.1 '@sapphire/async-queue': 1.5.5 '@sapphire/snowflake': 3.5.3 '@vladfrangu/async_event_emitter': 2.4.6 - discord-api-types: 0.37.119 + discord-api-types: 0.38.13 magic-bytes.js: 1.10.0 tslib: 2.8.1 - undici: 6.21.1 + undici: 6.21.3 '@discordjs/util@1.1.1': {} - '@discordjs/ws@1.2.1': + '@discordjs/ws@1.2.3': dependencies: '@discordjs/collection': 2.1.1 - '@discordjs/rest': 2.4.3 + '@discordjs/rest': 2.5.1 '@discordjs/util': 1.1.1 '@sapphire/async-queue': 1.5.5 '@types/ws': 8.5.14 '@vladfrangu/async_event_emitter': 2.4.6 - discord-api-types: 0.37.119 + discord-api-types: 0.38.13 tslib: 2.8.1 ws: 8.18.1 transitivePeerDependencies: @@ -2482,24 +2535,24 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.20.0)': + '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.30.0)': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.20.0 + eslint: 9.30.0 ignore: 5.3.2 - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.30.0)': dependencies: - eslint: 9.20.0 + eslint: 9.30.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.4(eslint@9.20.0)': + '@eslint/compat@1.2.4(eslint@9.30.0)': optionalDependencies: - eslint: 9.20.0 + eslint: 9.30.0 - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -2507,11 +2560,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.11.0': + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.12.0': + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 @@ -2529,11 +2584,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -2545,13 +2600,13 @@ snapshots: '@eslint/js@9.17.0': {} - '@eslint/js@9.20.0': {} + '@eslint/js@9.30.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -2595,29 +2650,29 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@nhcarrigan/eslint-config@5.1.0(@typescript-eslint/utils@8.25.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.7.3)(vitest@3.0.5(@types/node@22.13.1))': + '@nhcarrigan/eslint-config@5.2.0(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6))': dependencies: - '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.20.0) - '@eslint/compat': 1.2.4(eslint@9.20.0) + '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.30.0) + '@eslint/compat': 1.2.4(eslint@9.30.0) '@eslint/eslintrc': 3.2.0 '@eslint/js': 9.17.0 - '@stylistic/eslint-plugin': 2.12.1(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.19.0(eslint@9.20.0)(typescript@5.7.3) - '@vitest/eslint-plugin': 1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3)(vitest@3.0.5(@types/node@22.13.1)) - eslint: 9.20.0 - eslint-plugin-deprecation: 3.0.0(eslint@9.20.0)(typescript@5.7.3) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0) - eslint-plugin-jsdoc: 50.6.1(eslint@9.20.0) - eslint-plugin-playwright: 2.1.0(eslint@9.20.0) - eslint-plugin-react: 7.37.3(eslint@9.20.0) + '@stylistic/eslint-plugin': 2.12.1(eslint@9.30.0)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) + '@vitest/eslint-plugin': 1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6)) + eslint: 9.30.0 + eslint-plugin-deprecation: 3.0.0(eslint@9.30.0)(typescript@5.8.3) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0) + eslint-plugin-jsdoc: 50.6.1(eslint@9.30.0) + eslint-plugin-playwright: 2.1.0(eslint@9.30.0) + eslint-plugin-react: 7.37.3(eslint@9.30.0) eslint-plugin-sort-keys-fix: 1.1.2 - eslint-plugin-unicorn: 56.0.1(eslint@9.20.0) + eslint-plugin-unicorn: 56.0.1(eslint@9.30.0) globals: 15.14.0 playwright: 1.50.1 react: 19.0.0 - typescript: 5.7.3 - vitest: 3.0.5(@types/node@22.13.1) + typescript: 5.8.3 + vitest: 3.2.4(@types/node@24.0.6) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-typescript @@ -2626,9 +2681,9 @@ snapshots: '@nhcarrigan/logger@1.0.0': {} - '@nhcarrigan/typescript-config@4.0.0(typescript@5.7.3)': + '@nhcarrigan/typescript-config@4.0.0(typescript@5.8.3)': dependencies: - typescript: 5.7.3 + typescript: 5.8.3 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2715,10 +2770,10 @@ snapshots: '@sapphire/snowflake@3.5.3': {} - '@stylistic/eslint-plugin@2.12.1(eslint@9.20.0)(typescript@5.7.3)': + '@stylistic/eslint-plugin@2.12.1(eslint@9.30.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.25.0(eslint@9.20.0)(typescript@5.7.3) - eslint: 9.20.0 + '@typescript-eslint/utils': 8.25.0(eslint@9.30.0)(typescript@5.8.3) + eslint: 9.30.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -2727,6 +2782,12 @@ snapshots: - supports-color - typescript + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} @@ -2735,44 +2796,44 @@ snapshots: '@types/node-schedule@2.1.7': dependencies: - '@types/node': 22.13.1 + '@types/node': 24.0.6 - '@types/node@22.13.1': + '@types/node@24.0.6': dependencies: - undici-types: 6.20.0 + undici-types: 7.8.0 '@types/normalize-package-data@2.4.4': {} '@types/ws@8.5.14': dependencies: - '@types/node': 22.13.1 + '@types/node': 24.0.6 - '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.19.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/type-utils': 8.19.0(eslint@9.20.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.19.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.19.0(eslint@9.30.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.19.0(eslint@9.30.0)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.19.0 - eslint: 9.20.0 + eslint: 9.30.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 1.4.3(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.19.0 debug: 4.4.0 - eslint: 9.20.0 - typescript: 5.7.3 + eslint: 9.30.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2791,14 +2852,14 @@ snapshots: '@typescript-eslint/types': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.19.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.19.0(eslint@9.30.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.19.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.19.0(eslint@9.30.0)(typescript@5.8.3) debug: 4.4.0 - eslint: 9.20.0 - ts-api-utils: 1.4.3(typescript@5.7.3) - typescript: 5.7.3 + eslint: 9.30.0 + ts-api-utils: 1.4.3(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2808,7 +2869,7 @@ snapshots: '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -2817,13 +2878,13 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.7.3) + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.19.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.19.0 '@typescript-eslint/visitor-keys': 8.19.0 @@ -2832,12 +2893,12 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 1.4.3(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0 @@ -2846,41 +2907,41 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/utils@7.18.0(eslint@9.30.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - eslint: 9.20.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + eslint: 9.30.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.19.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.19.0(eslint@9.30.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@typescript-eslint/scope-manager': 8.19.0 '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.3) - eslint: 9.20.0 - typescript: 5.7.3 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.8.3) + eslint: 9.30.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.25.0(eslint@9.20.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@typescript-eslint/scope-manager': 8.25.0 '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) - eslint: 9.20.0 - typescript: 5.7.3 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.3) + eslint: 9.30.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2899,10 +2960,10 @@ snapshots: '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-istanbul@3.0.5(vitest@3.0.5(@types/node@22.13.1))': + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/node@24.0.6))': dependencies: '@istanbuljs/schema': 0.1.3 - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 @@ -2911,60 +2972,58 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.5(@types/node@22.13.1) + vitest: 3.2.4(@types/node@24.0.6) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(typescript@5.7.3)(vitest@3.0.5(@types/node@22.13.1))': + '@vitest/eslint-plugin@1.1.24(@typescript-eslint/utils@8.25.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)(vitest@3.2.4(@types/node@24.0.6))': dependencies: - '@typescript-eslint/utils': 8.25.0(eslint@9.20.0)(typescript@5.7.3) - eslint: 9.20.0 + '@typescript-eslint/utils': 8.25.0(eslint@9.30.0)(typescript@5.8.3) + eslint: 9.30.0 optionalDependencies: - typescript: 5.7.3 - vitest: 3.0.5(@types/node@22.13.1) + typescript: 5.8.3 + vitest: 3.2.4(@types/node@24.0.6) - '@vitest/expect@3.0.5': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@6.2.0(@types/node@22.13.1))': + '@vitest/mocker@3.2.4(vite@6.2.0(@types/node@24.0.6))': dependencies: - '@vitest/spy': 3.0.5 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.0(@types/node@22.13.1) + vite: 6.2.0(@types/node@24.0.6) - '@vitest/pretty-format@3.0.5': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.0.7': + '@vitest/runner@3.2.4': dependencies: - tinyrainbow: 2.0.0 - - '@vitest/runner@3.0.5': - dependencies: - '@vitest/utils': 3.0.5 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.0.5': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.5': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/utils@3.0.5': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.0.5 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 '@vladfrangu/async_event_emitter@2.4.6': {} @@ -2977,10 +3036,16 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn@7.4.1: {} acorn@8.14.0: {} + acorn@8.15.0: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -3196,6 +3261,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -3216,22 +3285,23 @@ snapshots: dependencies: path-type: 4.0.0 - discord-api-types@0.37.119: {} + discord-api-types@0.38.13: {} - discord.js@14.18.0: + discord.js@14.21.0: dependencies: - '@discordjs/builders': 1.10.1 + '@discordjs/builders': 1.11.2 '@discordjs/collection': 1.5.3 - '@discordjs/formatters': 0.6.0 - '@discordjs/rest': 2.4.3 + '@discordjs/formatters': 0.6.1 + '@discordjs/rest': 2.5.1 '@discordjs/util': 1.1.1 - '@discordjs/ws': 1.2.1 + '@discordjs/ws': 1.2.3 '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.37.119 + discord-api-types: 0.38.13 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 + magic-bytes.js: 1.10.0 tslib: 2.8.1 - undici: 6.21.1 + undici: 6.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -3337,6 +3407,8 @@ snapshots: es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -3400,27 +3472,27 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.20.0)(typescript@5.7.3) - eslint: 9.20.0 + '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) + eslint: 9.30.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-deprecation@3.0.0(eslint@9.20.0)(typescript@5.7.3): + eslint-plugin-deprecation@3.0.0(eslint@9.30.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@9.20.0)(typescript@5.7.3) - eslint: 9.20.0 - ts-api-utils: 1.4.3(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.30.0)(typescript@5.8.3) + eslint: 9.30.0 + ts-api-utils: 1.4.3(typescript@5.8.3) tslib: 2.8.1 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3429,9 +3501,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.20.0 + eslint: 9.30.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.20.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.30.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3443,20 +3515,20 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.20.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.19.0(eslint@9.30.0)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@50.6.1(eslint@9.20.0): + eslint-plugin-jsdoc@50.6.1(eslint@9.30.0): dependencies: '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint: 9.20.0 + eslint: 9.30.0 espree: 10.3.0 esquery: 1.6.0 parse-imports: 2.2.1 @@ -3466,12 +3538,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-playwright@2.1.0(eslint@9.20.0): + eslint-plugin-playwright@2.1.0(eslint@9.30.0): dependencies: - eslint: 9.20.0 + eslint: 9.30.0 globals: 13.24.0 - eslint-plugin-react@7.37.3(eslint@9.20.0): + eslint-plugin-react@7.37.3(eslint@9.30.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -3479,7 +3551,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.0 + eslint: 9.30.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3500,14 +3572,14 @@ snapshots: natural-compare: 1.4.0 requireindex: 1.2.0 - eslint-plugin-unicorn@56.0.1(eslint@9.20.0): + eslint-plugin-unicorn@56.0.1(eslint@9.30.0): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) ci-info: 4.1.0 clean-regexp: 1.0.0 core-js-compat: 3.40.0 - eslint: 9.20.0 + eslint: 9.30.0 esquery: 1.6.0 globals: 15.14.0 indent-string: 4.0.0 @@ -3520,7 +3592,7 @@ snapshots: semver: 7.7.1 strip-indent: 3.0.0 - eslint-scope@8.2.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -3531,15 +3603,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.0: + eslint-visitor-keys@4.2.1: {} + + eslint@9.30.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.30.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.30.0 + '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 @@ -3550,9 +3625,9 @@ snapshots: cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3576,6 +3651,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + espree@6.2.1: dependencies: acorn: 7.4.1 @@ -3598,7 +3679,7 @@ snapshots: esutils@2.0.3: {} - expect-type@1.1.0: {} + expect-type@1.2.1: {} fast-deep-equal@3.1.3: {} @@ -3618,6 +3699,10 @@ snapshots: dependencies: reusify: 1.1.0 + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3923,7 +4008,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -3950,6 +4035,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -4014,6 +4101,8 @@ snapshots: loupe@3.1.3: {} + loupe@3.1.4: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -4431,7 +4520,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.8.0: {} + std-env@3.9.0: {} string-width@4.2.3: dependencies: @@ -4505,6 +4594,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -4526,23 +4619,28 @@ snapshots: tinyexec@0.3.2: {} - tinypool@1.0.2: {} + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-api-utils@1.4.3(typescript@5.7.3): + ts-api-utils@1.4.3(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 - ts-api-utils@2.0.1(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 ts-mixer@6.0.4: {} @@ -4598,7 +4696,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.7.3: {} + typescript@5.8.3: {} unbox-primitive@1.1.0: dependencies: @@ -4607,9 +4705,9 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.20.0: {} + undici-types@7.8.0: {} - undici@6.21.1: {} + undici@6.21.3: {} update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: @@ -4626,13 +4724,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@3.0.5(@types/node@22.13.1): + vite-node@3.2.4(@types/node@24.0.6): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.1 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.0(@types/node@22.13.1) + vite: 6.2.0(@types/node@24.0.6) transitivePeerDependencies: - '@types/node' - jiti @@ -4647,39 +4745,42 @@ snapshots: - tsx - yaml - vite@6.2.0(@types/node@22.13.1): + vite@6.2.0(@types/node@24.0.6): dependencies: esbuild: 0.25.0 postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: - '@types/node': 22.13.1 + '@types/node': 24.0.6 fsevents: 2.3.3 - vitest@3.0.5(@types/node@22.13.1): + vitest@3.2.4(@types/node@24.0.6): dependencies: - '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@6.2.0(@types/node@22.13.1)) - '@vitest/pretty-format': 3.0.7 - '@vitest/runner': 3.0.5 - '@vitest/snapshot': 3.0.5 - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.2.0(@types/node@24.0.6)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.1.0 + debug: 4.4.1 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.0 + picomatch: 4.0.2 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.2.0(@types/node@22.13.1) - vite-node: 3.0.5(@types/node@22.13.1) + vite: 6.2.0(@types/node@24.0.6) + vite-node: 3.2.4(@types/node@24.0.6) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.1 + '@types/node': 24.0.6 transitivePeerDependencies: - jiti - less diff --git a/src/config/channels.ts b/src/config/channels.ts index 3b6d52a..b901b0b 100644 --- a/src/config/channels.ts +++ b/src/config/channels.ts @@ -7,18 +7,109 @@ /** * The channels to post standup reminders in. */ -export const channels = [ - "1326291362483671202", - "1329625299406684263", - "1326291172896931921", - "1326291132535013409", - "1326291241045856286", - "1326291186863833169", - "1326291226332496026", - "1326291379621597304", - "1326291254421749770", - "1326291160632655983", - "1326291146267430912", - "1326291198666866788", - "1326291214026408009", +export const channels: Array<{ + channelId: string; + roleId: string; + name: string; +}> = [ + { + channelId: "1382093555228606484", + name: "red-script", + roleId: "1382091453987029144", + }, + { + channelId: "1382093583963656223", + name: "orange-bytes", + roleId: "1382091462707122186", + }, + { + channelId: "1382093618017337574", + name: "yellow-packet", + roleId: "1382091466767208538", + }, + { + channelId: "1382093654885138439", + name: "green-loop", + roleId: "1382091470877491364", + }, + { + channelId: "1382093684925005935", + name: "blue-stack", + roleId: "1382091474560356393", + }, + { + channelId: "1382093724200210522", + name: "purple-array", + roleId: "1382091477710012456", + }, + { + channelId: "1382093753489162330", + name: "pink-protocol", + roleId: "1382091502255341568", + }, + { + channelId: "1382093785973915820", + name: "cyan-branch", + roleId: "1382091520533856337", + }, + { + channelId: "1382093811693387867", + name: "teal-cache", + roleId: "1382091525873336400", + }, + { + channelId: "1382093843918225520", + name: "mint-syntax", + roleId: "1382091530428219603", + }, + { + channelId: "1382093883722174605", + name: "lime-variable", + roleId: "1382091534538641458", + }, + { + channelId: "1382093910259798046", + name: "rose-token", + roleId: "1382091538900979762", + }, + { + channelId: "1382093973488799886", + name: "lavender-query", + roleId: "1382091542961066014", + }, + { + channelId: "1382094002526097489", + name: "indigo-class", + roleId: "1382091547742568559", + }, + { + channelId: "1382094051360116837", + name: "golden-index", + roleId: "1382091551982882936", + }, + { + channelId: "1382094088739754096", + name: "silver-promise", + roleId: "1382091556613394443", + }, + { + channelId: "1382094114467745912", + name: "bronze-thread", + roleId: "1382091560367292536", + }, + { + channelId: "1382094146206044181", + name: "maroon-socket", + roleId: "1382091564498681907", + }, + { + channelId: "1382094200211771522", + name: "violet-function", + roleId: "1382091568252719205", + }, + { + channelId: "1382094311264616670", + name: "grey-database", + roleId: "1382091572602212622", + }, ]; diff --git a/src/index.ts b/src/index.ts index 651f4a2..f73b833 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,9 +5,12 @@ */ import { Client, Events, GatewayIntentBits } from "discord.js"; import { scheduleJob } from "node-schedule"; +import { channels } from "./config/channels.js"; import { standup } from "./modules/standup.js"; import { logger } from "./utils/logger.js"; +const activeIds: Array = []; + process.on("unhandledRejection", (error) => { if (error instanceof Error) { void logger.error("Unhandled Rejection", error); @@ -25,14 +28,35 @@ process.on("uncaughtException", (error) => { }); const client = new Client({ - intents: [ GatewayIntentBits.Guilds ], + intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages ], }); client.on(Events.ClientReady, () => { void logger.log("debug", "Bot is ready."); - scheduleJob("reminders", "0 6 * * 1-5", async() => { - await standup(client); + scheduleJob("reminders", "0 9 * * 1-5", async() => { + await standup(client, activeIds); }); }); +client.on(Events.MessageCreate, (message) => { + if (!message.channel.isThread() || !message.inGuild()) { + return; + } + if (message.channel.parentId === null) { + return; + } + const isInTeamChannel = channels.some((channel) => { + return channel.channelId === message.channel.parentId; + }); + if (!isInTeamChannel) { + return; + } + if (message.author.bot) { + return; + } + if (!activeIds.includes(message.author.id)) { + activeIds.push(message.author.id); + } +}); + await client.login(process.env.DISCORD_TOKEN); diff --git a/src/modules/standup.ts b/src/modules/standup.ts index d92bdda..94b3767 100644 --- a/src/modules/standup.ts +++ b/src/modules/standup.ts @@ -3,28 +3,58 @@ * @license Naomi's Public License * @author Naomi Carrigan */ -import { ChannelType, type Client } from "discord.js"; +import { AttachmentBuilder, ChannelType, type Client } from "discord.js"; import { channels } from "../config/channels.js"; import { logger } from "../utils/logger.js"; +const emptyArray = (array: Array): void => { + array.splice(0, array.length); +}; + /** * Posts a daily standup reminder in configured channels. * @param client - The Discord client. + * @param activeIds - The list of user IDs who sent a progress update yesterday. */ -export const standup = async(client: Client): Promise => { +// eslint-disable-next-line max-lines-per-function -- shut up +export const standup = async( + client: Client, + activeIds: Array, +): Promise => { try { + await client.users. + send("465650873650118659", { + content: `The following people sent a progress update yesterday:`, + files: [ + new AttachmentBuilder(Buffer.from(activeIds.join("\n")), { + name: "ids.txt", + }), + ], + }). + catch(() => { + void logger.log( + "warn", + "Failed to send progress update message to user.", + ); + }); + emptyArray(activeIds); const mapped = await Promise.all( channels.map(async(channel) => { - const fetched = await client.channels.fetch(channel).catch(() => { - void logger.log("warn", `Failed to fetch channel ${channel}.`); - return null; - }); + const fetched = await client.channels. + fetch(channel.channelId). + catch(() => { + void logger.log("warn", `Failed to fetch channel ${channel.name}.`); + return null; + }); if (!fetched) { - await logger.log("warn", `Channel ${channel} not found.`); + await logger.log("warn", `Channel ${channel.name} not found.`); return null; } if (fetched.type !== ChannelType.GuildText) { - await logger.log("warn", `Channel ${channel} is not a text channel.`); + await logger.log( + "warn", + `Channel ${channel.name} is not a text channel.`, + ); return null; } return fetched; @@ -35,12 +65,39 @@ export const standup = async(client: Client): Promise => { }); await Promise.all( filtered.map(async(channel) => { - await channel.send( - // eslint-disable-next-line stylistic/max-len -- This message is too long to fit on one line. - "Good morning @everyone~! It's time for standup! Please share your goals for today.", - ).catch(() => { - void logger.log("warn", `Failed to send standup reminder in channel ${channel.name}.`); - }); + const sent = await channel. + send( + `Good morning <@&${ + channels.find((c) => { + return c.channelId === channel.id; + })?.roleId ?? "692816967895220344" + }> It is time for your daily progress update. Please share the following in this thread: + +1️⃣ What did you accomplish yesterday? +2️⃣ What are you working on today? +3️⃣ Are there any blockers or issues you need help with?`, + ). + catch(() => { + void logger.log( + "warn", + `Failed to send progress reminder in channel ${channel.name}.`, + ); + return null; + }); + if (sent) { + await sent. + startThread({ + autoArchiveDuration: 1440, + name: `Daily Progress Update - ${new Date().toLocaleDateString()}`, + }). + catch(() => { + void logger.log( + "warn", + `Failed to start thread in channel ${channel.name}.`, + ); + return null; + }); + } }), ); } catch (error) { diff --git a/src/utils/logger.ts b/src/utils/logger.ts index a94a119..8ee863e 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -7,6 +7,6 @@ import { Logger } from "@nhcarrigan/logger"; export const logger = new Logger( - "Standup Bot", + "Maribelle", process.env.LOG_TOKEN ?? "", );