From 491643b71226fc08d1cf305ef12d0d17d8aca20f Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 12 May 2026 06:10:45 -0600 Subject: [PATCH 01/29] perf(api): batch leaderboard stat lookups --- .../leaderboards/guild-leaderboard.service.ts | 27 +++++++++---------- .../player-leaderboard.service.ts | 27 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts index 430f00294..827c3b675 100644 --- a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts +++ b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts @@ -55,23 +55,22 @@ export class GuildLeaderboardService extends LeaderboardService { return acc; }, {} as Record); + selector.id = true; selector.nameFormatted = true; - return await Promise.all( - ids.map(async (id) => { - const guild = await this.guildModel - .findOne() - .where("id") - .equals(id) - .select(selector) - .lean() - .exec(); + const guilds = await this.guildModel + .find({ id: { $in: ids } }) + .select(selector) + .lean() + .exec(); - const additionalStats = flatten(guild) as LeaderboardAdditionalStats; - additionalStats.name = additionalStats.nameFormatted; + const guildsById = new Map(guilds.map((guild) => [guild.id, guild])); - return additionalStats; - }) - ); + return ids.map((id) => { + const additionalStats = flatten(guildsById.get(id)) as LeaderboardAdditionalStats; + additionalStats.name = additionalStats.nameFormatted; + + return additionalStats; + }); } } diff --git a/apps/api/src/player/leaderboards/player-leaderboard.service.ts b/apps/api/src/player/leaderboards/player-leaderboard.service.ts index 5877de527..476a6be32 100644 --- a/apps/api/src/player/leaderboards/player-leaderboard.service.ts +++ b/apps/api/src/player/leaderboards/player-leaderboard.service.ts @@ -55,22 +55,21 @@ export class PlayerLeaderboardService extends LeaderboardService { }, {} as Record); selector.displayName = true; + selector.uuid = true; - return await Promise.all( - ids.map(async (id) => { - const player = await this.playerModel - .findOne() - .where("uuid") - .equals(id) - .select(selector) - .lean() - .exec(); + const players = await this.playerModel + .find({ uuid: { $in: ids } }) + .select(selector) + .lean() + .exec(); - const additionalStats = flatten(player) as LeaderboardAdditionalStats; - additionalStats.name = additionalStats.displayName; + const playersById = new Map(players.map((player) => [player.uuid, player])); - return additionalStats; - }) - ); + return ids.map((id) => { + const additionalStats = flatten(playersById.get(id)) as LeaderboardAdditionalStats; + additionalStats.name = additionalStats.displayName; + + return additionalStats; + }); } } From ba946d11dac8712ebf022a1f82bd870a065c0fa0 Mon Sep 17 00:00:00 2001 From: Cody Date: Thu, 28 May 2026 14:05:35 -0600 Subject: [PATCH 02/29] perf(leaderboard): optimize leaderboard queries and handle unknown entries * deduplicate ids before querying the database * return a default entry for unknown players and guilds --- .../leaderboards/guild-leaderboard.service.ts | 12 ++++++++++-- apps/api/src/leaderboards/leaderboard.service.ts | 16 +++++++++------- .../leaderboards/player-leaderboard.service.ts | 12 ++++++++++-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts index 827c3b675..61f44fb88 100644 --- a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts +++ b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts @@ -58,8 +58,10 @@ export class GuildLeaderboardService extends LeaderboardService { selector.id = true; selector.nameFormatted = true; + const uniqueIds = [...new Set(ids)]; + const guilds = await this.guildModel - .find({ id: { $in: ids } }) + .find({ id: { $in: uniqueIds } }) .select(selector) .lean() .exec(); @@ -67,7 +69,13 @@ export class GuildLeaderboardService extends LeaderboardService { const guildsById = new Map(guilds.map((guild) => [guild.id, guild])); return ids.map((id) => { - const additionalStats = flatten(guildsById.get(id)) as LeaderboardAdditionalStats; + const guild = guildsById.get(id); + + if (!guild) { + return { name: "Unknown" } as LeaderboardAdditionalStats; + } + + const additionalStats = flatten(guild) as LeaderboardAdditionalStats; additionalStats.name = additionalStats.nameFormatted; return additionalStats; diff --git a/apps/api/src/leaderboards/leaderboard.service.ts b/apps/api/src/leaderboards/leaderboard.service.ts index fd054864b..c512b79d7 100644 --- a/apps/api/src/leaderboards/leaderboard.service.ts +++ b/apps/api/src/leaderboards/leaderboard.service.ts @@ -135,13 +135,15 @@ export abstract class LeaderboardService { LeaderboardScanner.getLeaderboardField(constructor, extraDisplay, false) : undefined; - const additionalStats = await this.getAdditionalStats( - leaderboard.map(({ id }) => id), - [ - ...additionalFields.filter((k) => k !== field), - ...(extraDisplay ? [extraDisplay] : []), - ] - ); + const additionalStats = leaderboard.length ? + await this.getAdditionalStats( + leaderboard.map(({ id }) => id), + [ + ...additionalFields.filter((k) => k !== field), + ...(extraDisplay ? [extraDisplay] : []), + ] + ) : + []; const data = leaderboard.map((doc, index) => { const stats = additionalStats[index]; diff --git a/apps/api/src/player/leaderboards/player-leaderboard.service.ts b/apps/api/src/player/leaderboards/player-leaderboard.service.ts index 476a6be32..330885040 100644 --- a/apps/api/src/player/leaderboards/player-leaderboard.service.ts +++ b/apps/api/src/player/leaderboards/player-leaderboard.service.ts @@ -57,8 +57,10 @@ export class PlayerLeaderboardService extends LeaderboardService { selector.displayName = true; selector.uuid = true; + const uniqueIds = [...new Set(ids)]; + const players = await this.playerModel - .find({ uuid: { $in: ids } }) + .find({ uuid: { $in: uniqueIds } }) .select(selector) .lean() .exec(); @@ -66,7 +68,13 @@ export class PlayerLeaderboardService extends LeaderboardService { const playersById = new Map(players.map((player) => [player.uuid, player])); return ids.map((id) => { - const additionalStats = flatten(playersById.get(id)) as LeaderboardAdditionalStats; + const player = playersById.get(id); + + if (!player) { + return { name: "Unknown" } as LeaderboardAdditionalStats; + } + + const additionalStats = flatten(player) as LeaderboardAdditionalStats; additionalStats.name = additionalStats.displayName; return additionalStats; From d240d78c33a170d9d0f33627f5758e72823839d3 Mon Sep 17 00:00:00 2001 From: jacobk999 Date: Sun, 31 May 2026 17:19:55 -0400 Subject: [PATCH 03/29] chore: remove .turbo folder --- '.turbo'/0887dd989cb0df92-meta.json | 1 - '.turbo'/0887dd989cb0df92.tar.zst | Bin 236 -> 0 bytes '.turbo'/560fb9e86b65f150-meta.json | 1 - '.turbo'/560fb9e86b65f150.tar.zst | Bin 235 -> 0 bytes '.turbo'/5de5b3be5565a1d4-meta.json | 1 - '.turbo'/5de5b3be5565a1d4.tar.zst | Bin 235 -> 0 bytes '.turbo'/6df68d36259bce9e-meta.json | 1 - '.turbo'/6df68d36259bce9e.tar.zst | Bin 238 -> 0 bytes '.turbo'/6e55f2172ff48f6f-meta.json | 1 - '.turbo'/6e55f2172ff48f6f.tar.zst | Bin 234 -> 0 bytes '.turbo'/87c54e168150e584-meta.json | 1 - '.turbo'/87c54e168150e584.tar.zst | Bin 234 -> 0 bytes '.turbo'/8ec1ba9b0fa0ad92-meta.json | 1 - '.turbo'/8ec1ba9b0fa0ad92.tar.zst | Bin 237 -> 0 bytes '.turbo'/928fdb17552f72c8-meta.json | 1 - '.turbo'/928fdb17552f72c8.tar.zst | Bin 237 -> 0 bytes '.turbo'/bf4fc849fd54c438-meta.json | 1 - '.turbo'/bf4fc849fd54c438.tar.zst | Bin 227 -> 0 bytes '.turbo'/c1c2543d8c410791-meta.json | 1 - '.turbo'/c1c2543d8c410791.tar.zst | Bin 233 -> 0 bytes '.turbo'/c57e3a1fe2240051-meta.json | 1 - '.turbo'/c57e3a1fe2240051.tar.zst | Bin 235 -> 0 bytes '.turbo'/dda3b3af35eb510f-meta.json | 1 - '.turbo'/dda3b3af35eb510f.tar.zst | Bin 232 -> 0 bytes '.turbo'/eb9eb96f6e1ed9be-meta.json | 1 - '.turbo'/eb9eb96f6e1ed9be.tar.zst | Bin 236 -> 0 bytes .gitignore | 1 + 27 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 '.turbo'/0887dd989cb0df92-meta.json delete mode 100644 '.turbo'/0887dd989cb0df92.tar.zst delete mode 100644 '.turbo'/560fb9e86b65f150-meta.json delete mode 100644 '.turbo'/560fb9e86b65f150.tar.zst delete mode 100644 '.turbo'/5de5b3be5565a1d4-meta.json delete mode 100644 '.turbo'/5de5b3be5565a1d4.tar.zst delete mode 100644 '.turbo'/6df68d36259bce9e-meta.json delete mode 100644 '.turbo'/6df68d36259bce9e.tar.zst delete mode 100644 '.turbo'/6e55f2172ff48f6f-meta.json delete mode 100644 '.turbo'/6e55f2172ff48f6f.tar.zst delete mode 100644 '.turbo'/87c54e168150e584-meta.json delete mode 100644 '.turbo'/87c54e168150e584.tar.zst delete mode 100644 '.turbo'/8ec1ba9b0fa0ad92-meta.json delete mode 100644 '.turbo'/8ec1ba9b0fa0ad92.tar.zst delete mode 100644 '.turbo'/928fdb17552f72c8-meta.json delete mode 100644 '.turbo'/928fdb17552f72c8.tar.zst delete mode 100644 '.turbo'/bf4fc849fd54c438-meta.json delete mode 100644 '.turbo'/bf4fc849fd54c438.tar.zst delete mode 100644 '.turbo'/c1c2543d8c410791-meta.json delete mode 100644 '.turbo'/c1c2543d8c410791.tar.zst delete mode 100644 '.turbo'/c57e3a1fe2240051-meta.json delete mode 100644 '.turbo'/c57e3a1fe2240051.tar.zst delete mode 100644 '.turbo'/dda3b3af35eb510f-meta.json delete mode 100644 '.turbo'/dda3b3af35eb510f.tar.zst delete mode 100644 '.turbo'/eb9eb96f6e1ed9be-meta.json delete mode 100644 '.turbo'/eb9eb96f6e1ed9be.tar.zst diff --git a/'.turbo'/0887dd989cb0df92-meta.json b/'.turbo'/0887dd989cb0df92-meta.json deleted file mode 100644 index 0abb21ba7..000000000 --- a/'.turbo'/0887dd989cb0df92-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"0887dd989cb0df92","duration":43270} \ No newline at end of file diff --git a/'.turbo'/0887dd989cb0df92.tar.zst b/'.turbo'/0887dd989cb0df92.tar.zst deleted file mode 100644 index 876d1d00fc6645ee30584c0624a40aded0d9854a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmV%H0Aq{$P6_{z#Gzy-pkpPG>@|09k zWIR?^rn=6~?#N6gZrSWu4M>9=Tnes%gIk}A;L_)B5nS5-fe7x`vdHGk56|KeXzu^t zTm1ilQdQQKsWwivV7WANXiLiBNs$baYzP+s!Q?++{49!)*~d~eVOnWQAP7Q5kh>^i mP9d&h0A*lv0=Hek8Ng!U0n>xDp)&ZnVSr=hGQ|m+wlD#w4QW&W diff --git a/'.turbo'/560fb9e86b65f150-meta.json b/'.turbo'/560fb9e86b65f150-meta.json deleted file mode 100644 index ccc17f6be..000000000 --- a/'.turbo'/560fb9e86b65f150-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"560fb9e86b65f150","duration":45208} \ No newline at end of file diff --git a/'.turbo'/560fb9e86b65f150.tar.zst b/'.turbo'/560fb9e86b65f150.tar.zst deleted file mode 100644 index a5ff4423427b07907278ee618af089ad4853f837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmVLp4oLjeY>C@8I{TBC{|KSpFR@_$=l%Y_ zpI$f#%e~Q|R_cpL5E>Iw&0RHBcqB9s3?6h*(0qY8U?V3(R4n8iqHAL;0JJIUp%r91 zKe=hw$ONH_M#~a=+uz>_8p8pbIGHrrL7eQ$=u8#`{Lq;!g8zUs*;i}$$vs(LG9eZ4 zUkeJv|Cdtn|EpoTFH7uo%*22v`7yXsaBWvX7FP<>6!ioX0KMctU<@saklDymv|(D2 lN`RZ{ARQqNVgO}ea{_F)0m=bL4m^NW0~{-t0Zx!<%NXj&W$FL` diff --git a/'.turbo'/5de5b3be5565a1d4-meta.json b/'.turbo'/5de5b3be5565a1d4-meta.json deleted file mode 100644 index e0932d865..000000000 --- a/'.turbo'/5de5b3be5565a1d4-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"5de5b3be5565a1d4","duration":44301} \ No newline at end of file diff --git a/'.turbo'/5de5b3be5565a1d4.tar.zst b/'.turbo'/5de5b3be5565a1d4.tar.zst deleted file mode 100644 index a477f4935afb3b0dfd850bbf26d319f4502bf036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmVaI22x}t%N}&xhLGlSq^me7?!b72vaPW`{1Lq9va1M-|ph%HrNi<~(M1YjCDTIQg zqQS02vh3~cj7mi6J8v`C!r`13d5VniB3t;L$kD*>p2(5=3!cbdj8*gYWPLU6jr-Sf z1n>VLZ2o^$%C;+!?7~nD)#Ns&qP0?%X&L0KMctU<@saklDymv|(C#N?(y z2|0ka2Wuq&YM~7>Me+$u^!BBt!Xu%9VDONNg69kDa1V@(u+#{{AeyqpAwWvm6jDV} z(O{RVmc6~5af#Hv^EQJm9PW9Mr^p8{vV{+dEDih)iY&RG0E+y@7-inBtgl1@I__V~ zIq&}=bpC%yD%&nqEz?vCl*(<*rD(MgQzx@&Dwz$@oCFmBwd6lwEG>$V*~(J1Vp^F> oK(IxNAoo&)IfXEa0hEEw39#J;Cs^(iqLmw&nhPLdI1t8400oe$ zCgcJ)0*N^zgtW*unI!QAOtSgHaRH*>NH~B*hJka2eK@CqtFTBE#uO}9BLNV(Rw!O5 z5;xQwSx%@VG90Tb(p+zEFIbI-a~|9YF2aL5oA<{9 diff --git a/'.turbo'/87c54e168150e584-meta.json b/'.turbo'/87c54e168150e584-meta.json deleted file mode 100644 index 6cc9d4cf6..000000000 --- a/'.turbo'/87c54e168150e584-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"87c54e168150e584","duration":45136} \ No newline at end of file diff --git a/'.turbo'/87c54e168150e584.tar.zst b/'.turbo'/87c54e168150e584.tar.zst deleted file mode 100644 index 28045f0a7f9971b59ffadfaef8191d21e0321dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmV-I5=>bG0U)JhDybsL zc(ATamA$>)k(o@~v)REK5cj;eR9u4>x55X-l@z~&;!5rxfZ~2JW|_^G_4O2AxPL7t z@ctjd#s4o#Ra;l4+BnsM<2vCI~!iyZ`_I diff --git a/'.turbo'/8ec1ba9b0fa0ad92-meta.json b/'.turbo'/8ec1ba9b0fa0ad92-meta.json deleted file mode 100644 index 49e6c00cc..000000000 --- a/'.turbo'/8ec1ba9b0fa0ad92-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"8ec1ba9b0fa0ad92","duration":47460} \ No newline at end of file diff --git a/'.turbo'/8ec1ba9b0fa0ad92.tar.zst b/'.turbo'/8ec1ba9b0fa0ad92.tar.zst deleted file mode 100644 index 17aa4fdbb0b7d06a41c395b03e22f78ec5df2fcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmVTh1iM#l!46&u-yhI2Ov4{09FlftXu{-L8dKZ9qwu` diff --git a/'.turbo'/928fdb17552f72c8-meta.json b/'.turbo'/928fdb17552f72c8-meta.json deleted file mode 100644 index e916ab45c..000000000 --- a/'.turbo'/928fdb17552f72c8-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"928fdb17552f72c8","duration":53821} \ No newline at end of file diff --git a/'.turbo'/928fdb17552f72c8.tar.zst b/'.turbo'/928fdb17552f72c8.tar.zst deleted file mode 100644 index b40d6d9ffaf5d6c97c41c6f88bc74a024bf759b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmVMnCOi-t2L+F*Ab768j`u{#2ug)845DdUEC6%PrjsR2 zMWbCwwe9Zij0&XojczmA!tov`xsq%ECEExg$yC7qAj#DG2O!C3tzFUW2|IhvbKcKb zLID1MjL!eFh-KZCRLeBh!Zo?BnJ!D}IyFrr5rY&p1Qh_gLnl!46&u-yhI2Ov4{09FlftXxJoL8L8XyCP-9 diff --git a/'.turbo'/bf4fc849fd54c438-meta.json b/'.turbo'/bf4fc849fd54c438-meta.json deleted file mode 100644 index fd33a9efb..000000000 --- a/'.turbo'/bf4fc849fd54c438-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"bf4fc849fd54c438","duration":54932} \ No newline at end of file diff --git a/'.turbo'/bf4fc849fd54c438.tar.zst b/'.turbo'/bf4fc849fd54c438.tar.zst deleted file mode 100644 index db99be3dde4dbbae1919963fb8bc997e9e5c0e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmV<90381)wJ-euSk(pqqRS{GAgNdffl>TkX=)E+6FdfUeZa3f03@e3L zfM;w2Os$h)QYL#)j_3~5yj|&t&^TBa5Hw<9AbJ8bTJ#_{6bf;irsq;H0MyFZ*2-9c z(7y6^?D?o1F|k-TLhCv^y8yLvDHttskSWLo4sv}?f;=JqCPALsA0RJ6 dMuvhDfW=@0@CRf=Iq*{(0LRK@1c#6aWeF)NVnP4_ diff --git a/'.turbo'/c1c2543d8c410791-meta.json b/'.turbo'/c1c2543d8c410791-meta.json deleted file mode 100644 index fde63cd1e..000000000 --- a/'.turbo'/c1c2543d8c410791-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"c1c2543d8c410791","duration":56038} \ No newline at end of file diff --git a/'.turbo'/c1c2543d8c410791.tar.zst b/'.turbo'/c1c2543d8c410791.tar.zst deleted file mode 100644 index e9773a7179fce5b0609c0e208e74024c247cba0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmVS6AgNdf0fxZ8N>h6fhPo0VzzLm=()9K=<9GA@Y_c%G z4hUcy2TCb}q{uc^QhWiGY_4!jcpx+m3LbGm@LXXX?s4EEC^Nz^2$qa-0Elc^QLIEJ zchnqNPF0GF25ZTr?CtFXjNx$4gImEhcyOunAh=ZGcMx34{Q?l&Gj>JIlP@me6z=`M z<0$@rS*WzNWKyQ7kZaPd=?Y<{t4chlhAk@!6#&8HKVbYUijdjIQZ!*&fl9zdWk^Q| jgBU;=*qp#^S8xWf7=QroAZ@4&er_1xShw1OSSGBLN_#tTRGI za^YA_p}fw{-eB5QyGUqlsB2>}9?p4jr??0&F2nc4l>~nG#FgA%@WlOE6{u@<<_`|I z_x}(Q{690Hm^FoR)2N0@)vPh?s?|Ax93to;768HIKVbYUijdjIQZ!*&X-XgnLPd~6 liXx5yl!46&+;#kOOb^nA%HZdQ0gjc+6enof!UU0bWViqT diff --git a/'.turbo'/dda3b3af35eb510f-meta.json b/'.turbo'/dda3b3af35eb510f-meta.json deleted file mode 100644 index f9869f7fe..000000000 --- a/'.turbo'/dda3b3af35eb510f-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"dda3b3af35eb510f","duration":10523} \ No newline at end of file diff --git a/'.turbo'/dda3b3af35eb510f.tar.zst b/'.turbo'/dda3b3af35eb510f.tar.zst deleted file mode 100644 index f6ca565c0ec46f60dd901e4f3ddc2d986fb04d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmVD%o7&sPIT=AQ(L2q5%5BIvn)CO;BcpVG=AE0|5}ZRw-5@ zlUr(zEFsnu7Y){uN!i=m2^hoSpa-{td+^}W=S6TS=XViY%KZZoT*fY`dGbZ!9EEe< z|38nw|1S*|Z7rFUX)K0o(yigH^P0HfTBQ~MD&;@eY7By77jvQkBZa98*Hk7QAu<}6 i_FzU{0M*D)a00LxcmVexZKw=>76af|xr}jwq%BO8BxNK3 diff --git a/'.turbo'/eb9eb96f6e1ed9be-meta.json b/'.turbo'/eb9eb96f6e1ed9be-meta.json deleted file mode 100644 index dd4925314..000000000 --- a/'.turbo'/eb9eb96f6e1ed9be-meta.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"eb9eb96f6e1ed9be","duration":12686} \ No newline at end of file diff --git a/'.turbo'/eb9eb96f6e1ed9be.tar.zst b/'.turbo'/eb9eb96f6e1ed9be.tar.zst deleted file mode 100644 index d355dec8a135cf02eea2ed28b8cb6b7d5cb5b68b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmVvo~%sKTlsv=GnvlNW~*Q+kg z;Zh6<2Wu+;#ZV@ZW^@UO-p+JPh#));3L=p~@LYi*?Rk(9m}t^8h^DJ?2#7H@l}s}- z9_v;jyUxz;$V{TX^0s3&AnkFGCCCO2vV9JMTm}9HL9Xo|fFNJ3Ws$cp>gp-lqWwxG z6z>1uTl~MGOqShBWE*E%uv{*4T1vFecA8Qo!;}pH6#%>BKVTFsijY~!QuJY3fl5G- m<%%FTQiM5$Ac_H$fz1i9-3BNJAUW^=Rt<2hTt+xSq%C80gk>-Q diff --git a/.gitignore b/.gitignore index 9c83ea758..8c2b3f4c0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ config.json dist node_modules .turbo +'.turbo' package-lock.json out .yarn/install-state.gz From 81e6f7b0a97b2af3746746e9f87858f72c77c222 Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:41:45 -0400 Subject: [PATCH 04/29] chore: update dependencies and repo cleanup (#871) * chore: update turborepo and typescript + remove commitlint * chore: update napi-rs/cli and @types/node and unplugin * chore: add oxlint for packages using basic rules * chore: add all oxlint rules * chore: lint api * chore: lint scripts * chore: lint site * chore: lint support-bot and site * chore: lint rendering package * chore: lint discord-bot * chore: update submodules * fix: types * chore: remove eslint dependencies and update ci workflow * chore: update node version in ci * chore: add lint ci script * chore: use lint ci script in ci * chore: rename test:types to typecheck * chore: use typescript native preview * chore: update to vitest v4 * chore: update swc version * chore: update lockfile * chore: update tailwind * chore: add compose.dev.yml * chore: only test affected packages in ci * chore: remove affected from test script * chore: add check if rank exists for formatting display names * chore: remove commented site rules * chore: format tsconfigs --- .devcontainer/Dockerfile | 8 - .devcontainer/devcontainer.json | 32 - .github/CONTRIBUTING.md | 2 +- .github/workflows/ci.yml | 21 +- .gitignore | 1 - .oxfmtrc.jsonc | 4 + .oxlintrc.jsonc | 179 + .vscode/settings.json | 26 +- .vscode/tasks.json | 36 +- README.md | 2 +- apps/api/eslint.config.js | 11 - apps/api/package.json | 13 +- apps/api/src/auth/auth.guard.ts | 2 +- apps/api/src/dtos/guild-leaderboard.dto.ts | 4 +- apps/api/src/dtos/guild-rankings.dto.ts | 4 +- apps/api/src/dtos/player-leaderboard.dto.ts | 4 +- apps/api/src/dtos/player-rankings.dto.ts | 4 +- apps/api/src/guild/guild.service.ts | 61 +- apps/api/src/hypixel/hypixel.service.ts | 2 +- apps/api/src/index.ts | 4 +- .../src/leaderboards/leaderboard.service.ts | 16 +- apps/api/src/player/player.controller.ts | 9 +- apps/api/src/player/player.service.ts | 50 +- apps/api/src/skin/skin.service.ts | 2 +- apps/api/src/user/user.service.ts | 43 +- apps/api/tsconfig.json | 5 +- apps/discord-bot/eslint.config.js | 11 - apps/discord-bot/package.json | 11 +- .../src/commands/arcade/modes/dropper.tsx | 4 +- .../src/commands/base.hypixel-command.ts | 6 +- .../challenges/challenges.profile.tsx | 44 +- .../src/commands/config/theme.command.tsx | 2 +- .../src/commands/events/events.command.tsx | 9 +- .../src/commands/gamecounts.command.ts | 9 +- .../commands/gtbhelper/gtbhelpber.command.tsx | 8 +- .../src/commands/guild/guild-list.profile.tsx | 4 +- .../commands/guild/guild-top.subcommand.tsx | 8 +- .../src/commands/guild/guild.command.tsx | 9 +- .../commands/historical/session.command.tsx | 9 +- .../guild-leaderboard.argument.ts | 4 +- .../guild-leaderboard.subcommand.ts | 2 +- .../player-leaderboard.argument.ts | 7 +- .../src/commands/minecraft/cape.command.ts | 11 +- .../src/commands/minecraft/colors.command.ts | 4 +- .../minecraft/server/server.argument.ts | 2 + .../minecraft/server/server.command.tsx | 1 + .../minecraft/server/server.profile.tsx | 2 +- .../src/commands/quests/quests.command.tsx | 11 +- .../src/commands/quests/quests.profile.tsx | 4 +- .../commands/rankings/rankings.command.tsx | 15 +- .../src/commands/ratios/ratios.command.tsx | 13 +- .../src/components/Header/Header.tsx | 2 +- apps/discord-bot/src/components/List.tsx | 4 +- apps/discord-bot/src/index.ts | 6 +- apps/discord-bot/src/lib/command.listener.ts | 5 +- .../src/lib/convert-color-codes.ts | 2 +- apps/discord-bot/tsconfig.json | 10 +- apps/scripts/eslint.config.js | 15 - apps/scripts/package.json | 13 +- apps/scripts/src/api-key.js | 9 +- apps/scripts/src/limit-redis.js | 22 +- apps/scripts/src/purge.js | 10 +- apps/scripts/src/rank-emojis.js | 38 +- apps/scripts/src/timestamp.js | 25 +- apps/scripts/src/validate-commands.js | 14 +- apps/scripts/tsconfig.json | 5 +- apps/site/.oxlintrc.jsonc | 72 + apps/site/app/(home)/session-animation.tsx | 12 +- apps/site/app/api/skin/head/route.ts | 2 +- apps/site/app/api/skin/render/route.ts | 2 +- apps/site/app/players/[slug]/context.tsx | 21 +- .../players/[slug]/general/bingo/bingo.tsx | 10 +- apps/site/app/players/search.tsx | 51 +- apps/site/components/ui/background.tsx | 2 +- apps/site/components/ui/box.tsx | 4 +- apps/site/components/ui/carousel.tsx | 2 + apps/site/components/ui/command.tsx | 7 +- apps/site/components/ui/minecraft-text.tsx | 2 +- apps/site/components/ui/tabs.tsx | 10 +- apps/site/eslint.config.mjs | 22 - apps/site/hooks/use-measure.tsx | 1 - apps/site/package.json | 22 +- apps/support-bot/package.json | 11 +- .../src/commands/commands.command.ts | 9 +- .../src/events/guild-member-add.event.tsx | 40 +- .../src/events/guild-member-update.event.ts | 4 +- apps/support-bot/src/index.ts | 17 +- .../src/services/mongo-loader.service.ts | 4 +- .../src/services/ticket.service.ts | 11 +- apps/support-bot/tsconfig.json | 5 +- apps/verify-server/eslint.config.js | 11 - apps/verify-server/package.json | 9 +- apps/verify-server/src/generate-code.ts | 8 +- apps/verify-server/tsconfig.json | 5 +- assets/private | 2 +- assets/public | 2 +- compose.dev.yml | 21 + config.schema.js | 4 +- eslint.config.js | 235 - package.json | 63 +- packages/api-client/eslint.config.js | 11 - packages/api-client/package.json | 9 +- packages/api-client/src/api.service.ts | 4 +- packages/api-client/tsconfig.json | 5 +- packages/assets/eslint.config.js | 11 - packages/assets/package.json | 11 +- packages/assets/src/index.ts | 4 +- packages/assets/tsconfig.json | 5 +- packages/discord/eslint.config.js | 11 - packages/discord/package.json | 11 +- .../discord/src/arguments/player.argument.ts | 2 +- .../src/command/abstract-command.listener.ts | 7 +- .../discord/src/command/command.builder.ts | 103 +- .../discord/src/command/command.loader.ts | 102 +- packages/discord/src/event/event.loader.ts | 90 +- .../src/messages/components/parse-emoji.ts | 2 +- packages/discord/src/messages/embed.ts | 4 +- packages/discord/src/services/api.service.ts | 27 +- .../src/services/i18n-loader.service.ts | 140 +- .../discord/src/services/member.service.ts | 5 +- .../discord/src/services/paginate.service.ts | 667 +- packages/discord/src/util/error.message.ts | 9 +- .../discord/src/util/parse-discord-error.ts | 14 +- packages/discord/tsconfig.json | 1 - packages/logger/eslint.config.js | 11 - packages/logger/package.json | 9 +- packages/logger/src/index.ts | 65 +- packages/logger/tsconfig.json | 1 - packages/math/eslint.config.js | 11 - packages/math/package.json | 9 +- packages/math/src/index.ts | 4 +- packages/math/tsconfig.json | 1 - packages/rendering/eslint.config.js | 11 - packages/rendering/package.json | 11 +- packages/rendering/src/colors/index.ts | 4 +- packages/rendering/src/font/font-renderer.ts | 31 +- packages/rendering/src/hooks/useGradient.ts | 4 +- packages/rendering/src/index.ts | 3 - packages/rendering/src/intrinsics/Box.ts | 2 +- packages/rendering/src/jsx-runtime/convert.ts | 4 +- .../rendering/src/jsx/create-instructions.ts | 2 +- packages/rendering/src/jsx/render.ts | 16 +- packages/rendering/tsconfig.json | 1 - packages/schemas/eslint.config.js | 11 - packages/schemas/package.json | 9 +- packages/schemas/src/game/game-modes.ts | 2 +- packages/schemas/src/guild/index.ts | 3 +- packages/schemas/src/guild/member.ts | 6 +- packages/schemas/src/guild/util.ts | 4 +- packages/schemas/src/metadata/deserialize.ts | 15 +- .../field/get-leaderboard-metadata.ts | 36 +- .../schemas/src/metadata/metadata-scanner.ts | 197 +- packages/schemas/src/metadata/serialize.ts | 8 +- .../src/player/gamemodes/duels/mode.ts | 110 +- .../player/gamemodes/murdermystery/index.ts | 6 +- .../player/gamemodes/murdermystery/mode.ts | 2 +- .../src/player/gamemodes/quests/util.ts | 16 +- .../src/player/gamemodes/skywars/util.ts | 4 +- .../player/gamemodes/woolgames/sheepwars.ts | 2 +- packages/schemas/src/player/index.ts | 22 +- packages/schemas/src/player/status.ts | 48 +- packages/schemas/src/player/util.ts | 226 +- .../src/util/create-historical-player.ts | 31 +- .../schemas/src/util/historical-scanner.ts | 66 - packages/schemas/src/util/index.ts | 1 - .../schemas/src/util/leaderboard-scanner.ts | 79 +- packages/schemas/src/util/parse-fields.ts | 2 +- packages/schemas/tsconfig.json | 1 - packages/skin-renderer/index.cjs | 102 +- packages/skin-renderer/package.json | 5 +- packages/util/eslint.config.js | 11 - packages/util/package.json | 12 +- packages/util/src/config.ts | 30 +- packages/util/src/flatten.ts | 4 +- packages/util/src/types.ts | 2 +- packages/util/src/unflatten.ts | 12 +- packages/util/src/util.ts | 18 +- packages/util/tsconfig.json | 8 +- pnpm-lock.yaml | 7153 ++++++----------- tsconfig.base.json | 12 +- turbo.json | 88 +- vite.swc.ts | 4 + .../eslint.config.js => vitest.config.ts | 8 +- vitest.workspace.ts | 14 - 184 files changed, 4506 insertions(+), 6977 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json create mode 100644 .oxfmtrc.jsonc create mode 100644 .oxlintrc.jsonc delete mode 100644 apps/api/eslint.config.js delete mode 100644 apps/discord-bot/eslint.config.js delete mode 100644 apps/scripts/eslint.config.js create mode 100644 apps/site/.oxlintrc.jsonc delete mode 100644 apps/site/eslint.config.mjs delete mode 100644 apps/verify-server/eslint.config.js create mode 100644 compose.dev.yml delete mode 100644 eslint.config.js delete mode 100644 packages/api-client/eslint.config.js delete mode 100644 packages/assets/eslint.config.js delete mode 100644 packages/discord/eslint.config.js delete mode 100644 packages/logger/eslint.config.js delete mode 100644 packages/math/eslint.config.js delete mode 100644 packages/rendering/eslint.config.js delete mode 100644 packages/schemas/eslint.config.js delete mode 100644 packages/schemas/src/util/historical-scanner.ts delete mode 100644 packages/util/eslint.config.js rename apps/support-bot/eslint.config.js => vitest.config.ts (57%) delete mode 100644 vitest.workspace.ts diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 5efd057af..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:1-16 - -# Install additional OS packages -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends fontconfig redis-server - -# Install NPM packages -RUN su node -c "npm install -g pm2 git-cz pnpm" \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 7970c288a..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "Statsify", - "build": { - "dockerfile": "Dockerfile" - }, - "customizations": { - "vscode": { - "extensions": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "vivaxy.vscode-conventional-commits", - "mikestead.dotenv", - "ms-azuretools.vscode-docker", - "lokalise.i18n-ally", - "gruntfuggly.todo-tree" - ] - } - }, - "runArgs": [ - "--privileged" - ], - "containerEnv": { - "USE_POLLING": "true" - }, - "remoteUser": "node", - "postCreateCommand": "git submodule update --init && pnpm install && pnpm run build", - "postStartCommand": "sudo /etc/init.d/redis-server start && git config core.autocrlf true && pnpm scripts api-key --nonInteractiveKeyCreation", - "features": { - "ghcr.io/devcontainers/features/git:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} - } -} \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c87483316..749e96246 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -6,7 +6,7 @@ ## Guidelines ### General Concepts -* Code should follow our ESLint rules as closely as possible (`pnpm lint`) +* Code should follow our linting rules as closely as possible (`pnpm lint`) * Code should attempt to be TypeScript type safe * Code should attempt to be consistent, fast, scalable, and efficient diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc4411879..5fd3cfa11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: branches: - - main + - main pull_request: permissions: @@ -14,8 +14,9 @@ jobs: name: CI runs-on: ubuntu-latest env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 @@ -23,10 +24,10 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Install node.js v22 + - name: Install node.js v24 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: - node-version: 22.6.0 + node-version: 24.7.0 - name: Install wasm-pack run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh @@ -41,16 +42,16 @@ jobs: turbo-${{ github.job }}-${{ github.ref_name }}- - name: Install dependencies - run: pnpm install + run: pnpm install --frozen-lockfile - name: Lint - run: pnpm lint + run: pnpm lint:ci --affected - name: Typecheck - run: pnpm test:types + run: pnpm typecheck --affected - name: Build - run: pnpm build + run: pnpm build --affected - name: Test - run: pnpm test:coverage \ No newline at end of file + run: pnpm test:coverage diff --git a/.gitignore b/.gitignore index 8c2b3f4c0..589536b4e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,5 @@ apps/support-bot/commands.json Cargo.lock /target /data -compose.dev.yml *.node .env diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc new file mode 100644 index 000000000..bc1ae6358 --- /dev/null +++ b/.oxfmtrc.jsonc @@ -0,0 +1,4 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "printWidth": 80, +} diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc new file mode 100644 index 000000000..99b35f251 --- /dev/null +++ b/.oxlintrc.jsonc @@ -0,0 +1,179 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": [ + "eslint", + "typescript", + "unicorn", + "oxc", + "import", + "node", + "promise", + "vitest", + ], + "jsPlugins": [ + { "name": "license-header", "specifier": "eslint-plugin-license-header" }, + ], + "rules": { + // Oxc + "oxc/no-this-in-exported-function": "error", + "oxc/misrefactored-assign-op": "error", + "oxc/approx-constant": "error", + "oxc/no-accumulating-spread": "error", + "oxc/branches-sharing-code": "error", + + // Type Aware Rules + "typescript/no-unnecessary-boolean-literal-compare": "error", + "typescript/no-unnecessary-template-expression": "error", + "typescript/no-unnecessary-type-arguments": "error", + "typescript/no-unnecessary-type-conversion": "error", + "typescript/no-unnecessary-type-assertion": "error", + "typescript/non-nullable-type-assertion-style": "error", + "typescript/prefer-optional-chain": "error", + "typescript/no-unnecessary-condition": "error", + "typescript/no-confusing-void-expression": "error", + "typescript/no-deprecated": "error", + "typescript/no-misused-promises": "error", + "typescript/only-throw-error": "error", + "typescript/prefer-includes": "error", + "typescript/prefer-nullish-coalescing": "error", + "typescript/prefer-promise-reject-errors": "error", + "typescript/related-getter-setter-pairs": "error", + "typescript/require-await": "error", + "typescript/restrict-plus-operands": "error", + "typescript/switch-exhaustiveness-check": "error", + + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-extraneous-class": ["error", { "allowWithDecorator": true }], + "typescript/no-confusing-non-null-assertion": "error", + "typescript/no-non-null-asserted-nullish-coalescing": "error", + "typescript/no-import-type-side-effects": "error", + "typescript/no-empty-object-type": "error", + "typescript/no-dynamic-delete": "error", + "typescript/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "ts-ignore": true, + "ts-nocheck": true, + "ts-check": true, + "minimumDescriptionLength": 3, + }, + ], + "typescript/no-unsafe-function-type": "error", + + // Eslint + "no-unneeded-ternary": "error", + "no-unmodified-loop-condition": "error", + "no-unexpected-multiline": "error", + "no-underscore-dangle": "error", + "no-extra-bind": "error", + "no-extend-native": "error", + "no-var": "error", + "no-proto": "error", + "no-param-reassign": "warn", + "no-empty": "error", + "no-useless-call": "error", + "no-await-in-loop": "error", + "no-useless-assignment": "error", + "no-array-constructor": "error", + "no-case-declarations": "error", + "no-constructor-return": "error", + "no-else-return": "error", + "no-fallthrough": "error", + "no-lonely-if": "error", + "no-promise-executor-return": "error", + "no-prototype-builtins": "error", + "no-useless-return": "error", + "no-warning-comments": "warn", + "eqeqeq": "error", + "class-methods-use-this": "warn", + "symbol-description": "error", + + // Unicorn + "unicorn/prefer-add-event-listener": "error", + "unicorn/no-instanceof-builtins": "error", + "unicorn/no-accessor-recursion": "error", + "unicorn/consistent-function-scoping": "error", + "unicorn/prefer-number-properties": "error", + "unicorn/prefer-node-protocol": "error", + "unicorn/prefer-modern-math-apis": "error", + "unicorn/no-useless-error-capture-stack-trace": "error", + "unicorn/no-magic-array-flat-depth": "error", + "unicorn/no-unnecessary-slice-end": "error", + "unicorn/no-array-for-each": "error", + "unicorn/no-anonymous-default-export": "error", + "unicorn/no-abusive-eslint-disable": "error", + "unicorn/prefer-array-flat-map": "error", + "unicorn/prefer-array-find": "error", + "unicorn/no-useless-iterator-to-array": "error", + "unicorn/consistent-assert": "error", + "unicorn/consistent-empty-array-spread": "error", + "unicorn/explicit-length-check": "error", + "unicorn/new-for-builtins": "error", + "unicorn/no-hex-escape": "error", + "unicorn/no-immediate-mutation": "error", + "unicorn/no-lonely-if": "error", + "unicorn/no-negation-in-equality-check": "error", + "unicorn/no-new-buffer": "error", + "unicorn/no-object-as-default-parameter": "error", + "unicorn/no-typeof-undefined": "error", + "unicorn/no-unnecessary-array-splice-count": "error", + "unicorn/no-unreadable-iife": "error", + "unicorn/no-useless-promise-resolve-reject": "error", + "unicorn/prefer-array-flat": "error", + "unicorn/prefer-array-some": "error", + "unicorn/prefer-blob-reading-methods": "error", + "unicorn/prefer-code-point": "error", + "unicorn/prefer-dom-node-dataset": "error", + "unicorn/prefer-dom-node-append": "error", + "unicorn/prefer-dom-node-remove": "error", + "unicorn/prefer-event-target": "error", + "unicorn/prefer-import-meta-properties": "error", + "unicorn/prefer-math-trunc": "error", + "unicorn/prefer-native-coercion-functions": "error", + "unicorn/prefer-query-selector": "error", + "unicorn/prefer-regexp-test": "error", + "unicorn/prefer-string-replace-all": "error", + "unicorn/prefer-string-slice": "error", + "unicorn/prefer-top-level-await": "error", + "unicorn/prefer-type-error": "error", + "unicorn/require-number-to-fixed-digits-argument": "error", + + // Import + "import/no-self-import": "error", + "import/no-named-as-default": "error", + "import/no-empty-named-blocks": "error", + "import/no-absolute-path": "error", + "import/no-cycle": "error", + + // Promise + "promise/no-promise-in-callback": "error", + "promise/no-multiple-resolved": "error", + "promise/always-return": "error", + "promise/no-new-statics": "error", + + // Node + "node/no-path-concat": "error", + "node/handle-callback-err": "error", + + // Vitest + "vitest/no-disabled-tests": "error", + "vitest/no-conditional-tests": "error", + "vitest/no-conditional-expect": "error", + "vitest/expect-expect": "error", + + // License Header + "license-header/header": [ + "error", + [ + "/**", + " * Copyright (c) Statsify", + " *", + " * This source code is licensed under the GNU GPL v3 license found in the", + " * LICENSE file in the root directory of this source tree.", + " * https://github.com/Statsify/statsify/blob/main/LICENSE", + " */", + ], + ], + }, +} diff --git a/.vscode/settings.json b/.vscode/settings.json index cfb9504fe..2a1f89365 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,8 @@ { - "editor.defaultFormatter": "dbaeumer.vscode-eslint", + "editor.defaultFormatter": "oxc.oxc-vscode", "editor.tabSize": 2, "editor.formatOnSave": true, - "editor.codeActionsOnSave": [ - "source.fixAll.eslint" - ], + "editor.codeActionsOnSave": ["source.fixAll.oxc"], "typescript.tsdk": "node_modules/typescript/lib", "files.exclude": { // "**/dist/**": true, @@ -13,28 +11,20 @@ "**/.pnpm-store/**": true }, "[js][ts][tsx]": { - "editor.defaultFormatter": "dbaeumer.vscode-eslint" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[handlebars][json][jsonc][css][scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, - "i18n-ally.localesPaths": [ - "locales" - ], + "i18n-ally.localesPaths": ["locales"], "i18n-ally.sourceLanguage": "en-US", "i18n-ally.displayLanguage": "en-US", - "i18n-ally.ignoredLocales": [ - "en" - ], + "i18n-ally.ignoredLocales": ["en"], "i18n-ally.keystyle": "nested", "todo-tree.tree.scanMode": "workspace only", "testing.automaticallyOpenPeekView": "never", "[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer" }, - "tailwindCSS.classAttributes": [ - "className", - "containerClass", - "contentClass" - ] -} \ No newline at end of file + "tailwindCSS.classAttributes": ["className", "containerClass", "contentClass"] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f4de247c4..71045f20a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,9 +4,7 @@ { "type": "shell", "command": "pnpm", - "args": [ - "build" - ], + "args": ["build"], "label": "build", "group": "build", "presentation": { @@ -23,9 +21,7 @@ { "type": "shell", "command": "pnpm", - "args": [ - "build:watch" - ], + "args": ["build:watch"], "label": "build:watch", "presentation": { "echo": true, @@ -42,37 +38,25 @@ { "type": "shell", "command": "pnpm", - "args": [ - "test" - ], + "args": ["test"], "label": "test", "group": "test", - "dependsOn": [ - "build" - ], + "dependsOn": ["build"], "detail": "Tests monorepo using turbo" }, { "type": "shell", "command": "pnpm", - "args": [ - "test:types" - ], - "label": "test:types", - "dependsOn": [ - "build" - ] + "args": ["typecheck"], + "label": "typecheck", + "dependsOn": ["build"] }, { "type": "shell", "command": "pnpm", - "args": [ - "test:coverage" - ], + "args": ["test:coverage"], "label": "test:coverage", - "dependsOn": [ - "build" - ], + "dependsOn": ["build"] } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index 59846f0db..d1982a2aa 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ $ pnpm lint $ pnpm test # Type Testing -$ pnpm test:types +$ pnpm typecheck ``` ## ๐Ÿ’ Contributing diff --git a/apps/api/eslint.config.js b/apps/api/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/apps/api/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/apps/api/package.json b/apps/api/package.json index 122cae83f..81d7ec0c9 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@fastify/static": "^8.2.0", @@ -27,7 +28,7 @@ "@statsify/schemas": "workspace:^", "@statsify/skin-renderer": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "class-transformer": "0.5.1", "class-validator": "^0.14.1", @@ -38,11 +39,11 @@ "mongoose": "^8.5.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "toad-scheduler": "^3.0.1" }, "devDependencies": { - "@nestjs/testing": "^11.1.6", + "@nestjs/testing": "^11.1.24", "@types/luxon": "^3.4.2" }, "imports": { @@ -99,4 +100,4 @@ "default": "./dist/redis/index.js" } } -} \ No newline at end of file +} diff --git a/apps/api/src/auth/auth.guard.ts b/apps/api/src/auth/auth.guard.ts index c85dbddb2..4581e2af5 100644 --- a/apps/api/src/auth/auth.guard.ts +++ b/apps/api/src/auth/auth.guard.ts @@ -35,7 +35,7 @@ export class AuthGuard implements CanActivate { const weight = this.reflector.get("auth-weight", handler); const role = this.reflector.get("auth-role", handler); - if (!weight || role == undefined) return true; + if (!weight || role === undefined) return true; const req = context.switchToHttp().getRequest(); diff --git a/apps/api/src/dtos/guild-leaderboard.dto.ts b/apps/api/src/dtos/guild-leaderboard.dto.ts index bdb8e5b5c..483977c3a 100644 --- a/apps/api/src/dtos/guild-leaderboard.dto.ts +++ b/apps/api/src/dtos/guild-leaderboard.dto.ts @@ -7,7 +7,7 @@ */ import { ApiProperty } from "@nestjs/swagger"; -import { Guild, LeaderboardScanner } from "@statsify/schemas"; +import { Guild, getLeaderboardFields } from "@statsify/schemas"; import { IsEnum, IsInt, @@ -19,7 +19,7 @@ import { } from "class-validator"; import { Transform } from "class-transformer"; -const fields = LeaderboardScanner.getLeaderboardFields(Guild).map(([key]) => key); +const fields = getLeaderboardFields(Guild).map(([key]) => key); export class GuildLeaderboardDto { @IsEnum(fields) diff --git a/apps/api/src/dtos/guild-rankings.dto.ts b/apps/api/src/dtos/guild-rankings.dto.ts index bc287b5f8..bb3b8f798 100644 --- a/apps/api/src/dtos/guild-rankings.dto.ts +++ b/apps/api/src/dtos/guild-rankings.dto.ts @@ -7,10 +7,10 @@ */ import { ApiProperty } from "@nestjs/swagger"; -import { Guild, LeaderboardScanner } from "@statsify/schemas"; +import { Guild, getLeaderboardFields } from "@statsify/schemas"; import { IsEnum, IsString, MaxLength, MinLength } from "class-validator"; -const fields = LeaderboardScanner.getLeaderboardFields(Guild).map(([key]) => key); +const fields = getLeaderboardFields(Guild).map(([key]) => key); export class GuildRankingDto { @ApiProperty({ enum: fields, type: [String] }) diff --git a/apps/api/src/dtos/player-leaderboard.dto.ts b/apps/api/src/dtos/player-leaderboard.dto.ts index 8b8706757..0e39b70ed 100644 --- a/apps/api/src/dtos/player-leaderboard.dto.ts +++ b/apps/api/src/dtos/player-leaderboard.dto.ts @@ -8,11 +8,11 @@ import { ApiProperty, PartialType } from "@nestjs/swagger"; import { IsEnum, IsInt, IsOptional, Min } from "class-validator"; -import { LeaderboardScanner, Player } from "@statsify/schemas"; +import { Player, getLeaderboardFields } from "@statsify/schemas"; import { PlayerDto } from "./player.dto.js"; import { Transform } from "class-transformer"; -const fields = LeaderboardScanner.getLeaderboardFields(Player).map(([key]) => key); +const fields = getLeaderboardFields(Player).map(([key]) => key); export class PlayerLeaderboardDto extends PartialType(PlayerDto) { @IsEnum(fields) diff --git a/apps/api/src/dtos/player-rankings.dto.ts b/apps/api/src/dtos/player-rankings.dto.ts index 71058292d..8f29c9010 100644 --- a/apps/api/src/dtos/player-rankings.dto.ts +++ b/apps/api/src/dtos/player-rankings.dto.ts @@ -8,10 +8,10 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsEnum } from "class-validator"; -import { LeaderboardScanner, Player } from "@statsify/schemas"; +import { Player, getLeaderboardFields } from "@statsify/schemas"; import { UuidDto } from "./uuid.dto.js"; -const fields = LeaderboardScanner.getLeaderboardFields(Player).map(([key]) => key); +const fields = getLeaderboardFields(Player).map(([key]) => key); export class PlayerRankingsDto extends UuidDto { @ApiProperty({ enum: fields, type: [String] }) diff --git a/apps/api/src/guild/guild.service.ts b/apps/api/src/guild/guild.service.ts index a13129c3d..e81e74686 100644 --- a/apps/api/src/guild/guild.service.ts +++ b/apps/api/src/guild/guild.service.ts @@ -39,7 +39,6 @@ export class GuildService { type: GuildQuery, cache: CacheLevel ): Promise { - // eslint-disable-next-line prefer-const let [cachedGuild, tag, displayName] = await this.getCachedGuild(inputtedTag, type); if (cachedGuild && this.hypixelService.shouldCache(cachedGuild.expiresAt, cache)) { @@ -94,16 +93,12 @@ export class GuildService { }; // Add all the days to the guild total exp history - Object.entries(combinedExpHistory) - .sort() - .toReversed() - .slice(0, 30) - .forEach(([day, exp], index) => { - member.expHistory[index] = exp; - member.expHistoryDays[index] = day; - guildExpHistory[day] = guildExpHistory[day] ? guildExpHistory[day] + exp : exp; - member.monthly += exp; - }); + for (const [index, [day, exp]] of Object.entries(combinedExpHistory).toSorted().toReversed().slice(0, 30).entries()) { + member.expHistory[index] = exp; + member.expHistoryDays[index] = day; + guildExpHistory[day] = guildExpHistory[day] ? guildExpHistory[day] + exp : exp; + member.monthly += exp; + } guild.questParticipation = guild.questParticipation + member.questParticipation; @@ -118,30 +113,26 @@ export class GuildService { .exec(); // Get scaled gexp - Object.entries(guildExpHistory) - .sort() - .toReversed() - .slice(0, 30) - .forEach(([day, exp], index) => { - const scaled = this.scaleGexp(exp); - - guild.expHistory[index] = exp; - guild.expHistoryDays[index] = day; - guild.scaledExpHistory[index] = scaled; - - if (index === 0) { - guild.daily = exp; - guild.scaledDaily = scaled; - } - - if (index < 7) { - guild.weekly += exp; - guild.scaledWeekly += scaled; - } - - guild.monthly += exp; - guild.scaledMonthly += scaled; - }); + for (const [index, [day, exp]] of Object.entries(guildExpHistory).toSorted().toReversed().slice(0, 30).entries()) { + const scaled = this.scaleGexp(exp); + + guild.expHistory[index] = exp; + guild.expHistoryDays[index] = day; + guild.scaledExpHistory[index] = scaled; + + if (index === 0) { + guild.daily = exp; + guild.scaledDaily = scaled; + } + + if (index < 7) { + guild.weekly += exp; + guild.scaledWeekly += scaled; + } + + guild.monthly += exp; + guild.scaledMonthly += scaled; + } // Cache guilds responses for 10 minutes guild.expiresAt = Date.now() + 600_000; diff --git a/apps/api/src/hypixel/hypixel.service.ts b/apps/api/src/hypixel/hypixel.service.ts index ce7398c04..426ad3e22 100644 --- a/apps/api/src/hypixel/hypixel.service.ts +++ b/apps/api/src/hypixel/hypixel.service.ts @@ -32,7 +32,7 @@ export class HypixelService { public shouldCache(expirey: number, cache: CacheLevel): boolean { return ( cache !== CacheLevel.LIVE && - (cache == CacheLevel.CACHE_ONLY || Date.now() < expirey) + (cache === CacheLevel.CACHE_ONLY || Date.now() < expirey) ); } diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 2451ba57c..bce208af1 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -22,7 +22,7 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { mkdir } from "node:fs/promises"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; const logger = new Logger("api"); const handleError = logger.error.bind(logger); @@ -91,7 +91,7 @@ const redoc = new DocumentBuilder() // Fastify template renderer for Redoc app.setViewEngine({ engine: { handlebars }, - templates: join(__dirname, "..", "views"), + templates: join(directory, "..", "views"), }); const document = SwaggerModule.createDocument(app, redoc); diff --git a/apps/api/src/leaderboards/leaderboard.service.ts b/apps/api/src/leaderboards/leaderboard.service.ts index c512b79d7..2dc14f36d 100644 --- a/apps/api/src/leaderboards/leaderboard.service.ts +++ b/apps/api/src/leaderboards/leaderboard.service.ts @@ -11,7 +11,7 @@ import { Constructor, Flatten } from "@statsify/util"; import { DateTime } from "luxon"; import { InjectRedis } from "#redis"; import { Injectable, InternalServerErrorException } from "@nestjs/common"; -import { LeaderboardEnabledMetadata, LeaderboardScanner } from "@statsify/schemas"; +import { type LeaderboardEnabledMetadata, getLeaderboardField, getLeaderboardFields } from "@statsify/schemas"; import { LeaderboardQuery } from "@statsify/api-client"; import { Redis } from "ioredis"; @@ -37,7 +37,7 @@ export abstract class LeaderboardService { idField: keyof T, remove = false ) { - const fields = LeaderboardScanner.getLeaderboardFields(constructor); + const fields = getLeaderboardFields(constructor); const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); const child = transaction?.startChild({ @@ -88,7 +88,7 @@ export abstract class LeaderboardService { sort, name, hidden, - } = LeaderboardScanner.getLeaderboardField( + } = getLeaderboardField( constructor, field ) as LeaderboardEnabledMetadata; @@ -128,11 +128,11 @@ export abstract class LeaderboardService { ); const additionalFieldMetadata = additionalFields.map((k) => - LeaderboardScanner.getLeaderboardField(constructor, k, false) + getLeaderboardField(constructor, k, false) ); const extraDisplayMetadata = extraDisplay ? - LeaderboardScanner.getLeaderboardField(constructor, extraDisplay, false) : + getLeaderboardField(constructor, extraDisplay, false) : undefined; const additionalStats = leaderboard.length ? @@ -208,8 +208,8 @@ export abstract class LeaderboardService { const leaderboardFields: LeaderboardEnabledMetadata[] = []; - fields.forEach((field) => { - const metadata = LeaderboardScanner.getLeaderboardField(constructor, field); + for (const field of fields) { + const metadata = getLeaderboardField(constructor, field); leaderboardFields.push(metadata); const key = `${constructorName}.${field}`; @@ -221,7 +221,7 @@ export abstract class LeaderboardService { } else { pipeline.zrevrank(key, id); } - }); + } const responses = await pipeline.exec(); diff --git a/apps/api/src/player/player.controller.ts b/apps/api/src/player/player.controller.ts index 1d47e9524..552b8c0df 100644 --- a/apps/api/src/player/player.controller.ts +++ b/apps/api/src/player/player.controller.ts @@ -15,7 +15,12 @@ import { } from "@nestjs/swagger"; import { Auth, AuthRole } from "#auth"; import { Body, Controller, Delete, Get, Post, Query } from "@nestjs/common"; -import { CachedPlayerDto, PlayerDto, PlayerGroupDto, UpdatePlayerDto } from "#dtos"; +import { + CachedPlayerDto, + PlayerDto, + PlayerGroupDto, + UpdatePlayerDto, +} from "#dtos"; import { DeletePlayerResponse, ErrorResponse, @@ -72,7 +77,7 @@ export class PlayerController { const deleted = await this.playerService.delete(player); return { - success: !!deleted, + success: deleted, }; } diff --git a/apps/api/src/player/player.service.ts b/apps/api/src/player/player.service.ts index d2ee45b35..0d5ad6218 100644 --- a/apps/api/src/player/player.service.ts +++ b/apps/api/src/player/player.service.ts @@ -6,21 +6,27 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type APIData, type Circular, type Flatten, flatten } from "@statsify/util"; import { - CacheLevel, - StatusNotFoundException, -} from "@statsify/api-client"; + type APIData, + type Circular, + type Flatten, + flatten, +} from "@statsify/util"; +import { CacheLevel, StatusNotFoundException } from "@statsify/api-client"; import { HypixelService } from "#hypixel"; -import { Inject, Injectable, NotFoundException, forwardRef } from "@nestjs/common"; -import { InjectModel } from "@m8a/nestjs-typegoose"; import { - Player, - deserialize, - serialize, -} from "@statsify/schemas"; + Inject, + Injectable, + NotFoundException, + forwardRef, +} from "@nestjs/common"; +import { InjectModel } from "@m8a/nestjs-typegoose"; +import { Player, deserialize, serialize } from "@statsify/schemas"; import { PlayerLeaderboardService } from "./leaderboards/player-leaderboard.service.js"; -import { PlayerSearchService, RedisPlayer } from "./search/player-search.service.js"; +import { + PlayerSearchService, + RedisPlayer, +} from "./search/player-search.service.js"; import type { ReturnModelType } from "@typegoose/typegoose"; type PlayerModel = ReturnModelType; @@ -55,7 +61,9 @@ export class PlayerService { return deserialize(Player, mongoPlayer); } - const player = await this.hypixelService.getPlayer(mongoPlayer?.uuid ?? tag); + const player = await this.hypixelService.getPlayer( + mongoPlayer?.uuid ?? tag + ); if (player) { player.expiresAt = Date.now() + 120_000; @@ -137,13 +145,20 @@ export class PlayerService { public async delete(tag: string) { const player = await this.findMongoDocument(tag, {}); - if (!player) return null; + if (!player) return false; await Promise.all([ this.playerModel.deleteOne({ uuid: player.uuid }).exec(), this.playerSearchService.delete(player.username), - this.playerLeaderboardService.addLeaderboards(Player, player, "uuid", true), + this.playerLeaderboardService.addLeaderboards( + Player, + player, + "uuid", + true + ), ]); + + return true; } public async saveOne(player: Player, registerAutocomplete: boolean) { @@ -155,7 +170,12 @@ export class PlayerService { this.playerModel .replaceOne({ uuid: player.uuid }, serializedPlayer, { upsert: true }) .exec(), - this.playerLeaderboardService.addLeaderboards(Player, flatPlayer, "uuid", false), + this.playerLeaderboardService.addLeaderboards( + Player, + flatPlayer, + "uuid", + false + ), ]; if (registerAutocomplete) diff --git a/apps/api/src/skin/skin.service.ts b/apps/api/src/skin/skin.service.ts index b96b85cd3..36ef51cd1 100644 --- a/apps/api/src/skin/skin.service.ts +++ b/apps/api/src/skin/skin.service.ts @@ -7,7 +7,7 @@ */ import { HttpService } from "@nestjs/axios"; -import { type Image } from "skia-canvas"; +import type { Image } from "skia-canvas"; import { InjectModel } from "@m8a/nestjs-typegoose"; import { Injectable, InternalServerErrorException } from "@nestjs/common"; import { PlayerNotFoundException } from "@statsify/api-client"; diff --git a/apps/api/src/user/user.service.ts b/apps/api/src/user/user.service.ts index f5d8cbe02..aca63eb5e 100644 --- a/apps/api/src/user/user.service.ts +++ b/apps/api/src/user/user.service.ts @@ -25,12 +25,12 @@ export class UserService { ) {} public get(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); return this.userModel.findOne().where(type).equals(tag).lean().exec(); } public update(idOrUuid: string, user: Partial): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); return this.userModel .findOneAndUpdate({ [type]: tag }, { $set: flatten(user) }) @@ -39,7 +39,7 @@ export class UserService { } public async getBadge(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel.findOne().where(type).equals(tag).lean().exec(); if (!user) throw new NotFoundException("user"); @@ -47,7 +47,7 @@ export class UserService { let badgePath: string | undefined = undefined; if (user.hasBadge && User.isGold(user)) { - badgePath = this.getBadgePath(user.id); + badgePath = getBadgePath(user.id); } else if (user.tier) { badgePath = getLogoPath(user); } else if (user.uuid) { @@ -60,7 +60,7 @@ export class UserService { } public async updateBadge(idOrUuid: string, badge: Buffer): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel.findOne().where(type).equals(tag).lean().exec(); if (!user) throw new NotFoundException("user"); @@ -72,11 +72,11 @@ export class UserService { .lean() .exec(); - await writeFile(this.getBadgePath(user.id), badge); + await writeFile(getBadgePath(user.id), badge); } public async deleteBadge(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel .findOneAndUpdate({ hasBadge: false }) @@ -87,13 +87,16 @@ export class UserService { if (!user) throw new NotFoundException("user"); - await rm(this.getBadgePath(user.id)); + await rm(getBadgePath(user.id)); } - public async verifyUser(uuidOrCode: string, id: string): Promise { + public async verifyUser( + uuidOrCode: string, + id: string, + ): Promise { const uuid = uuidOrCode.length >= 32 ? - uuidOrCode.replace(/-/g, "") : + uuidOrCode.replaceAll("-", "") : await this.getUuidFromCode(uuidOrCode); // Unverify anyone previously linked to this UUID @@ -116,13 +119,13 @@ export class UserService { } public async unverifyUser(idOrUuid: string): Promise { - const [tag, type] = this.parseTag(idOrUuid); + const [tag, type] = parseTag(idOrUuid); const user = await this.userModel .findOneAndUpdate( { [type]: tag }, { $unset: { uuid: "" }, unverifiedAt: Date.now() }, - { new: true } + { new: true }, ) .lean() .exec(); @@ -142,15 +145,13 @@ export class UserService { return verifyCode.uuid; } +} - private parseTag(tag: string): [tag: string, type: string] { - tag = tag.replaceAll("-", ""); - const type = tag.length >= 32 ? "uuid" : "id"; +const parseTag = (tag: string): [tag: string, type: string] => { + const normalizedTag = tag.replaceAll("-", ""); + const type = normalizedTag.length >= 32 ? "uuid" : "id"; - return [tag, type]; - } + return [normalizedTag, type]; +}; - private getBadgePath(id: string) { - return `${mediaRoute}/badges/${id}.png`; - } -} +const getBadgePath = (id: string) => `${mediaRoute}/badges/${id}.png`; diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/apps/discord-bot/eslint.config.js b/apps/discord-bot/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/apps/discord-bot/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/apps/discord-bot/package.json b/apps/discord-bot/package.json index e81f21f5b..7fb74f2e5 100644 --- a/apps/discord-bot/package.json +++ b/apps/discord-bot/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -20,7 +21,7 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "axios": "1.11.0", "discord-api-types": "^0.38.22", @@ -28,7 +29,7 @@ "luxon": "^3.5.0", "mongoose": "^8.5.2", "reflect-metadata": "^0.2.2", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "typedi": "^0.10.0" }, @@ -61,4 +62,4 @@ "default": "./dist/lib/*.js" } } -} \ No newline at end of file +} diff --git a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx index db404d1c4..0ef43ddd5 100644 --- a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx +++ b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type ArcadeModes, type Dropper, DropperMaps, MetadataScanner, type SubModeForMode } from "@statsify/schemas"; +import { type ArcadeModes, type Dropper, DropperMaps, type SubModeForMode, scanMetadata } from "@statsify/schemas"; import { Historical, If, Table } from "#components"; import { arrayGroup, formatRaceTime, formatTime } from "@statsify/util"; import type { LocalizeFunction } from "@statsify/discord"; @@ -46,7 +46,7 @@ export const DropperTable = ({ stats, submode, t, time }: DropperTableProps) => }; // This will return the leaderboard names for each dropper map, we only want the map names -const DROPPER_MAPS = MetadataScanner.scan(DropperMaps) +const DROPPER_MAPS = scanMetadata(DropperMaps) .filter(([key]) => key.endsWith(".bestTime")) .map(([key, metadata]) => [ key.replace(".bestTime", ""), diff --git a/apps/discord-bot/src/commands/base.hypixel-command.ts b/apps/discord-bot/src/commands/base.hypixel-command.ts index 5020e4ba6..3d32a4f2e 100644 --- a/apps/discord-bot/src/commands/base.hypixel-command.ts +++ b/apps/discord-bot/src/commands/base.hypixel-command.ts @@ -13,7 +13,7 @@ import { LocalizationString, LocalizeFunction, Page, - PaginateService, + paginate, PlayerArgument, SubPage, } from "@statsify/discord"; @@ -62,11 +62,9 @@ export interface BaseHypixelCommand { }) export abstract class BaseHypixelCommand { protected readonly apiService: ApiService; - protected readonly paginateService: PaginateService; public constructor(protected readonly modes: GameModes) { this.apiService = Container.get(ApiService); - this.paginateService = Container.get(PaginateService); } public async run(context: CommandContext) { @@ -159,7 +157,7 @@ export abstract class BaseHypixelCommand["api"], "overall">, MetadataEntry[]> = { - ARCADE: MetadataScanner.scan(ArcadeChallenges), - ARENA_BRAWL: MetadataScanner.scan(ArenaBrawlChallenges), - BEDWARS: MetadataScanner.scan(BedWarsChallenges), - BLITZSG: MetadataScanner.scan(BlitzSGChallenges), - BUILD_BATTLE: MetadataScanner.scan(BuildBattleChallenges), - COPS_AND_CRIMS: MetadataScanner.scan(CopsAndCrimsChallenges), - DUELS: MetadataScanner.scan(DuelsChallenges), - MEGAWALLS: MetadataScanner.scan(MegaWallsChallenges), - MURDER_MYSTERY: MetadataScanner.scan(MurderMysteryChallenges), - PAINTBALL: MetadataScanner.scan(PaintballChallenges), - QUAKE: MetadataScanner.scan(QuakeChallenges), - SKYWARS: MetadataScanner.scan(SkyWarsChallenges), - SMASH_HEROES: MetadataScanner.scan(SmashHeroesChallenges), - SPEED_UHC: MetadataScanner.scan(SpeedUHCChallenges), - TNT_GAMES: MetadataScanner.scan(TNTGamesChallenges), - TURBO_KART_RACERS: MetadataScanner.scan(TurboKartRacersChallenges), - UHC: MetadataScanner.scan(UHCChallenges), - VAMPIREZ: MetadataScanner.scan(VampireZChallenges), - WALLS: MetadataScanner.scan(WallsChallenges), - WARLORDS: MetadataScanner.scan(WarlordsChallenges), - WOOLGAMES: MetadataScanner.scan(WoolGamesChallenges), + ARCADE: scanMetadata(ArcadeChallenges), + ARENA_BRAWL: scanMetadata(ArenaBrawlChallenges), + BEDWARS: scanMetadata(BedWarsChallenges), + BLITZSG: scanMetadata(BlitzSGChallenges), + BUILD_BATTLE: scanMetadata(BuildBattleChallenges), + COPS_AND_CRIMS: scanMetadata(CopsAndCrimsChallenges), + DUELS: scanMetadata(DuelsChallenges), + MEGAWALLS: scanMetadata(MegaWallsChallenges), + MURDER_MYSTERY: scanMetadata(MurderMysteryChallenges), + PAINTBALL: scanMetadata(PaintballChallenges), + QUAKE: scanMetadata(QuakeChallenges), + SKYWARS: scanMetadata(SkyWarsChallenges), + SMASH_HEROES: scanMetadata(SmashHeroesChallenges), + SPEED_UHC: scanMetadata(SpeedUHCChallenges), + TNT_GAMES: scanMetadata(TNTGamesChallenges), + TURBO_KART_RACERS: scanMetadata(TurboKartRacersChallenges), + UHC: scanMetadata(UHCChallenges), + VAMPIREZ: scanMetadata(VampireZChallenges), + WALLS: scanMetadata(WallsChallenges), + WARLORDS: scanMetadata(WarlordsChallenges), + WOOLGAMES: scanMetadata(WoolGamesChallenges), }; const GameTable = ({ gameChallenges, mode, t }: GameTableProps) => { diff --git a/apps/discord-bot/src/commands/config/theme.command.tsx b/apps/discord-bot/src/commands/config/theme.command.tsx index b82730f68..59043bf3e 100644 --- a/apps/discord-bot/src/commands/config/theme.command.tsx +++ b/apps/discord-bot/src/commands/config/theme.command.tsx @@ -129,7 +129,7 @@ export class ThemeCommand { public message(context: CommandContext) { const message = convertColorCodes( context.option("message") - ).replace(/ยง\^\d\^/g, ""); + ).replaceAll(/ยง\^\d\^/g, ""); const length = removeFormatting(message).length; diff --git a/apps/discord-bot/src/commands/events/events.command.tsx b/apps/discord-bot/src/commands/events/events.command.tsx index 6f388cccc..a8af305f0 100644 --- a/apps/discord-bot/src/commands/events/events.command.tsx +++ b/apps/discord-bot/src/commands/events/events.command.tsx @@ -10,7 +10,7 @@ import { ApiService, Command, CommandContext, - PaginateService, + scrollingPagination, PlayerArgument, } from "@statsify/discord"; import { EVENT_TYPES, GENERAL_MODES } from "@statsify/schemas"; @@ -23,10 +23,7 @@ import { render } from "@statsify/rendering"; @Command({ description: (t) => t("commands.events"), args: [PlayerArgument] }) export class EventsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const user = context.getUser(); @@ -40,7 +37,7 @@ export class EventsCommand { this.apiService.getUserBadge(player.uuid), ]); - return this.paginateService.scrollingPagination( + return scrollingPagination( context, arrayGroup(EVENT_TYPES, 4).map((events) => async () => { const background = await getBackground( diff --git a/apps/discord-bot/src/commands/gamecounts.command.ts b/apps/discord-bot/src/commands/gamecounts.command.ts index e6dc06ab0..d72a13965 100644 --- a/apps/discord-bot/src/commands/gamecounts.command.ts +++ b/apps/discord-bot/src/commands/gamecounts.command.ts @@ -12,7 +12,7 @@ import { CommandContext, EmbedBuilder, Page, - PaginateService, + paginate, } from "@statsify/discord"; import { FormattedGame, GameId, GamePlayers } from "@statsify/schemas"; import { STATUS_COLORS } from "@statsify/logger"; @@ -23,10 +23,7 @@ import { removeFormatting } from "@statsify/util"; description: (t) => t("commands.game-counts"), }) export class GameCountsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const t = context.t(); @@ -87,7 +84,7 @@ export class GameCountsCommand { ...subGameGenerators, ]; - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } private formatGameCount(name: string, count: string, emoji?: string) { diff --git a/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx b/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx index 5c1fe41ca..0a4a08d2b 100644 --- a/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx +++ b/apps/discord-bot/src/commands/gtbhelper/gtbhelpber.command.tsx @@ -18,7 +18,7 @@ export class GTBHelperCommand { const hint = context.option("hint"); const words = findSolutions(hint); - if (!words.length) { + if (words.length === 0) { throw new ErrorMessage( (t) => t("errors.noGTBSolutions.title"), (t) => t("errors.noGTBSolutions.description") @@ -31,9 +31,9 @@ export class GTBHelperCommand { const groups = arrayGroup(words, Math.ceil(words.length / 3)); - groups.forEach((solutions) => - embed.field("\u200b", solutions.map((s) => `\`โ€ข\` ${s}`).join("\n"), true) - ); + for (const solutions of groups) { + embed.field("\u200b", solutions.map((s) => `\`โ€ข\` ${s}`).join("\n"), true); + } return { embeds: [embed] }; } diff --git a/apps/discord-bot/src/commands/guild/guild-list.profile.tsx b/apps/discord-bot/src/commands/guild/guild-list.profile.tsx index 3e8574ceb..011812b8d 100644 --- a/apps/discord-bot/src/commands/guild/guild-list.profile.tsx +++ b/apps/discord-bot/src/commands/guild/guild-list.profile.tsx @@ -39,10 +39,10 @@ export const GuildListProfile = ({ // Hypixel does not always return all the ranks in `guild.ranks` so a special rank map is needed const rankMap: Record = {}; - guild.members.forEach((member) => { + for (const member of guild.members) { rankMap[member.rank] = rankMap[member.rank] ?? []; rankMap[member.rank].push(member.displayName ?? "ERROR"); - }); + } // A map of the all the ranks in the guild const guildRankMap = guild.ranks.reduce((acc, rank) => { diff --git a/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx b/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx index 7f11d5231..0a6056772 100644 --- a/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx +++ b/apps/discord-bot/src/commands/guild/guild-top.subcommand.tsx @@ -80,14 +80,14 @@ export class GuildTopSubCommand extends GuildLeaderboardSubCommand { const dropdown = new SelectMenuBuilder(); - modes.forEach(([key, title], index) => + for (const [index, [key, title]] of modes.entries()) { dropdown.option( new SelectMenuOptionBuilder() .label(title) .value(`${key}`) .default(index === 0) - ) - ); + ); + } const components = [new ActionRowBuilder().component(dropdown)]; @@ -146,7 +146,7 @@ export class GuildTopSubCommand extends GuildLeaderboardSubCommand { dropdown.getCustomId(), changePage((interaction) => { const value = interaction.getData().values[0] as GuildTopKey; - return { modeIndex: modes.findIndex((m) => m[0] == value) }; + return { modeIndex: modes.findIndex((m) => m[0] === value) }; }) ); diff --git a/apps/discord-bot/src/commands/guild/guild.command.tsx b/apps/discord-bot/src/commands/guild/guild.command.tsx index 119fd19c0..fa6b39fed 100644 --- a/apps/discord-bot/src/commands/guild/guild.command.tsx +++ b/apps/discord-bot/src/commands/guild/guild.command.tsx @@ -13,7 +13,7 @@ import { ErrorMessage, GuildArgument, IMessage, - PaginateService, + paginate, PlayerArgument, SubCommand, } from "@statsify/discord"; @@ -29,10 +29,7 @@ import { render } from "@statsify/rendering"; @Command({ description: (t) => t("commands.guild") }) export class GuildCommand extends GuildTopSubCommand { - public constructor( - protected readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) { + public constructor(protected readonly apiService: ApiService,) { super(apiService); } @@ -69,7 +66,7 @@ export class GuildCommand extends GuildTopSubCommand { gameIcons, }; - return this.paginateService.paginate(context, [ + return paginate(context, [ { label: "Overall", generator: () => diff --git a/apps/discord-bot/src/commands/historical/session.command.tsx b/apps/discord-bot/src/commands/historical/session.command.tsx index c4e23aaaa..9d69cbd76 100644 --- a/apps/discord-bot/src/commands/historical/session.command.tsx +++ b/apps/discord-bot/src/commands/historical/session.command.tsx @@ -44,7 +44,7 @@ import { CommandContext, EmbedBuilder, Page, - PaginateService, + paginate, PlayerArgument, SubCommand, SubPage, @@ -88,10 +88,7 @@ import type { HistoricalTimeData } from "#components"; @Command({ description: "session stats" }) export class SessionCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ description: (t) => t("commands.session-arcade"), args: [PlayerArgument] }) public arcade(context: CommandContext) { @@ -478,6 +475,6 @@ export class SessionCommand { }; }); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } } diff --git a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts index 4ad5179ae..bdcf57ed7 100644 --- a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts +++ b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.argument.ts @@ -12,10 +12,10 @@ import { ApplicationCommandOptionType, } from "discord-api-types/v10"; import { AbstractArgument, CommandContext, LocalizationString } from "@statsify/discord"; -import { Guild, LeaderboardScanner } from "@statsify/schemas"; +import { Guild, getLeaderboardFields } from "@statsify/schemas"; import { removeFormatting } from "@statsify/util"; -const list = LeaderboardScanner.getLeaderboardFields(Guild).map( +const list = getLeaderboardFields(Guild).map( ([key, { leaderboard }]) => ({ value: key, name: removeFormatting(leaderboard.name), diff --git a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts index 8feccd180..b45f58c4e 100644 --- a/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts +++ b/apps/discord-bot/src/commands/leaderboards/guild-leaderboard.subcommand.ts @@ -25,7 +25,7 @@ export class GuildLeaderboardSubCommand extends BaseLeaderboardCommand { public async leaderboard(context: CommandContext) { const leaderboard = context.option("leaderboard"); - const field = leaderboard.replace(/ /g, "."); + const field = leaderboard.replaceAll(' ', "."); const background = await getBackground("hypixel", "overall"); return this.createLeaderboard({ diff --git a/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts b/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts index a6c2e730e..789608b36 100644 --- a/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts +++ b/apps/discord-bot/src/commands/leaderboards/player-leaderboard.argument.ts @@ -14,9 +14,9 @@ import { import { AbstractArgument, CommandContext, LocalizationString } from "@statsify/discord"; import { ClassMetadata, - LeaderboardScanner, METADATA_KEY, PlayerStats, + getLeaderboardFields, } from "@statsify/schemas"; import { removeFormatting } from "@statsify/util"; @@ -34,13 +34,14 @@ const FUSE_OPTIONS = { }; const fields = entries.reduce((acc, [prefix, value]) => { - const list = LeaderboardScanner.getLeaderboardFields(value.type.type).map( + const list = getLeaderboardFields(value.type.type).map( ([key, { leaderboard }]) => ({ value: key, name: removeFormatting(leaderboard.name) }) ); const fuse = new Fuse(list, FUSE_OPTIONS); + acc[prefix as keyof PlayerStats] = [fuse, list]; - return { ...acc, [prefix]: [fuse, list] }; + return acc; }, {} as Record, APIApplicationCommandOptionChoice[]]>); export class PlayerLeaderboardArgument extends AbstractArgument { diff --git a/apps/discord-bot/src/commands/minecraft/cape.command.ts b/apps/discord-bot/src/commands/minecraft/cape.command.ts index 52204e542..501e9ca71 100644 --- a/apps/discord-bot/src/commands/minecraft/cape.command.ts +++ b/apps/discord-bot/src/commands/minecraft/cape.command.ts @@ -12,7 +12,7 @@ import { CommandContext, ErrorMessage, MojangPlayerArgument, - PaginateService, + paginate } from "@statsify/discord"; import { Image, loadImage } from "skia-canvas"; import { createCanvas } from "@statsify/rendering"; @@ -20,10 +20,7 @@ import type { Skin } from "@statsify/schemas"; @Command({ description: (t) => t("commands.cape"), args: [MojangPlayerArgument] }) export class CapeCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const user = context.getUser(); @@ -45,13 +42,13 @@ export class CapeCommand { generator: () => this.renderCape(c.image as Image), })); - if (!pages.length) + if (pages.length === 0) return new ErrorMessage( (t) => t("errors.noCape.title"), (t) => t("errors.noCape.description", { username: player.username }) ); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } private async getOptifineCape(username: string) { diff --git a/apps/discord-bot/src/commands/minecraft/colors.command.ts b/apps/discord-bot/src/commands/minecraft/colors.command.ts index c7fdb6836..c8bf5de6a 100644 --- a/apps/discord-bot/src/commands/minecraft/colors.command.ts +++ b/apps/discord-bot/src/commands/minecraft/colors.command.ts @@ -21,11 +21,11 @@ export class ColorsCommand { "embeds.colors.shadowHex" )}**\n`; - minecraftColors.forEach((color) => { + for (const color of minecraftColors) { desc += `${t(`emojis:colors.${[color.code.slice(1)]}`)} \`${color.code}\` โ€ข \`${ color.hex }\` โ€ข \`${mcShadow(color.hex)}\`\n`; - }); + } desc += "\n"; desc += `${t("emojis:colors.k")} \`ยงk\` โ€ข ${t("embeds.colors.obfuscated")}\n`; diff --git a/apps/discord-bot/src/commands/minecraft/server/server.argument.ts b/apps/discord-bot/src/commands/minecraft/server/server.argument.ts index 62ad196b9..7aec94027 100644 --- a/apps/discord-bot/src/commands/minecraft/server/server.argument.ts +++ b/apps/discord-bot/src/commands/minecraft/server/server.argument.ts @@ -38,6 +38,8 @@ export class ServerArgument extends AbstractArgument { threshold: 0.3, ignoreLocation: true, }); + + return undefined; }); } diff --git a/apps/discord-bot/src/commands/minecraft/server/server.command.tsx b/apps/discord-bot/src/commands/minecraft/server/server.command.tsx index e33ef3743..af4fca612 100644 --- a/apps/discord-bot/src/commands/minecraft/server/server.command.tsx +++ b/apps/discord-bot/src/commands/minecraft/server/server.command.tsx @@ -30,6 +30,7 @@ export class ServerCommand { getServerMappings().then((mappings) => { this.mappings = mappings; + return undefined; }); } diff --git a/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx b/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx index 525bd366f..92d4a1756 100644 --- a/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx +++ b/apps/discord-bot/src/commands/minecraft/server/server.profile.tsx @@ -49,7 +49,7 @@ export const ServerProfile = ({ >
- {server.motd.raw.map((m) => m.replace(/\s{2,}/g, "")).join("\n")} + {server.motd.raw.map((m) => m.replaceAll(/\s{2,}/g, "")).join("\n")}
diff --git a/apps/discord-bot/src/commands/quests/quests.command.tsx b/apps/discord-bot/src/commands/quests/quests.command.tsx index 9dc277bc1..3d640798d 100644 --- a/apps/discord-bot/src/commands/quests/quests.command.tsx +++ b/apps/discord-bot/src/commands/quests/quests.command.tsx @@ -11,7 +11,7 @@ import { Command, CommandContext, Page, - PaginateService, + paginate, PlayerArgument, SubCommand, } from "@statsify/discord"; @@ -26,10 +26,7 @@ import { render } from "@statsify/rendering"; export class QuestsCommand { private readonly modes = QUEST_MODES; - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ description: (t) => t("commands.quests-overall"), @@ -85,7 +82,7 @@ export class QuestsCommand { let modes = this.modes.getModes(); // Currently only SkyWars has a monthly quest so it is useless to show other modes - if (time == QuestTime.Monthly) { + if (time === QuestTime.Monthly) { // Filter for objects with more than 1 field (the total field) modes = modes.filter((mode) => mode.api === "overall" || Object.entries(quests.monthly[mode.api]).length > 1); } @@ -115,6 +112,6 @@ export class QuestsCommand { }, })); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } } diff --git a/apps/discord-bot/src/commands/quests/quests.profile.tsx b/apps/discord-bot/src/commands/quests/quests.profile.tsx index a94762f72..961f59484 100644 --- a/apps/discord-bot/src/commands/quests/quests.profile.tsx +++ b/apps/discord-bot/src/commands/quests/quests.profile.tsx @@ -16,13 +16,13 @@ import { GameQuests, GenericQuestInstance, METADATA_KEY, - MetadataScanner, OverallQuests, QuestModes, QuestTime, User, UserPalette, WeeklyQuests, + scanMetadata, } from "@statsify/schemas"; import { Container, @@ -49,7 +49,7 @@ function getQuestMetadata(constructor: Constructor) { const metadata = entries.map(([key, data]) => [ key, - Object.fromEntries(MetadataScanner.scan(data.type.type)), + Object.fromEntries(scanMetadata(data.type.type)), ]); return Object.fromEntries(metadata); diff --git a/apps/discord-bot/src/commands/rankings/rankings.command.tsx b/apps/discord-bot/src/commands/rankings/rankings.command.tsx index 2aa88ac6f..15966236e 100644 --- a/apps/discord-bot/src/commands/rankings/rankings.command.tsx +++ b/apps/discord-bot/src/commands/rankings/rankings.command.tsx @@ -17,7 +17,6 @@ import { DUELS_MODES, GENERAL_MODES, GameModes, - LeaderboardScanner, MEGAWALLS_MODES, MURDER_MYSTERY_MODES, PAINTBALL_MODES, @@ -38,6 +37,7 @@ import { WALLS_MODES, WARLORDS_MODES, WOOLGAMES_MODES, + getLeaderboardFields, } from "@statsify/schemas"; import { ApiService, @@ -46,7 +46,7 @@ import { Command, CommandContext, ErrorMessage, - PaginateService, + scrollingPagination, PlayerArgument, SubCommand, type SubCommandOptions, @@ -60,7 +60,7 @@ import { getBackground, getLogo } from "@statsify/assets"; import { getTheme } from "#themes"; import { render } from "@statsify/rendering"; -const fields = LeaderboardScanner.getLeaderboardFields(Player).map(([key]) => key); +const fields = getLeaderboardFields(Player).map(([key]) => key); const choices = games.map((g) => [g.name, g.key] as Choice); choices.unshift(["All", "all"]); @@ -77,10 +77,7 @@ const options: Partial = { preview: "rankings.png", }) export class RankingsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ ...options, @@ -322,7 +319,7 @@ export class RankingsCommand { const rankings = await this.apiService.getPlayerRankings(filteredFields, player.uuid); - if (!rankings.length) + if (rankings.length === 0) throw new ErrorMessage( (t) => t("errors.noRankings.title"), (t) => @@ -347,7 +344,7 @@ export class RankingsCommand { games.find((g) => g.key === game)?.formatted : undefined; - return this.paginateService.scrollingPagination( + return scrollingPagination( context, groups.map( (group) => () => diff --git a/apps/discord-bot/src/commands/ratios/ratios.command.tsx b/apps/discord-bot/src/commands/ratios/ratios.command.tsx index bdd522891..854c04db9 100644 --- a/apps/discord-bot/src/commands/ratios/ratios.command.tsx +++ b/apps/discord-bot/src/commands/ratios/ratios.command.tsx @@ -39,7 +39,7 @@ import { Command, CommandContext, Page, - PaginateService, + paginate, PlayerArgument, SubCommand, } from "@statsify/discord"; @@ -59,10 +59,7 @@ const args = [PlayerArgument]; @Command({ description: (t) => t("commands.ratios") }) export class RatiosCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} @SubCommand({ description: (t) => t("commands.ratios-arcade"), args }) public arcade(context: CommandContext) { @@ -244,11 +241,11 @@ export class RatiosCommand { }, })); - return this.paginateService.paginate(context, pages); + return paginate(context, pages); } private getModeStats(game: PlayerStats[keyof PlayerStats], mode: GameModeWithSubModes) { - if (mode.submodes.length !== 0) { + if (mode.submodes.length > 0) { let stats = game[mode.api as keyof typeof game]; stats = stats[mode.submodes[0].api as keyof typeof game]; return mode.submodes[0].api === "overall" ? stats || game : stats; @@ -289,7 +286,7 @@ export class RatiosCommand { return numeratorType === Number && denominatorType === Number; }); - if (!ratios.length) continue; + if (ratios.length === 0) continue; ratioModes.push([mode, ratios]); } diff --git a/apps/discord-bot/src/components/Header/Header.tsx b/apps/discord-bot/src/components/Header/Header.tsx index cf07c8570..86e14b43c 100644 --- a/apps/discord-bot/src/components/Header/Header.tsx +++ b/apps/discord-bot/src/components/Header/Header.tsx @@ -53,7 +53,7 @@ export const Header = (props: HeaderProps) => { const sidebar = "sidebar" in props && - props.sidebar.length && + props.sidebar.length > 0 && (props.time === "LIVE" ? true : props.historicalSidebar) ? : <>; diff --git a/apps/discord-bot/src/components/List.tsx b/apps/discord-bot/src/components/List.tsx index 947132ff1..a20b4adc3 100644 --- a/apps/discord-bot/src/components/List.tsx +++ b/apps/discord-bot/src/components/List.tsx @@ -16,14 +16,14 @@ export const List = ({ width = "100%", items }: ListProps) => { const remainingColumns: number[] = []; for (const [i, item] of items.entries()) { - (item as unknown as JSX.Element[]).forEach((child, index) => { + for (const [index, child] of (item as unknown as JSX.Element[]).entries()) { if (i === 0 && child.x.size === "remaining") remainingColumns.push(index); child.x.size = "100%"; if (columns[index]) columns[index].push(child); else columns[index] = [child]; - }); + } } return ( diff --git a/apps/discord-bot/src/index.ts b/apps/discord-bot/src/index.ts index d899f2006..49f54df9f 100644 --- a/apps/discord-bot/src/index.ts +++ b/apps/discord-bot/src/index.ts @@ -8,7 +8,7 @@ import * as Sentry from "@sentry/node"; import { CommandListener } from "#lib/command.listener"; -import { CommandLoader, CommandPoster, I18nLoaderService } from "@statsify/discord"; +import { CommandPoster, I18nLoaderService, loadCommands } from "@statsify/discord"; import { Container } from "typedi"; import { FontLoaderService } from "#services"; import { InteractionServer, RestClient, WebsocketShard } from "tiny-discord"; @@ -18,7 +18,7 @@ import { config } from "@statsify/util"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; const logger = new Logger("discord-bot"); const handleError = logger.error.bind(logger); @@ -45,7 +45,7 @@ await Promise.all( const rest = new RestClient({ token: await config("discordBot.token"), timeout: 60 * 1000 }); Container.set(RestClient, rest); -const commands = await CommandLoader.load(join(__dirname, "./commands")); +const commands = await loadCommands(join(directory, "./commands")); const poster = Container.get(CommandPoster); diff --git a/apps/discord-bot/src/lib/command.listener.ts b/apps/discord-bot/src/lib/command.listener.ts index b75a71e1a..d42bbf4f6 100644 --- a/apps/discord-bot/src/lib/command.listener.ts +++ b/apps/discord-bot/src/lib/command.listener.ts @@ -127,8 +127,7 @@ export class CommandListener extends AbstractCommandListener { const newCooldown = now + command.cooldown * 1000 * reduction; if (!cooldownForCommand) { - const cooldownForCommand = new Map(); - cooldownForCommand.set(userId, newCooldown); + const cooldownForCommand = new Map([[userId, newCooldown]]); this.cooldowns.set(command.name, cooldownForCommand); return; @@ -168,7 +167,7 @@ export class CommandListener extends AbstractCommandListener { (t) => !t.disabled?.includes(commandName) && !t.uneligible?.(user) ); - if (!useableTips.length) return undefined; + if (useableTips.length === 0) return undefined; const tip = useableTips[Math.floor(Math.random() * useableTips.length)]; return tip.message; diff --git a/apps/discord-bot/src/lib/convert-color-codes.ts b/apps/discord-bot/src/lib/convert-color-codes.ts index 46cc58f35..42cc5ec74 100644 --- a/apps/discord-bot/src/lib/convert-color-codes.ts +++ b/apps/discord-bot/src/lib/convert-color-codes.ts @@ -8,6 +8,6 @@ export const convertColorCodes = (content: string) => content .replaceAll(String.raw`\&`, "๓ฐ€€") - .replace(/&\S/g, (m) => m.replace("&", "ยง")) + .replaceAll(/&\S/g, (m) => m.replace("&", "ยง")) .replaceAll("๓ฐ€€", "&"); diff --git a/apps/discord-bot/tsconfig.json b/apps/discord-bot/tsconfig.json index 10c536c56..558014558 100644 --- a/apps/discord-bot/tsconfig.json +++ b/apps/discord-bot/tsconfig.json @@ -1,11 +1,7 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "jsx": "preserve", - "baseUrl": "./src", + "jsx": "preserve" }, - "include": [ - "src", - "eslint.config.js" - ] -} \ No newline at end of file + "include": ["src"] +} diff --git a/apps/scripts/eslint.config.js b/apps/scripts/eslint.config.js deleted file mode 100644 index 8e6c07b81..000000000 --- a/apps/scripts/eslint.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import globals from "globals"; -import { defineConfig } from "../../eslint.config.js"; - -export default [ - { languageOptions: { globals: globals.node } }, - ...defineConfig({ tsconfigDirName: import.meta.dirname }), -]; diff --git a/apps/scripts/package.json b/apps/scripts/package.json index d883f2577..8315ef054 100644 --- a/apps/scripts/package.json +++ b/apps/scripts/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "scripts": { - "lint": "eslint", + "lint": "oxlint", + "lint:ci": "oxlint --format=github", "api-key": "node src/api-key.js", "delete-sessions": "node src/delete-sessions.js", "limit-redis": "node src/limit-redis.js", @@ -20,19 +21,17 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/core": "^1.13.5", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "chalk": "^5.6.0", "discord-bot": "workspace:^", "inquirer": "^10.1.8", "ioredis": "^5.7.0", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "toad-scheduler": "^3.0.1", "zod": "^4.1.5" }, "devDependencies": { - "@types/inquirer": "^9.0.7", - "globals": "^16.3.0" + "@types/inquirer": "^9.0.7" } -} \ No newline at end of file +} diff --git a/apps/scripts/src/api-key.js b/apps/scripts/src/api-key.js index 12f6ae367..e9bf2f39c 100644 --- a/apps/scripts/src/api-key.js +++ b/apps/scripts/src/api-key.js @@ -50,9 +50,9 @@ const getKeys = async () => { const pipeline = redis.pipeline(); - keys.forEach((key) => { + for (const key of keys) { pipeline.hgetall(key); - }); + } const keyValues = await pipeline.exec(); @@ -104,7 +104,7 @@ const keyManager = async () => { const availableMethods = ["create"]; - if ((await getKeyNames()).length) availableMethods.push("delete", "edit", "list"); + if ((await getKeyNames()).length > 0) availableMethods.push("delete", "edit", "list"); const { method } = await inquirer.prompt([ { @@ -194,6 +194,7 @@ const deleteKey = async () => { let currentKey = activeKeys[key]; if (currentKey.name === deletedKey) { + // oxlint-disable-next-line no-await-in-loop await redis.del(`key:${key}`); inquirerLogger( "Deleted Key!", @@ -263,4 +264,4 @@ const editKey = async () => { await redis.hset(`key:${currentHash}`, field, Object.values(newValue)[0]); }; -keyManager(); +await keyManager(); diff --git a/apps/scripts/src/limit-redis.js b/apps/scripts/src/limit-redis.js index ffe35f1df..6919d3212 100644 --- a/apps/scripts/src/limit-redis.js +++ b/apps/scripts/src/limit-redis.js @@ -8,7 +8,7 @@ import Redis from "ioredis"; import { CurrentHistoricalType } from "@statsify/api-client"; -import { Guild, MetadataScanner, Player } from "@statsify/schemas"; +import { Guild, scanMetadata, Player } from "@statsify/schemas"; import { Logger } from "@statsify/logger"; import { SimpleIntervalJob, Task } from "toad-scheduler"; @@ -16,19 +16,20 @@ const logger = new Logger("Redis Limiter"); const redis = new Redis(process.env.REDIS_URL); const runLimit = async (constructors, prefixes) => { - constructors.forEach(async (constructor, i) => { + for (const [i, constructor] of constructors.entries()) { const oldLeaderboardPipeline = redis.pipeline(); const limitLeaderboardPipeline = redis.pipeline(); const name = constructor.name.toLowerCase(); - const fields = MetadataScanner.scan(constructor); + const fields = scanMetadata(constructor); - fields.forEach(([key, value]) => { + for (const [key, value] of fields) { const path = prefixes ? `${prefixes[i]}:${name}.${key}` : `${name}.${key}`; if (!value.leaderboard.enabled || (prefixes ? !value.historical.enabled : false)) oldLeaderboardPipeline.del(path); - }); + } + // oxlint-disable-next-line no-await-in-loop await oldLeaderboardPipeline.exec(); const leaderboards = prefixes ? @@ -37,11 +38,11 @@ const runLimit = async (constructors, prefixes) => { let memberCount = 0; - leaderboards.forEach(([key, value]) => { + for (const [key, value] of leaderboards) { const path = `${name}.${key}`; const { sort } = value.leaderboard; let { limit } = value.leaderboard; - if (limit === Number.POSITIVE_INFINITY) return; + if (limit === Number.POSITIVE_INFINITY) continue; // Reduce historical leaderboard max size if (prefixes) limit = Math.floor(limit / 10); @@ -53,8 +54,9 @@ const runLimit = async (constructors, prefixes) => { } else { limitLeaderboardPipeline.zremrangebyrank(path, limit, -1); } - }); + } + // oxlint-disable-next-line no-await-in-loop await limitLeaderboardPipeline.exec(); logger.log(`Limited ${leaderboards.length} ${name} leaderboards`); @@ -63,8 +65,8 @@ const runLimit = async (constructors, prefixes) => { prefixes ? prefixes[i].toLowerCase() : "lifetime" } ${name} leaderboards` ); - }); -}; + } +} const limit = async () => { await Promise.all([ diff --git a/apps/scripts/src/purge.js b/apps/scripts/src/purge.js index c95bd6e4e..caa6bfa4d 100644 --- a/apps/scripts/src/purge.js +++ b/apps/scripts/src/purge.js @@ -9,13 +9,11 @@ import inquirer from "inquirer"; import { ROOT, fetchWorkspaces, inquirerConfirmation, inquirerLogger } from "./utils.js"; import { exec as _exec } from "node:child_process"; -import { dirname, join, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join, resolve } from "node:path"; import { promisify } from "node:util"; import { rm } from "node:fs/promises"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +const dirname = import.meta.dirname; /** * @@ -25,7 +23,7 @@ const exec = (script) => promisify(_exec)(script, { shell: true, stdio: "inherit", - cwd: resolve(__dirname, "../../../"), + cwd: resolve(dirname, "../../../"), }); const workspaces = [ @@ -124,4 +122,4 @@ const purge = async () => { process.exit(0); }; -purge(); +await purge(); diff --git a/apps/scripts/src/rank-emojis.js b/apps/scripts/src/rank-emojis.js index 79b8707b4..5147fc6c7 100644 --- a/apps/scripts/src/rank-emojis.js +++ b/apps/scripts/src/rank-emojis.js @@ -79,14 +79,12 @@ const drawRank = async (formatted) => { renderer.fillText(textCtx, nodes, 0, 0); const imageCount = Math.ceil(width / SIZE); - const images = []; - - for (let x = 0; x < imageCount; x++) { + const images = await Promise.all(Array.from({ length: imageCount }).map((_, x) => { const canvas = createCanvas(SIZE, SIZE); const ctx = canvas.getContext("2d"); ctx.drawImage(textCanvas, SIZE * x, 0, SIZE, SIZE, 0, 0, SIZE, SIZE); - images.push(await canvas.toDataURL("png")); - } + return canvas.toDataURL("png"); + })); return images; }; @@ -116,7 +114,7 @@ const drawColorChanger = async (rank, prefixIndex) => { )), ]; - Object.entries(sharedImages).forEach(([index, image]) => { + for (const [index, image] of Object.entries(sharedImages).entries()) { emojis.push({ buffer: image, rank, @@ -124,9 +122,9 @@ const drawColorChanger = async (rank, prefixIndex) => { index, name: `${prefixIndex}${index}`, }); - }); + } - coloredEmojis.forEach(async (images, index) => { + for (const [index, images] of coloredEmojis) { const color = minecraftColors[index]; for (const [i, image] of images.entries()) { @@ -140,7 +138,7 @@ const drawColorChanger = async (rank, prefixIndex) => { name: `${prefixIndex}${color.code[1]}${i}`, }); } - }); + } }; /** @@ -151,9 +149,9 @@ const drawColorChanger = async (rank, prefixIndex) => { const drawNonColorChanger = async (rank, prefixIndex) => { const images = await drawRank(rankMap[rank]()); - images.forEach((image, index) => { + for (const [index, image] of images.entries()) { emojis.push({ buffer: image, rank, index, name: `${prefixIndex}${index}` }); - }); + } }; // Create all the emojis @@ -175,13 +173,16 @@ const json = {}; const client = new RestClient({ token }); +// For ratelimiting purposes it is better to run these requests serially for (let i = 0; i < serverCount; i++) { + // oxlint-disable-next-line no-await-in-loop const guild = await client .post("/guilds", { name: `Statsify Ranks ${i + 1}` }) .then((res) => res.body.json); const channel = guild.system_channel_id; + // oxlint-disable-next-line no-await-in-loop const invite = await client .post(`/channels/${channel}/invites`, { type: 1 }) .then((res) => res.body.json); @@ -194,6 +195,7 @@ for (let i = 0; i < serverCount; i++) { const emoji = emojis[index]; + // oxlint-disable-next-line no-await-in-loop const emojiResolved = await client .post(`/guilds/${guild.id}/emojis`, { name: emoji.name, @@ -217,12 +219,12 @@ for (let i = 0; i < serverCount; i++) { } } -RANKS.filter((rank) => !COLOR_CHANGERS.includes(rank)).forEach((rank) => { +for (const rank of RANKS.filter((rank) => !COLOR_CHANGERS.includes(rank))) { json[rank] = json[rank].join(""); -}); +} -COLOR_CHANGERS.forEach((rank) => { - minecraftColors.forEach((color) => { +for (const rank of COLOR_CHANGERS) { + for (const color of minecraftColors) { const body = { ...json[rank]["SHARED"], ...json[rank][color.id], @@ -233,10 +235,10 @@ COLOR_CHANGERS.forEach((rank) => { .map((key) => body[key]) .filter(Boolean) .join(""); - }); + } - // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + // oxlint-disable-next-line no-dynamic-delete delete json[rank]; -}); +} writeFileSync("../discord-bot/emojis.json", JSON.stringify(json, null, 2)); diff --git a/apps/scripts/src/timestamp.js b/apps/scripts/src/timestamp.js index 7c337d73c..f0c419016 100644 --- a/apps/scripts/src/timestamp.js +++ b/apps/scripts/src/timestamp.js @@ -70,25 +70,28 @@ const setTimestamps = async (collectionName) => { const bulkOperations = []; - players.forEach((pm) => { - const nextReset = getNextResetTime(pm.resetMinute, collectionName); - const lastReset = getLastResetTime(pm.resetMinute, collectionName); + for (const player of players) { + const nextReset = getNextResetTime(player.resetMinute, collectionName); + const lastReset = getLastResetTime(player.resetMinute, collectionName); bulkOperations.push({ updateOne: { - filter: { _id: pm._id }, + // mongodb object id's have a leading underscore + // oxlint-disable-next-line no-underscore-dangle + filter: { _id: player._id }, update: { $set: { nextReset, lastReset } }, }, }); - }); + } - if (!bulkOperations.length) + if (bulkOperations.length === 0) return console.log(`No players to update for ${collectionName}.`); - collection.bulkWrite(bulkOperations).then((res) => { - console.log( - `Updated ${res.modifiedCount}/${players.length} players for ${collectionName}.` - ); - }); + + const repsonse = await collection.bulkWrite(bulkOperations); + + console.log( + `Updated ${repsonse.modifiedCount}/${players.length} players for ${collectionName}.` + ); }; await setTimestamps("daily"); diff --git a/apps/scripts/src/validate-commands.js b/apps/scripts/src/validate-commands.js index 21ff23bc1..19d7c097c 100644 --- a/apps/scripts/src/validate-commands.js +++ b/apps/scripts/src/validate-commands.js @@ -52,20 +52,22 @@ const commandSchema = z.object({ type: z.optional(toEnum(1, 2, 3)), }); -Object.entries(commands.commands).forEach(([commandName, command]) => { +for (const [commandName, command] of Object.entries(commands.commands)) { try { commandSchema.parse(command); } catch (e) { console.error(e); console.log(command); - e.errors.forEach((e) => { - console.error(e.message); - console.error(`${command.name}.${e.path.join(".")}`); - }); + + for (const error of e.errors) { + console.error(error.message); + console.error(`${command.name}.${error.path.join(".")}`); + } + console.error(`Command "${commandName}" is invalid.`); process.exit(1); } -}); +} const commandChars = {}; diff --git a/apps/scripts/tsconfig.json b/apps/scripts/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/apps/scripts/tsconfig.json +++ b/apps/scripts/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/apps/site/.oxlintrc.jsonc b/apps/site/.oxlintrc.jsonc new file mode 100644 index 000000000..6d2bfedd8 --- /dev/null +++ b/apps/site/.oxlintrc.jsonc @@ -0,0 +1,72 @@ +{ + "$schema": "../../node_modules/oxlint/configuration_schema.json", + "extends": ["../../.oxlintrc.jsonc"], + "plugins": [ + "eslint", + "typescript", + "unicorn", + "oxc", + "import", + "node", + "promise", + "vitest", + "react", + "react-perf", + "jsx-a11y", + "nextjs", + ], + "rules": { + // React + "react/no-unstable-nested-components": "error", + "react/jsx-no-script-url": "error", + "react/jsx-no-comment-textnodes": "error", + "react/iframe-missing-sandbox": "error", + "react/no-unknown-property": "error", + "react/no-clone-element": "error", + "react/button-has-type": "error", + "react/no-object-type-as-default-prop": "error", + "react/jsx-no-constructed-context-values": "error", + "react/void-dom-elements-no-children": "error", + "react/no-children-prop": "error", + "react/jsx-key": "error", + "react/exhaustive-deps": "error", + "react/jsx-no-target-blank": "error", + "react/checked-requires-onchange-or-readonly": "error", + "react/jsx-no-useless-fragment": "error", + "react/no-unescaped-entities": "error", + "react/rules-of-hooks": "error", + + // Jsx A11y + "jsx-a11y/anchor-ambiguous-text": "error", + "jsx-a11y/tabindex-no-positive": "error", + "jsx-a11y/scope": "error", + "jsx-a11y/role-supports-aria-props": "error", + "jsx-a11y/role-has-required-aria-props": "error", + "jsx-a11y/no-static-element-interactions": "error", + "jsx-a11y/no-redundant-roles": "error", + "jsx-a11y/no-noninteractive-element-to-interactive-role": "error", + "jsx-a11y/no-noninteractive-element-interactions": "error", + "jsx-a11y/no-interactive-element-to-noninteractive-role": "error", + "jsx-a11y/no-autofocus": "error", + "jsx-a11y/no-aria-hidden-on-focusable": "error", + "jsx-a11y/mouse-events-have-key-events": "error", + "jsx-a11y/lang": "error", + "jsx-a11y/interactive-supports-focus": "error", + "jsx-a11y/img-redundant-alt": "error", + "jsx-a11y/iframe-has-title": "error", + "jsx-a11y/html-has-lang": "error", + "jsx-a11y/control-has-associated-label": "error", + "jsx-a11y/click-events-have-key-events": "error", + "jsx-a11y/autocomplete-valid": "error", + "jsx-a11y/aria-proptypes": "error", + "jsx-a11y/aria-props": "error", + "jsx-a11y/aria-activedescendant-has-tabindex": "error", + "jsx-a11y/anchor-has-content": "error", + "jsx-a11y/no-noninteractive-tabindex": "error", + "jsx-a11y/alt-text": "error", + + // Next Js + "nextjs/no-styled-jsx-in-document": "error", + "nextjs/no-html-link-for-pages": "error", + }, +} diff --git a/apps/site/app/(home)/session-animation.tsx b/apps/site/app/(home)/session-animation.tsx index cca8a1ba7..225290517 100644 --- a/apps/site/app/(home)/session-animation.tsx +++ b/apps/site/app/(home)/session-animation.tsx @@ -44,18 +44,18 @@ export function SessionAnimation() { ]); return () => controls.cancel(); - } else { - const controls = animate([ - ...typingRefs.current.map( - (ref) => [ref, { y: 10, opacity: 0 }, { duration: 0 }] satisfies ObjectSegmentWithTransition + } + + const controls = animate([ + ...typingRefs.current.map( + (ref) => [ref, { y: 10, opacity: 0 }, { duration: 0 }] satisfies ObjectSegmentWithTransition ), [profileRef.current, { opacity: 0, y: 20, filter: "blur(5px)" }, { duration: 0 }], [searchRef.current, { opacity: 1 }, { duration: 0 }], [daysBack, 0, { duration: 0 }], ]); - return () => controls.cancel(); - } + return () => controls.cancel(); }, [inView, animate, daysBack]); return ( diff --git a/apps/site/app/api/skin/head/route.ts b/apps/site/app/api/skin/head/route.ts index 8d3725cc6..a36dfc350 100644 --- a/apps/site/app/api/skin/head/route.ts +++ b/apps/site/app/api/skin/head/route.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type NextRequest } from "next/server"; +import type { NextRequest } from "next/server"; import { env } from "~/app/env"; export async function GET( diff --git a/apps/site/app/api/skin/render/route.ts b/apps/site/app/api/skin/render/route.ts index 51046ca49..2d24a9f05 100644 --- a/apps/site/app/api/skin/render/route.ts +++ b/apps/site/app/api/skin/render/route.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type NextRequest } from "next/server"; +import type { NextRequest } from "next/server"; import { env } from "~/app/env"; export async function GET( diff --git a/apps/site/app/players/[slug]/context.tsx b/apps/site/app/players/[slug]/context.tsx index 522cff124..b86eeb06d 100644 --- a/apps/site/app/players/[slug]/context.tsx +++ b/apps/site/app/players/[slug]/context.tsx @@ -8,29 +8,32 @@ "use client"; -import { type ReactNode, createContext, use } from "react"; +import { type ReactNode, createContext, use, useMemo } from "react"; import type { Player } from "@statsify/schemas"; const PlayerContext = createContext<{ player: Player | undefined }>({ player: undefined, }); -export const PlayerProvider = ({ player, children }: { +export const PlayerProvider = ({ + player, + children, +}: { player: Player; children: ReactNode; -}) => ( - - {children} - -); +}) => { + const value = useMemo(() => ({ player }), [player]); + return {children}; +}; export function usePlayer() { const { player } = use(PlayerContext); if (!player) { - throw new Error("Either usePlayer isn't being used in a PlayerContext or the player doesn't exist"); + throw new Error( + "Either usePlayer isn't being used in a PlayerContext or the player doesn't exist", + ); } return player; } - diff --git a/apps/site/app/players/[slug]/general/bingo/bingo.tsx b/apps/site/app/players/[slug]/general/bingo/bingo.tsx index a42c2c3c7..f8dc9bc9c 100644 --- a/apps/site/app/players/[slug]/general/bingo/bingo.tsx +++ b/apps/site/app/players/[slug]/general/bingo/bingo.tsx @@ -107,7 +107,8 @@ function CategoryOverview({ category, icon }: { category: Category; icon: Static

{FormattedCategories[category]} Bingo Cards

-

{ setCategory(category); @@ -117,8 +118,9 @@ function CategoryOverview({ category, icon }: { category: Category; icon: Static Easy:{" "} {easyCompletion} /16 completed -

-

+

); diff --git a/apps/site/app/players/search.tsx b/apps/site/app/players/search.tsx index 96b25b7ad..64383e338 100644 --- a/apps/site/app/players/search.tsx +++ b/apps/site/app/players/search.tsx @@ -90,31 +90,6 @@ export function Search({ console.log(`Redirecting to ${playerUrl(query)}`); router.push(playerUrl(query)); }} - onKeyDown={(event) => { - if (event.key === "Enter") { - ref.current?.requestSubmit(); - } - - if (suggestions.isPending || suggestions.isError) return; - - switch (event.key) { - case "Escape": - setSelected(undefined); - break; - - case "ArrowDown": { - const newSelected = ((selected ?? -1) + 1) % suggestions.data.length; - onSelectionChange(newSelected); - break; - } - - case "ArrowUp": { - const newSelected = selected ? selected - 1 : suggestions.data.length - 1; - onSelectionChange(newSelected); - break; - } - } - }} >
@@ -127,10 +102,36 @@ export function Search({ setQuery(event.target.value); setInput(event.target.value); }} + onKeyDown={(event) => { + if (event.key === "Enter") { + ref.current?.requestSubmit(); + } + + if (suggestions.isPending || suggestions.isError) return; + + switch (event.key) { + case "Escape": + setSelected(undefined); + break; + + case "ArrowDown": { + const newSelected = ((selected ?? -1) + 1) % suggestions.data.length; + onSelectionChange(newSelected); + break; + } + + case "ArrowUp": { + const newSelected = selected ? selected - 1 : suggestions.data.length - 1; + onSelectionChange(newSelected); + break; + } + } + }} spellCheck={false} autoComplete="off" disabled={disabled} onFocus={() => setFocused(true)} + aria-label="Search players" />
{/* Crossfade between oldBackground and currentBackground */} - {oldBackground.current && oldBackground.current != background && ( + {oldBackground.current && oldBackground.current !== background && ( = BoxOnlyPro keyof BoxOnlyProps >; +const DEFAULT_BORDER_RADIUS_PROP: BoxBorderRadius = {}; + export function Box({ - borderRadius: partialBorderRadius = {}, + borderRadius: partialBorderRadius = DEFAULT_BORDER_RADIUS_PROP, shadow = 8, className, variant = "default", diff --git a/apps/site/components/ui/carousel.tsx b/apps/site/components/ui/carousel.tsx index b76d7161b..c2d670f4e 100644 --- a/apps/site/components/ui/carousel.tsx +++ b/apps/site/components/ui/carousel.tsx @@ -116,6 +116,8 @@ export function Carousel({ children, className }: { children: ReactNode; classNa {cards.map((_, index) => ( ); } diff --git a/apps/site/components/ui/minecraft-text.tsx b/apps/site/components/ui/minecraft-text.tsx index f7d59bc13..82f364cc5 100644 --- a/apps/site/components/ui/minecraft-text.tsx +++ b/apps/site/components/ui/minecraft-text.tsx @@ -68,7 +68,7 @@ export function MinecraftText({ children, className }: { children: string | stri } } - if (!text.length) return undefined; + if (text.length === 0) return undefined; return {text}; }).filter((element) => element !== undefined); diff --git a/apps/site/components/ui/tabs.tsx b/apps/site/components/ui/tabs.tsx index f4be6eae8..02468ee8c 100644 --- a/apps/site/components/ui/tabs.tsx +++ b/apps/site/components/ui/tabs.tsx @@ -9,7 +9,7 @@ "use client"; import { Box } from "~/components/ui/box"; -import { type ComponentProps, createContext, use, useState } from "react"; +import { type ComponentProps, createContext, use, useState, useMemo, useCallback } from "react"; import { SkeletonBox } from "./skeleton-box"; import { cn } from "~/lib/util"; @@ -41,15 +41,17 @@ export function Tabs({ }: TabsProps) { const [internalTab, setInternalTab] = useState(defaultTab as T); - function onTabChange(tab: T) { + const onTabChange = useCallback((tab: T) => { setInternalTab(tab); externalOnTabChange?.(tab); - } + }, [externalOnTabChange]); const tab = externalTab ?? internalTab; + const value = useMemo(() => ({ tab, onTabChange: onTabChange as (tab: string | number) => void }), [tab, onTabChange]); + return ( - void }}> +
(ref: RefObject) { const [size, setSize] = useState({ width: 0, height: 0 }); // This must check for window since ResizeObserver only exists on the web - // eslint-disable-next-line unicorn/prefer-global-this const observer = useMemo(() => typeof window !== "undefined" && window.ResizeObserver ? new ResizeObserver((entries) => setSize(entries[0].contentRect)) : undefined, []); useEffect(() => { diff --git a/apps/site/package.json b/apps/site/package.json index 9f20e87c8..c70cfefcc 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -6,7 +6,8 @@ "dev": "next dev --turbopack -p 5000", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@radix-ui/react-popover": "^1.1.15", @@ -20,21 +21,18 @@ "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1", - "tailwind-merge": "^3.4.0", + "tailwind-merge": "^3.6.0", "zod": "^4.1.5" }, "devDependencies": { - "@eslint/eslintrc": "^3.2.0", "@statsify/api-client": "workspace:^", - "@tailwindcss/postcss": "4.1.17", - "@types/node": "^24.3.0", - "@types/react": "^19.2.7", + "@tailwindcss/postcss": "4.3.0", + "@types/node": "^25.9.1", + "@types/react": "^19.2.16", "@types/react-dom": "^19.2.3", - "eslint": "^9.19.0", - "eslint-config-next": "15.5.2", "mongoose": "^8.18.0", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.17", - "typescript": "^5.7.3" + "postcss": "^8.5.15", + "tailwindcss": "^4.3.0", + "typescript": "^6.0.3" } -} \ No newline at end of file +} diff --git a/apps/support-bot/package.json b/apps/support-bot/package.json index 5f953fc9a..dab026189 100644 --- a/apps/support-bot/package.json +++ b/apps/support-bot/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -19,14 +20,14 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "axios": "1.11.0", "discord-api-types": "^0.38.22", "luxon": "^3.5.0", "mongoose": "^8.5.2", "reflect-metadata": "^0.2.2", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "toad-scheduler": "^3.0.1", "typedi": "^0.10.0" @@ -48,4 +49,4 @@ "default": "./dist/lib/index.js" } } -} \ No newline at end of file +} diff --git a/apps/support-bot/src/commands/commands.command.ts b/apps/support-bot/src/commands/commands.command.ts index f63534aac..c532e7457 100644 --- a/apps/support-bot/src/commands/commands.command.ts +++ b/apps/support-bot/src/commands/commands.command.ts @@ -12,7 +12,7 @@ import { CommandContext, EmbedBuilder, ErrorMessage, - PaginateService, + scrollingPagination, TextArgument, } from "@statsify/discord"; import { STATUS_COLORS } from "@statsify/logger"; @@ -28,10 +28,7 @@ const COMMANDS_PER_PAGE = 25; userCommand: false, }) export class CommandsCommand { - public constructor( - private readonly apiService: ApiService, - private readonly paginateService: PaginateService - ) {} + public constructor(private readonly apiService: ApiService) {} public async run(context: CommandContext) { const commands = await this.apiService.getCommandUsage(); @@ -44,7 +41,7 @@ export class CommandsCommand { const commandList = Object.entries(commands).sort((a, b) => b[1] - a[1]); const groups = arrayGroup(commandList, COMMANDS_PER_PAGE); - return this.paginateService.scrollingPagination( + return scrollingPagination( context, groups.map( (group, index) => () => diff --git a/apps/support-bot/src/events/guild-member-add.event.tsx b/apps/support-bot/src/events/guild-member-add.event.tsx index e3c9db69a..7113a42ac 100644 --- a/apps/support-bot/src/events/guild-member-add.event.tsx +++ b/apps/support-bot/src/events/guild-member-add.event.tsx @@ -70,7 +70,7 @@ export class GuildMemberAddEventListener extends AbstractEventListener { - const avatar = member.user?.avatar ?? member.avatar; - - if (avatar) - return loadImage( - `https://cdn.discordapp.com/avatars/${member.user!.id}/${avatar}.png?size=96` - ); - - return loadImage( - `https://cdn.discordapp.com/embed/avatars/${ - Number(member.user!.discriminator) % 5 - }.png?size=96` - ); - } - private async sendVerifiedMessage(member: APIGuildMember): Promise { await this.roleService.addRole(GUILD_ID, member.user!.id, MEMBER_ROLE); await this.apiService.updateUser(member.user!.id, { serverMember: true }); const embed = new EmbedBuilder() - .description(`<@${member.user!.id}> ${this.randomJoinMessage()}`) + .description(`<@${member.user!.id}> ${randomJoinMessage()}`) .image("attachment://welcome.png") .color(STATUS_COLORS.info); @@ -127,14 +112,27 @@ export class GuildMemberAddEventListener extends AbstractEventListener ${this.randomJoinMessage()}`) + .description(`<@${member.user!.id}> ${randomJoinMessage()}`) .image("attachment://welcome.png") .color(STATUS_COLORS.info); return { embeds: [embed] }; } +} - private randomJoinMessage() { - return JOIN_MESSAGES[Math.floor(Math.random() * JOIN_MESSAGES.length)]; - } +function getDiscordAvatar(member: APIGuildMember): Promise { + const avatar = member.user?.avatar ?? member.avatar; + + if (avatar) + return loadImage( + `https://cdn.discordapp.com/avatars/${member.user!.id}/${avatar}.png?size=96` + ); + + return loadImage( + `https://cdn.discordapp.com/embed/avatars/${ + Number(member.user!.discriminator) % 5 + }.png?size=96` + ); } + +const randomJoinMessage = () => JOIN_MESSAGES[Math.floor(Math.random() * JOIN_MESSAGES.length)]; \ No newline at end of file diff --git a/apps/support-bot/src/events/guild-member-update.event.ts b/apps/support-bot/src/events/guild-member-update.event.ts index f4c396568..35a5128bf 100644 --- a/apps/support-bot/src/events/guild-member-update.event.ts +++ b/apps/support-bot/src/events/guild-member-update.event.ts @@ -123,11 +123,11 @@ export class GuildMemberUpdateEventListener extends AbstractEventListener { + for (const user of users) { if (user.tier in this.tiers) this.tiers[user.tier as PremiumTier].add(user.id); if (user.patreon) this.patreons.add(user.id); if (user.serverBooster) this.serverBoosters.add(user.id); - }); + } } private findTier(memberId: string) { diff --git a/apps/support-bot/src/index.ts b/apps/support-bot/src/index.ts index 0e080f671..59a2f43e9 100644 --- a/apps/support-bot/src/index.ts +++ b/apps/support-bot/src/index.ts @@ -9,10 +9,10 @@ import * as Sentry from "@sentry/node"; import { CommandListener } from "#lib"; import { - CommandLoader, CommandPoster, - EventLoader, I18nLoaderService, + loadCommands, + loadEvents, } from "@statsify/discord"; import { Container } from "typedi"; import { @@ -25,12 +25,11 @@ import { GatewayIntentBits } from "discord-api-types/v10"; import { Logger } from "@statsify/logger"; import { RestClient, WebsocketShard } from "tiny-discord"; import { config } from "@statsify/util"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join } from "node:path"; import { setGlobalOptions } from "@typegoose/typegoose"; import "reflect-metadata"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; const logger = new Logger("support-bot"); const handleError = logger.error.bind(logger); @@ -61,10 +60,12 @@ await Promise.all( ) ); -const commands = await CommandLoader.load(join(__dirname, "./commands")); +const commands = await loadCommands(join(directory, "./commands")); const tags = await Container.get(TagService).fetch(); -tags.forEach((tag) => commands.set(tag.name, tag)); +for (const tag of tags) { + commands.set(tag.name, tag); +} const poster = Container.get(CommandPoster); @@ -83,7 +84,7 @@ const websocket = new WebsocketShard({ GatewayIntentBits.MessageContent, }); -await EventLoader.load(websocket, join(__dirname, "./events")); +await loadEvents(websocket, join(directory, "./events")); const listener = CommandListener.create(websocket, rest, commands); Container.get(TicketService).init(); diff --git a/apps/support-bot/src/services/mongo-loader.service.ts b/apps/support-bot/src/services/mongo-loader.service.ts index dbcc1f250..028bbfde5 100644 --- a/apps/support-bot/src/services/mongo-loader.service.ts +++ b/apps/support-bot/src/services/mongo-loader.service.ts @@ -19,9 +19,9 @@ export class MongoLoaderService { const models = [Ticket, Tag, User]; - models.forEach((modelClass) => { + for (const modelClass of models) { const model = getModelForClass(modelClass, { existingConnection: connection }); Container.set(modelClass, model); - }); + } } } diff --git a/apps/support-bot/src/services/ticket.service.ts b/apps/support-bot/src/services/ticket.service.ts index 7f74f27d9..519656503 100644 --- a/apps/support-bot/src/services/ticket.service.ts +++ b/apps/support-bot/src/services/ticket.service.ts @@ -88,7 +88,7 @@ export class TicketService { // Add hooks for all tickets in the database since they may have been created before the bot was started const tickets = await this.ticketModel.find().select({ channel: true }).lean().exec(); - tickets.forEach((ticket) => { + for (const ticket of tickets) { listener.addHook(ticket.channel, (interaction) => this.close(interaction.getChannelId()!, "channel", interaction.getUserId()) ); @@ -97,7 +97,7 @@ export class TicketService { this.copyUsernameButtonId(ticket.channel), this.copyUsername.bind(this) ); - }); + } } public async create(guildId: string, user: APIUser, username: string, issue: string) { @@ -202,12 +202,11 @@ export class TicketService { listener.removeHook(this.copyUsernameButtonId(ticket.channel)); // A list of people who talked in the ticket - const participants: Set = new Set(); - participants.add(`<@${ticket.owner}>`); + const participants: Set = new Set(`<@${ticket.owner}>`); const logs: string[] = []; - messages.forEach((m) => { + for (const m of messages) { if (!m.author.bot) participants.add(`<@${m.author.id}>`); const message = [ @@ -216,7 +215,7 @@ export class TicketService { ].join("\n"); logs.push(message); - }); + } const embed = new EmbedBuilder() .title("Ticket Resolved") diff --git a/apps/support-bot/tsconfig.json b/apps/support-bot/tsconfig.json index 1522cd368..042ff5467 100644 --- a/apps/support-bot/tsconfig.json +++ b/apps/support-bot/tsconfig.json @@ -3,8 +3,5 @@ "compilerOptions": { "jsx": "preserve", }, - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/apps/verify-server/eslint.config.js b/apps/verify-server/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/apps/verify-server/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/apps/verify-server/package.json b/apps/verify-server/package.json index 208f341e8..5503fdbc0 100644 --- a/apps/verify-server/package.json +++ b/apps/verify-server/package.json @@ -7,8 +7,9 @@ "scripts": { "start": "node --enable-source-maps .", "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -16,9 +17,9 @@ "@statsify/logger": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "minecraft-protocol": "^1.61.0", "mongoose": "^8.5.2" } -} \ No newline at end of file +} diff --git a/apps/verify-server/src/generate-code.ts b/apps/verify-server/src/generate-code.ts index 31dacf1f8..9ddc95c0e 100644 --- a/apps/verify-server/src/generate-code.ts +++ b/apps/verify-server/src/generate-code.ts @@ -9,14 +9,16 @@ import type { ReturnModelType } from "@typegoose/typegoose"; import type { VerifyCode } from "@statsify/schemas"; -const createCode = () => Math.floor(Math.random() * (9999 - 1000 + 1) + 1000).toString(); +const createCode = () => + Math.floor(Math.random() * (9999 - 1000 + 1) + 1000).toString(); export const generateCode = async ( - verifyCodesModel: ReturnModelType + verifyCodesModel: ReturnModelType, ) => { let code = createCode(); - // Make sure the code is unique + // Make sure the code is unique by serially checking if each generated code already exists + // oxlint-disable-next-line no-await-in-loop while (await verifyCodesModel.exists({ code }).lean().exec()) { code = createCode(); } diff --git a/apps/verify-server/tsconfig.json b/apps/verify-server/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/apps/verify-server/tsconfig.json +++ b/apps/verify-server/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/assets/private b/assets/private index 1ed6d877f..38a97e46e 160000 --- a/assets/private +++ b/assets/private @@ -1 +1 @@ -Subproject commit 1ed6d877fe5cc3bc80ade9d7654752edc8ba0a3e +Subproject commit 38a97e46ee32b939b0f617bfd66a8833c7c6e619 diff --git a/assets/public b/assets/public index 25cf23500..cf87904f4 160000 --- a/assets/public +++ b/assets/public @@ -1 +1 @@ -Subproject commit 25cf2350076387df9e8a37388ae48f4a931e9966 +Subproject commit cf87904f476e88e8bb31fa47f4dc2a569628ddbd diff --git a/compose.dev.yml b/compose.dev.yml new file mode 100644 index 000000000..f17507185 --- /dev/null +++ b/compose.dev.yml @@ -0,0 +1,21 @@ +services: + redis: + image: docker.io/redis/redis-stack:latest + restart: unless-stopped + ports: + - "127.0.0.1:8001:8001" + - "127.0.0.1:6379:6379" + volumes: + - "./data/redis:/data" + environment: + REDIS_ARGS: "--requirepass statsify" + mongodb: + image: mongo:latest + restart: unless-stopped + ports: + - "27017:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: statsify + MONGO_INITDB_ROOT_PASSWORD: statsify + volumes: + - "./data/mongodb:/data/db" diff --git a/config.schema.js b/config.schema.js index e4f31c328..4317d8ae2 100644 --- a/config.schema.js +++ b/config.schema.js @@ -11,8 +11,8 @@ */ export default { database: { - mongoUri: "", - redisUrl: "", + mongoUri: "mongodb://statsify:statsify@localhost:27017/statsify?authSource=admin", + redisUrl: "redis://:statsify@localhost:6379", }, hypixelApi: { key: "", diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 4ea4ffe24..000000000 --- a/eslint.config.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import eslint from "@eslint/js"; -import licenseHeader from "eslint-plugin-license-header"; -import sortImports from "@j4cobi/eslint-plugin-sort-imports"; -import stylistic from "@stylistic/eslint-plugin"; -import tseslint from "typescript-eslint"; -import unusedImports from "eslint-plugin-unused-imports"; -import unicorn from "eslint-plugin-unicorn"; -import { join } from "node:path"; - -/** - * - * @param {{ tsconfigDirName: string }} config - * @returns workspace eslint config - */ -export function defineConfig({ tsconfigDirName }) { - return tseslint.config( - { ignores: ["dist", "node_modules", ".next", "pkg"] }, - eslint.configs.recommended, - ...tseslint.configs.strict, - { - languageOptions: { - parserOptions: { - project: [join(tsconfigDirName, "./tsconfig.json")], - tsconfigDirName - } - }, - rules: { - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "minimumDescriptionLength": 3, - "ts-check": true, - "ts-expect-error": "allow-with-description", - "ts-ignore": "allow-with-description", - "ts-nocheck": true, - }, - ], - "@typescript-eslint/default-param-last": "error", - "@typescript-eslint/explicit-member-accessibility": "error", - "@typescript-eslint/member-ordering": [ - "error", - { - default: [ - "signature", - "public-instance-field", - "protected-instance-field", - "private-instance-field", - "instance-field", - "public-static-field", - "protected-static-field", - "private-static-field", - "static-field", - "public-constructor", - "protected-constructor", - "private-constructor", - "constructor", - "public-instance-method", - "protected-instance-method", - "private-instance-method", - "instance-method", - "public-static-method", - "protected-static-method", - "private-static-method", - "static-method", - ], - }, - ], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-unsafe-declaration-merging": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-extraneous-class": "off" - } - }, - unicorn.configs["flat/recommended"], - { - rules: { - "unicorn/better-regex": "off", - "unicorn/catch-error-name": "off", - "unicorn/consistent-destructuring": "off", - "unicorn/escape-case": "off", - "unicorn/explicit-length-check": "off", - "unicorn/filename-case": "off", - "unicorn/import-style": [ - "error", - { - styles: { - "node:path": { - named: true, - default: false, - }, - }, - }, - ], - "unicorn/no-array-callback-reference": "off", - "unicorn/no-array-for-each": "off", - "unicorn/no-array-reduce": "off", - "unicorn/no-await-expression-member": "off", - "unicorn/no-null": "off", - "unicorn/no-object-as-default": "off", - "unicorn/no-process-exit": "off", - "unicorn/no-static-only-class": "off", - "unicorn/no-useless-switch-case": "off", - "unicorn/no-useless-undefined": "off", - "unicorn/number-literal-case": "off", - "unicorn/numeric-separators-style": [ - "error", - { - onlyIfContainsSeparator: true, - number: { - minimumDigits: 5, - groupLength: 3, - onlyIfContainsSeparator: false, - }, - }, - ], - "unicorn/prefer-at": "error", - "unicorn/prefer-string-replace-all": "off", - "unicorn/prevent-abbreviations": "off", - "unicorn/relative-url-style": ["error", "always"], - "unicorn/switch-case-braces": ["error", "avoid"], - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "error", - { - vars: "all", - varsIgnorePattern: "^_", - args: "after-used", - argsIgnorePattern: "^_", - }, - ], - } - }, - stylistic.configs.customize({ - jsx: true, - semi: true, - quotes: "double", - quoteProps: "consistent-as-needed", - braceStyle: "1tbs", - arrowParens: "always", - }), - { - rules: { - "@stylistic/no-extra-semi": "error", - "@stylistic/no-floating-decimal": "error", - "@stylistic/quote-props": ["error", "consistent-as-needed"], - "@stylistic/no-multiple-empty-lines": ["error", { max: 1, maxEOF: 1 }], - "@stylistic/comma-dangle": [ - "error", - { - arrays: "always-multiline", - objects: "always-multiline", - imports: "always-multiline", - exports: "always-multiline", - functions: "never", - }, - ], - "@stylistic/generator-star-spacing": ["error", { before: false, after: true }], - "@stylistic/indent": ["error", 2, { SwitchCase: 1 }], - "@stylistic/max-len": [ - "error", - { - code: 120, - tabWidth: 2, - ignoreComments: true, - ignoreTrailingComments: true, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreRegExpLiterals: true, - }, - ], - "@stylistic/type-generic-spacing": "error", - "@stylistic/yield-star-spacing": ["error", { before: false, after: true }], - "@stylistic/jsx-one-expression-per-line": "off", - "@stylistic/operator-linebreak": ["error", "after"] - } - }, - { - plugins: { - "license-header": licenseHeader, - "sort-imports": sortImports, - "unused-imports": unusedImports, - }, - rules: { - "arrow-body-style": ["error", "as-needed"], - "license-header/header": [ - "error", - [ - "/**", - " * Copyright (c) Statsify", - " *", - " * This source code is licensed under the GNU GPL v3 license found in the", - " * LICENSE file in the root directory of this source tree.", - " * https://github.com/Statsify/statsify/blob/main/LICENSE", - " */", - ], - ], - "import/no-anonymous-default-export": "off", - "no-constant-binary-expression": "error", - "no-constructor-return": "error", - "no-duplicate-imports": "error", - "no-lonely-if": "error", - "object-shorthand": ["error", "always"], - "one-var": ["error", "never"], - "prefer-template": "error", - "sort-imports/sort-imports": [ - "error", - { - ignoreCase: false, - ignoreMemberSort: false, - memberSyntaxSortOrder: [ - "all", - "single", - "multiple", - "none", - ], - }, - ] - } - } - ); -} \ No newline at end of file diff --git a/package.json b/package.json index 4b886a783..2184e656b 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,15 @@ "url": "git+https://github.com/Statsify/statsify.git" }, "scripts": { - "build": "turbo run build --filter=!site --parallel --cache-dir='.turbo'", + "build": "turbo run build --filter=!site --cache-dir='.turbo'", "build:watch": "turbo watch build --filter=!site", - "test:types": "turbo run test:types --cache-dir='.turbo'", + "typecheck": "turbo run typecheck --cache-dir='.turbo'", "test": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", - "lint": "turbo run lint --parallel --cache-dir='.turbo'", - "pre-commit": "pnpm lint && pnpm test:types && pnpm test:coverage && git add .", - "commit": "pnpm pre-commit && git cz", + "lint": "turbo run lint --cache-dir='.turbo'", + "lint:ci": "turbo run lint:ci --cache-dir='.turbo'", + "fmt": "turbo run fmt --cache-dir='.turbo'", "api": "pnpm --filter api", "discord-bot": "pnpm --filter discord-bot", "support-bot": "pnpm --filter support-bot", @@ -26,46 +26,23 @@ "verify-server": "pnpm --filter verify-server" }, "packageManager": "pnpm@10.15.0", - "pnpm": { - "overrides": { - "skia-canvas": "3.0.8" - } - }, "devDependencies": { - "@commitlint/cli": "^19.6.1", - "@commitlint/config-conventional": "^19.6.0", - "@eslint/js": "^9.19.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", - "@napi-rs/cli": "^3.1.5", + "@napi-rs/cli": "^3.7.0", "@rollup/pluginutils": "^5.1.0", - "@stylistic/eslint-plugin": "^5.2.3", - "@swc/cli": "^0.7.8", - "@swc/core": "1.13.5", - "@types/eslint__js": "^9.14.0", - "@types/node": "^24.3.0", - "@vitest/coverage-v8": "^3.0.4", - "@vitest/ui": "^3.0.4", - "commitizen": "^4.3.1", - "cz-conventional-changelog": "^3.3.0", - "eslint": "^9.19.0", - "eslint-plugin-license-header": "^0.8.0", - "eslint-plugin-unicorn": "^60.0.0", - "eslint-plugin-unused-imports": "^4.1.4", + "@swc/cli": "^0.8.1", + "@swc/core": "1.15.40", + "@types/node": "^25.9.1", + "@typescript/native-preview": "7.0.0-dev.20260601.1", + "@vitest/coverage-v8": "^4.1.8", + "@vitest/ui": "^4.1.8", + "eslint-plugin-license-header": "^0.9.0", + "oxfmt": "^0.53.0", + "oxlint": "^1.68.0", "pm2": "^6.0.8", - "turbo": "^2.4.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.22.0", - "unplugin": "^2.1.2", - "vitest": "^3.0.4" - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } + "turbo": "^2.9.16", + "typescript": "^6.0.3", + "unplugin": "^3.0.0", + "vitest": "^4.1.8" } -} \ No newline at end of file +} diff --git a/packages/api-client/eslint.config.js b/packages/api-client/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/api-client/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/api-client/package.json b/packages/api-client/package.json index 791a0f748..d911fa1fb 100644 --- a/packages/api-client/package.json +++ b/packages/api-client/package.json @@ -6,8 +6,9 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@nestjs/common": "^11.1.6", @@ -16,7 +17,7 @@ "@statsify/rendering": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "^1.11.0" }, "imports": { @@ -29,4 +30,4 @@ "default": "./dist/responses/index.js" } } -} \ No newline at end of file +} diff --git a/packages/api-client/src/api.service.ts b/packages/api-client/src/api.service.ts index b2d1d7677..f43108367 100644 --- a/packages/api-client/src/api.service.ts +++ b/packages/api-client/src/api.service.ts @@ -7,7 +7,7 @@ */ import * as Sentry from "@sentry/node"; -import Axios, { AxiosInstance, AxiosRequestHeaders, Method, ResponseType } from "axios"; +import axios, { AxiosInstance, AxiosRequestHeaders, Method, ResponseType } from "axios"; import { CacheLevel, GuildQuery, @@ -55,7 +55,7 @@ export class ApiService { private axios: AxiosInstance; public constructor(private apiRoute: string, private apiKey: string) { - this.axios = Axios.create({ + this.axios = axios.create({ baseURL: this.apiRoute, headers: { "x-api-key": this.apiKey, diff --git a/packages/api-client/tsconfig.json b/packages/api-client/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/packages/api-client/tsconfig.json +++ b/packages/api-client/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/packages/assets/eslint.config.js b/packages/assets/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/assets/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/assets/package.json b/packages/assets/package.json index e68ff387f..9956e5ed3 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -6,14 +6,15 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@statsify/logger": "workspace:^", "@statsify/schemas": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "1.11.0", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz" + "skia-canvas": "3.0.8" } -} \ No newline at end of file +} diff --git a/packages/assets/src/index.ts b/packages/assets/src/index.ts index dae04fd37..6f4d43896 100644 --- a/packages/assets/src/index.ts +++ b/packages/assets/src/index.ts @@ -30,8 +30,8 @@ const getImage = (path: string) => loadImage(getAssetPath(path)); * @returns the full path to the texture */ export const getMinecraftTexturePath = (texturePath: string, pack = "default") => { - if (!hasPrivateAssets) pack = "default"; - return join(getAssetPath(`minecraft-textures/${pack}/assets/minecraft/`), texturePath); + const effectivePack = !hasPrivateAssets ? "default" : pack; + return join(getAssetPath(`minecraft-textures/${effectivePack}/assets/minecraft/`), texturePath); }; export const getAllGameIcons = async () => { diff --git a/packages/assets/tsconfig.json b/packages/assets/tsconfig.json index f1e6b476d..dd3fcc5f4 100644 --- a/packages/assets/tsconfig.json +++ b/packages/assets/tsconfig.json @@ -1,7 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js" - ] + "include": ["src"] } \ No newline at end of file diff --git a/packages/discord/eslint.config.js b/packages/discord/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/discord/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/discord/package.json b/packages/discord/package.json index 2e4cb9919..eae37fb57 100644 --- a/packages/discord/package.json +++ b/packages/discord/package.json @@ -6,8 +6,9 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", @@ -16,13 +17,13 @@ "@statsify/logger": "workspace:^", "@statsify/schemas": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "^1.11.0", "discord-api-types": "^0.38.22", "i18next": "^21.10.0", "i18next-fs-backend": "^2.3.2", "reflect-metadata": "^0.2.2", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "tiny-discord": "https://github.com/timotejroiko/tiny-discord.git#f6d020085ea88e33ebaf6ce323930deffe74fb0d", "typedi": "^0.10.0" }, @@ -59,4 +60,4 @@ "default": "./dist/util/*.js" } } -} \ No newline at end of file +} diff --git a/packages/discord/src/arguments/player.argument.ts b/packages/discord/src/arguments/player.argument.ts index 281c6d663..89aa0bab0 100644 --- a/packages/discord/src/arguments/player.argument.ts +++ b/packages/discord/src/arguments/player.argument.ts @@ -41,7 +41,7 @@ export class PlayerArgument extends AbstractArgument { let results = players.map((p) => ({ name: p, value: p })); - if (query && (!players.length || !players.some((p) => p.toLowerCase() === query))) { + if (query && (players.length === 0 || !players.some((p) => p.toLowerCase() === query))) { results = results.slice(0, 24); results.push(searched); } diff --git a/packages/discord/src/command/abstract-command.listener.ts b/packages/discord/src/command/abstract-command.listener.ts index 64a460791..90527fdb1 100644 --- a/packages/discord/src/command/abstract-command.listener.ts +++ b/packages/discord/src/command/abstract-command.listener.ts @@ -98,7 +98,7 @@ export abstract class AbstractCommandListener { data: any, name = command.name ): [command: CommandResolvable, data: any, name: string] { - if (!data.options || !data.options.length) return [command, data, name]; + if (!data.options || data.options.length === 0) return [command, data, name]; const firstOption = data.options[0]; @@ -132,7 +132,9 @@ export abstract class AbstractCommandListener { const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); try { - preconditions.forEach((precondition) => precondition()); + for (const precondition of preconditions) { + precondition(); + } const response = await command.execute(context); @@ -285,7 +287,6 @@ export abstract class AbstractCommandListener { this.logger.error(err); }); - // @ts-ignore Discord supports sending a blank object as a response client.on("interaction", async (event) => { const interaction = new Interaction(this.rest, event.interaction, this.applicationId); const response = await this.onInteraction(interaction); diff --git a/packages/discord/src/command/command.builder.ts b/packages/discord/src/command/command.builder.ts index 8dcbe9e13..b54d4ab84 100644 --- a/packages/discord/src/command/command.builder.ts +++ b/packages/discord/src/command/command.builder.ts @@ -9,58 +9,62 @@ import { ApplicationIntegrationType } from "discord-api-types/v9"; import { CommandResolvable } from "./command.resolvable.js"; import { InteractionContextType } from "discord-api-types/v10"; -import type { CommandMetadata, SubCommandMetadata } from "./command.interface.js"; +import type { + CommandMetadata, + SubCommandMetadata, +} from "./command.interface.js"; import type { Constructor } from "@statsify/util"; -export class CommandBuilder { - public static scan(target: T, constructor: Constructor) { - const commandMetadata = Reflect.getMetadata( - "statsify:command", - constructor - ) as CommandMetadata; - - if (!commandMetadata) { - throw new Error(`Command metadata not found on ${constructor.name}`); - } - - const commandResolvable = new CommandResolvable(commandMetadata, target); +export function scanCommands( + target: T, + constructor: Constructor, +) { + const commandMetadata = Reflect.getMetadata( + "statsify:command", + constructor, + ) as CommandMetadata; + + if (!commandMetadata) { + throw new Error(`Command metadata not found on ${constructor.name}`); + } - const subcommandMetadata = Reflect.getMetadata( - "statsify:subcommand", - target - ) as Record; + const commandResolvable = new CommandResolvable(commandMetadata, target); - if (!subcommandMetadata) return commandResolvable; + const subcommandMetadata = Reflect.getMetadata( + "statsify:subcommand", + target, + ) as Record; - const groups: Record = {}; + if (!subcommandMetadata) return commandResolvable; - for (const subcommand of Object.values(subcommandMetadata)) { - const subcommandResolvable = new CommandResolvable(subcommand, target); + const groups: Record = {}; - let addSubCommandTo: CommandResolvable = commandResolvable; + for (const subcommand of Object.values(subcommandMetadata)) { + const subcommandResolvable = new CommandResolvable(subcommand, target); - if (subcommand.group && subcommand.group in groups) { - addSubCommandTo = groups[subcommand.group]; - } else if (subcommand.group) { - const options = { - name: subcommand.group, - methodName: "run", - description: "group", - }; + let addSubCommandTo: CommandResolvable = commandResolvable; - addSubCommandTo = new CommandResolvable(options, target); - groups[options.name] = addSubCommandTo; - } + if (subcommand.group && subcommand.group in groups) { + addSubCommandTo = groups[subcommand.group]; + } else if (subcommand.group) { + const options = { + name: subcommand.group, + methodName: "run", + description: "group", + }; - addSubCommandTo.addCommand(subcommandResolvable.asSubCommand()); + addSubCommandTo = new CommandResolvable(options, target); + groups[options.name] = addSubCommandTo; } - for (const group of Object.values(groups)) { - commandResolvable.addCommand(group.asSubCommandGroup()); - } + addSubCommandTo.addCommand(subcommandResolvable.asSubCommand()); + } - return commandResolvable; + for (const group of Object.values(groups)) { + commandResolvable.addCommand(group.asSubCommandGroup()); } + + return commandResolvable; } if (import.meta.vitest) { @@ -68,14 +72,17 @@ if (import.meta.vitest) { const { Command } = await import("./command.decorator.js"); const { SubCommand } = await import("./subcommand.decorator.js"); - const { AbstractArgument } = await import("../arguments/abstract.argument.js"); + const { AbstractArgument } = + await import("../arguments/abstract.argument.js"); - const { ApplicationCommandOptionType, ApplicationCommandType } = await import( - "discord-api-types/v10" - ); + const { ApplicationCommandOptionType, ApplicationCommandType } = + await import("discord-api-types/v10"); - suite("CommandBuilder", () => { - const integration_types = [ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall]; + suite("Command Builder", () => { + const integration_types = [ + ApplicationIntegrationType.GuildInstall, + ApplicationIntegrationType.UserInstall, + ]; const contexts = [ InteractionContextType.Guild, @@ -87,7 +94,7 @@ if (import.meta.vitest) { @Command({ description: "test" }) class TestCommand {} - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", description_localizations: {}, @@ -107,7 +114,7 @@ if (import.meta.vitest) { } } - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", description_localizations: {}, @@ -147,7 +154,7 @@ if (import.meta.vitest) { } } - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", type: ApplicationCommandType.ChatInput, @@ -217,7 +224,7 @@ if (import.meta.vitest) { @Command({ description: "test", args: [Arg] }) class TestCommand {} - expect(CommandBuilder.scan(new TestCommand(), TestCommand).toJSON()).toEqual({ + expect(scanCommands(new TestCommand(), TestCommand).toJSON()).toEqual({ name: "test", description: "test", description_localizations: {}, diff --git a/packages/discord/src/command/command.loader.ts b/packages/discord/src/command/command.loader.ts index e644107df..3648a9c56 100644 --- a/packages/discord/src/command/command.loader.ts +++ b/packages/discord/src/command/command.loader.ts @@ -6,72 +6,70 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { CommandBuilder } from "./command.builder.js"; import { Container } from "typedi"; import { Logger } from "@statsify/logger"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; import type { CommandResolvable } from "./command.resolvable.js"; +import { scanCommands } from "./command.builder.js"; -export class CommandLoader { - private static readonly logger = new Logger("CommandLoader"); +const logger = new Logger("CommandLoader"); - public static async load(dir: string) { - const commands = new Map(); - const files = await this.getCommandFiles(dir); +export async function loadCommands(dir: string) { + const files = await getCommandFiles(dir); + const commands = await Promise.all(files.map(importCommand)); - for (const file of files) { - const imports = await this.importCommand(file); - - for (const command of imports) { - if (!command) continue; - commands.set(command.name, command); - } - } - - return commands; - } + return new Map( + commands + .flat() + .filter((command) => command !== undefined) + .map((command) => [command.name, command] as const), + ); +} - private static async importCommand(file: string) { - const command = await import(file); +async function importCommand(file: string) { + const command = await import(file); - return Object.keys(command) - .filter((key) => key !== "default") - .filter((key) => { - const value = command[key]; - // try to filter out function exports since classes will not have a writeable prototype. - return typeof value === "function" && !(Object.getOwnPropertyDescriptor(value, "prototype")?.writable); - }) - .map((key) => { - try { - const constructor = command[key]; - const instance = Container.get(constructor); + return Object.keys(command) + .filter((key) => key !== "default") + .filter((key) => { + const value = command[key]; + // try to filter out function exports since classes will not have a writeable prototype. + return ( + typeof value === "function" && + !Object.getOwnPropertyDescriptor(value, "prototype")?.writable + ); + }) + .map((key) => { + try { + const constructor = command[key]; + const instance = Container.get(constructor); - return CommandBuilder.scan(instance, constructor); - } catch (err) { - this.logger.error(`Failed to load command in ${file} with import ${key}`); - this.logger.error(err); - } - }); - } + return scanCommands(instance, constructor); + } catch (err) { + logger.error(`Failed to load command in ${file} with import ${key}`); + logger.error(err); + return undefined; + } + }); +} - private static async getCommandFiles(dir: string): Promise { - const toLoad: string[] = []; +async function getCommandFiles(dir: string): Promise { + const toLoad: string[] = []; - const files = await readdir(dir); + const files = await readdir(dir); - await Promise.all( - files.map(async (file) => { - const path = `${dir}/${file}`; + await Promise.all( + files.map(async (file) => { + const path = `${dir}/${file}`; - if (statSync(path).isDirectory()) { - toLoad.push(...(await this.getCommandFiles(path))); - } else if (file.endsWith(".command.js")) { - toLoad.push(path); - } - }) - ); + if (statSync(path).isDirectory()) { + toLoad.push(...(await getCommandFiles(path))); + } else if (file.endsWith(".command.js")) { + toLoad.push(path); + } + }), + ); - return toLoad; - } + return toLoad; } diff --git a/packages/discord/src/event/event.loader.ts b/packages/discord/src/event/event.loader.ts index 830bf1752..40f752559 100644 --- a/packages/discord/src/event/event.loader.ts +++ b/packages/discord/src/event/event.loader.ts @@ -14,60 +14,56 @@ import { WebsocketShard } from "tiny-discord"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; -export class EventLoader { - private static readonly logger = new Logger("EventLoader"); +const logger = new Logger("EventLoader"); - public static async load(websocket: WebsocketShard, dir: string) { - const events = new Map>(); - const files = await this.getEventFiles(dir); +export async function loadEvents(websocket: WebsocketShard, dir: string) { + const files = await getEventFiles(dir); + const events = await Promise.all(files.map(importEvent)); + const eventsMap = new Map>(events.flat().map((event) => [event.event, event])); - for (const file of files) { - const imports = await this.importEvent(file); - for (const event of imports) events.set(event.event, event); - } - - websocket.on("event", (event) => { - const listener = events.get(event.t as GatewayDispatchEvents); - if (listener) listener.onEvent(event.d); - }); - } + websocket.on("event", (event) => { + const listener = eventsMap.get(event.t as GatewayDispatchEvents); + if (listener) listener.onEvent(event.d); + }); +} - private static async importEvent(file: string): Promise[]> { - const event = await import(file); +async function importEvent( + file: string, +): Promise[]> { + const event = await import(file); - return Object.keys(event) - .filter((key) => key !== "default") - .map((key) => { - try { - const constructor = event[key]; - const instance = Container.get>(constructor); - return instance; - } catch (err) { - this.logger.error(`Failed to load event in ${file} with import ${key}`); - this.logger.error(err); - return null; - } - }) - .filter(Boolean) as AbstractEventListener[]; - } + return Object.keys(event) + .filter((key) => key !== "default") + .map((key) => { + try { + const constructor = event[key]; + const instance = Container.get>(constructor); + return instance; + } catch (err) { + logger.error(`Failed to load event in ${file} with import ${key}`); + logger.error(err); + return null; + } + }) + .filter(Boolean) as AbstractEventListener[]; +} - private static async getEventFiles(dir: string): Promise { - const toLoad: string[] = []; +async function getEventFiles(dir: string): Promise { + const toLoad: string[] = []; - const files = await readdir(dir); + const files = await readdir(dir); - await Promise.all( - files.map(async (file) => { - const path = `${dir}/${file}`; + await Promise.all( + files.map(async (file) => { + const path = `${dir}/${file}`; - if (statSync(path).isDirectory()) { - toLoad.push(...(await this.getEventFiles(path))); - } else if (file.endsWith(".event.js")) { - toLoad.push(path); - } - }) - ); + if (statSync(path).isDirectory()) { + toLoad.push(...(await getEventFiles(path))); + } else if (file.endsWith(".event.js")) { + toLoad.push(path); + } + }), + ); - return toLoad; - } + return toLoad; } diff --git a/packages/discord/src/messages/components/parse-emoji.ts b/packages/discord/src/messages/components/parse-emoji.ts index f68cc3802..0c7a2b37b 100644 --- a/packages/discord/src/messages/components/parse-emoji.ts +++ b/packages/discord/src/messages/components/parse-emoji.ts @@ -15,7 +15,7 @@ export function parseEmoji( ): APIMessageComponentEmoji { const emoji = translateField(locale, emote); const animated = emoji.startsWith("/g, ""); + const name = emoji.replaceAll(/<:|/g, ""); const id = name.split(":")[1]; return { name: name.replace(id, ""), animated, id }; diff --git a/packages/discord/src/messages/embed.ts b/packages/discord/src/messages/embed.ts index 4894bace8..3de82c248 100644 --- a/packages/discord/src/messages/embed.ts +++ b/packages/discord/src/messages/embed.ts @@ -73,7 +73,9 @@ export class EmbedBuilder { } public fields(...fields: Field[]): this { - fields.forEach((field) => this.field(...field)); + for (const field of fields) { + this.field(...field); + } return this; } diff --git a/packages/discord/src/services/api.service.ts b/packages/discord/src/services/api.service.ts index 5aaef0a1d..bc0fd6c5a 100644 --- a/packages/discord/src/services/api.service.ts +++ b/packages/discord/src/services/api.service.ts @@ -128,14 +128,21 @@ export class ApiService extends StatsifyApiService { let input: string; let playerType: PlayerTag; - if (!type) { - if (!tag || this.isDiscordId(tag)) type = GuildQuery.PLAYER; - else if (GUILD_ID_REGEX.test(tag)) type = GuildQuery.ID; - else if (tag.includes(" ") || tag.length > 16) type = GuildQuery.NAME; - else type = GuildQuery.NAME; + let resolvedType: GuildQuery; + + if (type) { + resolvedType = type; + } else if (!tag || this.isDiscordId(tag)) { + resolvedType = GuildQuery.PLAYER; + } else if (GUILD_ID_REGEX.test(tag)) { + resolvedType = GuildQuery.ID; + } else if (tag.includes(" ") || tag.length > 16) { + resolvedType = GuildQuery.NAME; + } else { + resolvedType = GuildQuery.NAME; } - if (type === GuildQuery.PLAYER) { + if (resolvedType === GuildQuery.PLAYER) { const [formattedTag, type] = this.parseTag(tag); playerType = type; input = await this.resolveTag(formattedTag, type, user); @@ -143,7 +150,7 @@ export class ApiService extends StatsifyApiService { input = tag; } - return super.getGuild(input, type).catch((err) => { + return super.getGuild(input, resolvedType).catch((err) => { if (!err.response || !err.response.data) throw this.unknownError(); const error = err.response.data as GuildNotFoundException | PlayerNotFoundException; @@ -226,9 +233,9 @@ export class ApiService extends StatsifyApiService { } public emojiDisplayName(t: LocalizeFunction, displayName: string, space = true) { - displayName = displayName.replaceAll("_", String.raw`\_`); + const escapedDisplayName = displayName.replaceAll("_", String.raw`\_`); - const [rank, name] = displayName.replace(/\[|\]/g, "").split(" "); + const [rank, name] = escapedDisplayName.replaceAll(/\[|\]/g, "").split(" "); // They don't have a rank if (!name) return removeFormatting(displayName); @@ -260,7 +267,7 @@ export class ApiService extends StatsifyApiService { if (length >= 32 && length <= 36) return [tag.replaceAll("-", ""), "uuid"]; if (length <= 16) return [tag, "username"]; - if (this.isDiscordId(tag)) return [tag.replace(/<@|!|>/g, ""), "discordId"]; + if (this.isDiscordId(tag)) return [tag.replaceAll(/<@|!|>/g, ""), "discordId"]; throw new ErrorMessage("errors.invalidSearch"); } diff --git a/packages/discord/src/services/i18n-loader.service.ts b/packages/discord/src/services/i18n-loader.service.ts index c73d6863a..f576166b3 100644 --- a/packages/discord/src/services/i18n-loader.service.ts +++ b/packages/discord/src/services/i18n-loader.service.ts @@ -1,70 +1,70 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import Backend from "i18next-fs-backend"; -import i18next from "i18next"; -import { Service } from "typedi"; -import { abbreviationNumber } from "@statsify/util"; -import { readdir } from "node:fs/promises"; - -const DEFAULT_LANGUAGE = "en-US"; - -@Service() -export class I18nLoaderService { - private languages: string[] = []; - private namespaces: string[] = []; - - public async init() { - this.languages = await readdir("../../locales"); - this.namespaces = (await readdir(`../../locales/${DEFAULT_LANGUAGE}/`)).map((p) => - p.replace(".json", "") - ); - - await i18next.use(Backend).init({ - backend: { - loadPath: "../../locales/{{lng}}/{{ns}}.json", - }, - debug: false, - fallbackLng: DEFAULT_LANGUAGE, - lng: DEFAULT_LANGUAGE, - supportedLngs: this.languages, - ns: this.namespaces, - load: "all", - preload: this.languages, - initImmediate: false, - defaultNS: "default", - interpolation: { - format: this.format, - escapeValue: false, - }, - }); - } - - private format(value: any, format?: string | undefined, lng?: string): string { - switch (format) { - case "number": { - const hasDecimals = value >= 1_000_000 || !Number.isInteger(+value); - const digits = hasDecimals ? 2 : 0; - - const formatOptions = { - maximumFractionDigits: digits, - minimumFractionDigits: digits, - }; - - if ((value as number) >= 1_000_000) { - const [number, suffix] = abbreviationNumber(value); - return `${Intl.NumberFormat(lng, formatOptions).format(number)}${suffix}`; - } - - return Intl.NumberFormat(lng, formatOptions).format(value as number); - } - } - - return value; - } -} +/** + * Copyright (c) Statsify + * + * This source code is licensed under the GNU GPL v3 license found in the + * LICENSE file in the root directory of this source tree. + * https://github.com/Statsify/statsify/blob/main/LICENSE + */ + +import Backend from "i18next-fs-backend"; +import i18next from "i18next"; +import { Service } from "typedi"; +import { abbreviationNumber } from "@statsify/util"; +import { readdir } from "node:fs/promises"; + +const DEFAULT_LANGUAGE = "en-US"; + +@Service() +export class I18nLoaderService { + private languages: string[] = []; + private namespaces: string[] = []; + + public async init() { + this.languages = await readdir("../../locales"); + this.namespaces = (await readdir(`../../locales/${DEFAULT_LANGUAGE}/`)).map((p) => + p.replace(".json", "") + ); + + await i18next.use(Backend).init({ + backend: { + loadPath: "../../locales/{{lng}}/{{ns}}.json", + }, + debug: false, + fallbackLng: DEFAULT_LANGUAGE, + lng: DEFAULT_LANGUAGE, + supportedLngs: this.languages, + ns: this.namespaces, + load: "all", + preload: this.languages, + initImmediate: false, + defaultNS: "default", + interpolation: { + format, + escapeValue: false, + }, + }); + } +} + +function format(value: any, format?: string | undefined, lng?: string): string { + switch (format) { + case "number": { + const hasDecimals = value >= 1_000_000 || !Number.isInteger(+value); + const digits = hasDecimals ? 2 : 0; + + const formatOptions = { + maximumFractionDigits: digits, + minimumFractionDigits: digits, + }; + + if ((value as number) >= 1_000_000) { + const [number, suffix] = abbreviationNumber(value); + return `${Intl.NumberFormat(lng, formatOptions).format(number)}${suffix}`; + } + + return Intl.NumberFormat(lng, formatOptions).format(value as number); + } + } + + return value; +} \ No newline at end of file diff --git a/packages/discord/src/services/member.service.ts b/packages/discord/src/services/member.service.ts index c00d4d51a..5575fa6d5 100644 --- a/packages/discord/src/services/member.service.ts +++ b/packages/discord/src/services/member.service.ts @@ -15,10 +15,7 @@ export class MemberService { public constructor(private readonly rest: RestClient) {} public async addRole(guildId: string, userId: string, roleId: string) { - const response = await this.rest.put( - `/guilds/${guildId}/members/${userId}/roles/${roleId}`, undefined - ); - + const response = await this.rest.put(`/guilds/${guildId}/members/${userId}/roles/${roleId}`, {}); return parseDiscordResponse(response); } diff --git a/packages/discord/src/services/paginate.service.ts b/packages/discord/src/services/paginate.service.ts index d53215e53..ac7295d12 100644 --- a/packages/discord/src/services/paginate.service.ts +++ b/packages/discord/src/services/paginate.service.ts @@ -1,300 +1,367 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { ButtonStyle } from "discord-api-types/v10"; -import { Canvas } from "skia-canvas"; -import { Service } from "typedi"; - -import { - ActionRowBuilder, - ButtonBuilder, - EmbedBuilder, - type IMessage, - type LocalizationString, - type LocalizeFunction, - Message, - SelectMenuBuilder, - SelectMenuOptionBuilder, -} from "#messages"; -import { Interaction } from "#interaction"; -import type { AbstractCommandListener, CommandContext, InteractionHook } from "#command"; - -type PaginateInteractionContent = IMessage | Message | EmbedBuilder | Canvas; - -type PaginateInteractionContentGenerator = ( - t: LocalizeFunction -) => PaginateInteractionContent | Promise; - -export type Page = PageInput & ({ subPages: SubPage[] } | { generator: PaginateInteractionContentGenerator }); -export type SubPage = PageInput & { generator: PaginateInteractionContentGenerator }; - -interface PageInput { - label: LocalizationString; - emoji?: LocalizationString | false; -} - -type PageId = `${number}|${number}`; - -@Service() -export class PaginateService { - /** - * - * @param context The context of the command - * @param pages The array of pages to paginate against - * @param timeout When to stop the pagination (ms), defaults to 300000 - */ - public async paginate(context: CommandContext, pages: Page[], timeout = 300_000) { - const cache = new Map(); - const t = context.t(); - - const getMessage = async (index: number, subIndex: number) => { - const pageId: PageId = `${index}|${subIndex}`; - if (cache.has(pageId)) return cache.get(pageId)!; - - const page = pages[index]; - let content: PaginateInteractionContent; - - if ("subPages" in page) { - const subPage = page.subPages[subIndex]; - content = await subPage.generator(t); - } else { - content = await page.generator(t); - } - - const message = await this.toMessage(content); - cache.set(pageId, message); - - return message; - }; - - // If there is only one page with no sub pages, return the message immediately without pagination - if (pages.length === 1 && "generator" in pages[0]) return getMessage(0, 0); - - const userId = context.getInteraction().getUserId(); - const listener = context.getListener(); - - let currentIndex = 0; - let currentSubIndex = 0; - - const mainController = new PageController(pages, currentIndex); - - const page = pages[currentIndex]; - let subController = "subPages" in page && page.subPages.length > 1 ? new PageController(page.subPages, currentSubIndex) : undefined; - - mainController.register(listener, (interaction, index) => handler(interaction, index, 0)); - subController?.register(listener, (interaction, subIndex) => handler(interaction, currentIndex, subIndex)); - - async function handler(interaction: Interaction, index: number, subIndex: number) { - interaction.setLocale(t.locale); - - // Send an ephemeral preview if the user is not the one who initiated the interaction - if (interaction.getUserId() !== userId) { - const message = await getMessage(index, subIndex); - return interaction.sendFollowup({ ...message, components: [], ephemeral: true }); - } - - if (index !== currentIndex) { - subController?.unregister(listener); - mainController.switchPage(index); - - currentIndex = index; - currentSubIndex = 0; - - if ("subPages" in pages[index] && pages[index].subPages.length > 1) { - subController = new PageController(pages[index].subPages, currentSubIndex); - subController.register(listener, (interaction, subIndex) => handler(interaction, currentIndex, subIndex)); - } else { - subController = undefined; - } - } else if (subIndex !== currentSubIndex) { - subController?.switchPage(subIndex); - currentSubIndex = subIndex; - } - - const message = await getMessage(index, subIndex); - - message.components = [mainController.getActionRow(), subController?.getActionRow()] - .filter((row) => row !== undefined); - - return context.reply(message); - } - - function onTimeout() { - mainController.unregister(listener); - subController?.unregister(listener); - cache.clear(); - return context.reply({ components: [] }); - } - - setTimeout(onTimeout, timeout); - - const message = await getMessage(currentIndex, currentSubIndex); - message.components = [mainController.getActionRow(), subController?.getActionRow()] - .filter((row) => row !== undefined); - - return message; - } - - /** - * - * @param context The context of the command - * @param pages The array of pages to paginate against - * @param forwardButton The button to use for forward pagination - * @param backwardButton The button to use for back pagination - * @param invertButtons Whether to invert the buttons (backward becomes forward, forward becomes backward) - * @param startingIndex The starting page - * @param timeout When to stop the pagination (ms), defaults to 300000 - */ - public async scrollingPagination( - context: CommandContext, - pages: PaginateInteractionContentGenerator[], - forwardButton?: ButtonBuilder, - backwardButton?: ButtonBuilder, - invertButtons = false, - startingIndex = 0, - timeout = 300_000 - ) { - const currentIndex = startingIndex; - const cache = new Map(); - const t = context.t(); - - const getMessage = async (index: number) => { - if (cache.has(index)) return cache.get(index)!; - - const content = await pages[index](t); - const message = await this.toMessage(content); - cache.set(index, message); - - return message; - }; - - if (pages.length === 1) return getMessage(currentIndex); - - const userId = context.getInteraction().getUserId(); - - const controller = [ - backwardButton ?? new ButtonBuilder().emoji(t("emojis:backward")), - forwardButton ?? new ButtonBuilder().emoji(t("emojis:forward")), - ]; - - if (invertButtons) controller.reverse(); - - const listener = context.getListener(); - - controller.forEach((component, i) => { - listener.addHook(component.getCustomId(), async (interaction) => { - interaction.setLocale(t.locale); - - let page: number; - - if (i === 0) { - // Backwards - page = startingIndex == 0 ? pages.length - 1 : startingIndex - 1; - } else { - // Forwards - page = startingIndex == pages.length - 1 ? 0 : startingIndex + 1; - } - - const message = await getMessage(page); - - if (interaction.getUserId() === userId) { - startingIndex = page; - message.components = [new ActionRowBuilder(controller)]; - return context.reply(message); - } - - return interaction.sendFollowup({ ...message, components: [], ephemeral: true }); - }); - }); - - function onTimeout() { - controller.forEach((component) => listener.removeHook(component.getCustomId())); - context.reply({ components: [] }); - cache.clear(); - } - - setTimeout(onTimeout, timeout); - - const message = await getMessage(startingIndex); - message.components = [new ActionRowBuilder(controller)]; - - return message; - } - - private async toMessage(content: PaginateInteractionContent): Promise { - if (content instanceof Message) return content; - if (content instanceof EmbedBuilder) return new Message({ embeds: [content] }); - if (content instanceof Canvas) return new Message({ - files: [{ name: "image.png", data: await content.toBuffer("png"), type: "image/png" }], - attachments: [], - }); - - return new Message(content); - } -} - -class PageController { - #menu: SelectMenuBuilder | ButtonBuilder[]; - - public constructor(pages: PageInput[], selected: number) { - if (pages.length > 5) { - const menu = new SelectMenuBuilder(); - - pages.forEach((page, index) => { - const option = new SelectMenuOptionBuilder().label(page.label).value(`${index}`); - if (page.emoji) option.emoji(page.emoji); - menu.option(option); - }); - - menu.activeOption(selected); - this.#menu = menu; - } else { - this.#menu = pages.map((page, index) => { - const button = new ButtonBuilder().label(page.label).style(ButtonStyle.Secondary); - if (page.emoji) button.emoji(page.emoji); - if (index === selected) button.style(ButtonStyle.Primary); - return button; - }); - } - } - - public switchPage(index: number) { - if (this.#menu instanceof SelectMenuBuilder) { - this.#menu.activeOption(index); - return; - } - - this.#menu.forEach((button, i) => button.style(i === index ? ButtonStyle.Primary : ButtonStyle.Secondary)); - } - - public getActionRow(): ActionRowBuilder { - if (this.#menu instanceof SelectMenuBuilder) return new ActionRowBuilder([this.#menu]); - return new ActionRowBuilder(this.#menu); - } - - public register( - listener: AbstractCommandListener, - handler: (interaction: Interaction, index: number) => ReturnType - ) { - if (this.#menu instanceof SelectMenuBuilder) { - return listener.addHook(this.#menu.getCustomId(), (interaction) => { - const index = Number(interaction.getData().values[0]); - return handler(interaction, index); - }); - } - - this.#menu.forEach((button, index) => { - listener.addHook(button.getCustomId(), (interaction) => handler(interaction, index)); - }); - } - - public unregister(listener: AbstractCommandListener) { - if (this.#menu instanceof SelectMenuBuilder) listener.removeHook(this.#menu.getCustomId()); - else this.#menu.forEach((button) => listener.removeHook(button.getCustomId())); - } -} +/** + * Copyright (c) Statsify + * + * This source code is licensed under the GNU GPL v3 license found in the + * LICENSE file in the root directory of this source tree. + * https://github.com/Statsify/statsify/blob/main/LICENSE + */ + +import { ButtonStyle } from "discord-api-types/v10"; +import { Canvas } from "skia-canvas"; + +import { + ActionRowBuilder, + ButtonBuilder, + EmbedBuilder, + type IMessage, + type LocalizationString, + type LocalizeFunction, + Message, + SelectMenuBuilder, + SelectMenuOptionBuilder, +} from "#messages"; +import { Interaction } from "#interaction"; +import type { + AbstractCommandListener, + CommandContext, + InteractionHook, +} from "#command"; + +type PaginateInteractionContent = IMessage | Message | EmbedBuilder | Canvas; + +type PaginateInteractionContentGenerator = ( + t: LocalizeFunction, +) => PaginateInteractionContent | Promise; + +export type Page = PageInput & + ( + | { subPages: SubPage[] } + | { generator: PaginateInteractionContentGenerator } + ); +export type SubPage = PageInput & { + generator: PaginateInteractionContentGenerator; +}; + +interface PageInput { + label: LocalizationString; + emoji?: LocalizationString | false; +} + +type PageId = `${number}|${number}`; + +/** + * + * @param context The context of the command + * @param pages The array of pages to paginate against + * @param timeout When to stop the pagination (ms), defaults to 300000 + */ +export async function paginate( + context: CommandContext, + pages: Page[], + timeout = 300_000, +) { + const cache = new Map(); + const t = context.t(); + + const getMessage = async (index: number, subIndex: number) => { + const pageId: PageId = `${index}|${subIndex}`; + if (cache.has(pageId)) return cache.get(pageId)!; + + const page = pages[index]; + let content: PaginateInteractionContent; + + if ("subPages" in page) { + const subPage = page.subPages[subIndex]; + content = await subPage.generator(t); + } else { + content = await page.generator(t); + } + + const message = await contentToMessage(content); + cache.set(pageId, message); + + return message; + }; + + // If there is only one page with no sub pages, return the message immediately without pagination + if (pages.length === 1 && "generator" in pages[0]) return getMessage(0, 0); + + const userId = context.getInteraction().getUserId(); + const listener = context.getListener(); + + let currentIndex = 0; + let currentSubIndex = 0; + + const mainController = new PageController(pages, currentIndex); + + const page = pages[currentIndex]; + let subController = + "subPages" in page && page.subPages.length > 1 + ? new PageController(page.subPages, currentSubIndex) + : undefined; + + mainController.register(listener, (interaction, index) => + handler(interaction, index, 0), + ); + subController?.register(listener, (interaction, subIndex) => + handler(interaction, currentIndex, subIndex), + ); + + async function handler( + interaction: Interaction, + index: number, + subIndex: number, + ) { + interaction.setLocale(t.locale); + + // Send an ephemeral preview if the user is not the one who initiated the interaction + if (interaction.getUserId() !== userId) { + const message = await getMessage(index, subIndex); + return interaction.sendFollowup({ + ...message, + components: [], + ephemeral: true, + }); + } + + if (index !== currentIndex) { + subController?.unregister(listener); + mainController.switchPage(index); + + currentIndex = index; + currentSubIndex = 0; + + if ("subPages" in pages[index] && pages[index].subPages.length > 1) { + subController = new PageController( + pages[index].subPages, + currentSubIndex, + ); + subController.register(listener, (interaction, subIndex) => + handler(interaction, currentIndex, subIndex), + ); + } else { + subController = undefined; + } + } else if (subIndex !== currentSubIndex) { + subController?.switchPage(subIndex); + currentSubIndex = subIndex; + } + + const message = await getMessage(index, subIndex); + + message.components = [ + mainController.getActionRow(), + subController?.getActionRow(), + ].filter((row) => row !== undefined); + + return context.reply(message); + } + + function onTimeout() { + mainController.unregister(listener); + subController?.unregister(listener); + cache.clear(); + return context.reply({ components: [] }); + } + + setTimeout(onTimeout, timeout); + + const message = await getMessage(currentIndex, currentSubIndex); + message.components = [ + mainController.getActionRow(), + subController?.getActionRow(), + ].filter((row) => row !== undefined); + + return message; +} + +/** + * + * @param context The context of the command + * @param pages The array of pages to paginate against + * @param forwardButton The button to use for forward pagination + * @param backwardButton The button to use for back pagination + * @param invertButtons Whether to invert the buttons (backward becomes forward, forward becomes backward) + * @param startingIndex The starting page + * @param timeout When to stop the pagination (ms), defaults to 300000 + */ +export async function scrollingPagination( + context: CommandContext, + pages: PaginateInteractionContentGenerator[], + forwardButton?: ButtonBuilder, + backwardButton?: ButtonBuilder, + invertButtons = false, + startingIndex = 0, + timeout = 300_000, +) { + let currentIndex = startingIndex; + const cache = new Map(); + const t = context.t(); + + const getMessage = async (index: number) => { + if (cache.has(index)) return cache.get(index)!; + + const content = await pages[index](t); + const message = await contentToMessage(content); + cache.set(index, message); + + return message; + }; + + if (pages.length === 1) return getMessage(currentIndex); + + const userId = context.getInteraction().getUserId(); + + const controller = [ + backwardButton ?? new ButtonBuilder().emoji(t("emojis:backward")), + forwardButton ?? new ButtonBuilder().emoji(t("emojis:forward")), + ]; + + if (invertButtons) controller.reverse(); + + const listener = context.getListener(); + + for (const [index, component] of controller.entries()) { + listener.addHook(component.getCustomId(), async (interaction) => { + interaction.setLocale(t.locale); + + let page: number; + + if (index === 0) { + // Backwards + page = currentIndex === 0 ? pages.length - 1 : currentIndex - 1; + } else { + // Forwards + page = currentIndex === pages.length - 1 ? 0 : currentIndex + 1; + } + + const message = await getMessage(page); + + if (interaction.getUserId() === userId) { + currentIndex = page; + message.components = [new ActionRowBuilder(controller)]; + return context.reply(message); + } + + return interaction.sendFollowup({ + ...message, + components: [], + ephemeral: true, + }); + }); + } + + function onTimeout() { + for (const component of controller) { + listener.removeHook(component.getCustomId()); + } + context.reply({ components: [] }); + cache.clear(); + } + + setTimeout(onTimeout, timeout); + + const message = await getMessage(currentIndex); + message.components = [new ActionRowBuilder(controller)]; + + return message; +} + +async function contentToMessage( + content: PaginateInteractionContent, +): Promise { + if (content instanceof Message) return content; + if (content instanceof EmbedBuilder) + return new Message({ embeds: [content] }); + if (content instanceof Canvas) + return new Message({ + files: [ + { + name: "image.png", + data: await content.toBuffer("png"), + type: "image/png", + }, + ], + attachments: [], + }); + + return new Message(content); +} + +class PageController { + #menu: SelectMenuBuilder | ButtonBuilder[]; + + public constructor(pages: PageInput[], selected: number) { + if (pages.length > 5) { + const menu = new SelectMenuBuilder(); + + for (const [index, page] of pages.entries()) { + const option = new SelectMenuOptionBuilder() + .label(page.label) + .value(`${index}`); + if (page.emoji) option.emoji(page.emoji); + menu.option(option); + } + + menu.activeOption(selected); + this.#menu = menu; + } else { + this.#menu = pages.map((page, index) => { + const button = new ButtonBuilder() + .label(page.label) + .style(ButtonStyle.Secondary); + if (page.emoji) button.emoji(page.emoji); + if (index === selected) button.style(ButtonStyle.Primary); + return button; + }); + } + } + + public switchPage(index: number) { + if (this.#menu instanceof SelectMenuBuilder) { + this.#menu.activeOption(index); + return; + } + + for (const [i, button] of this.#menu.entries()) { + button.style(i === index ? ButtonStyle.Primary : ButtonStyle.Secondary); + } + } + + public getActionRow(): ActionRowBuilder { + if (this.#menu instanceof SelectMenuBuilder) + return new ActionRowBuilder([this.#menu]); + return new ActionRowBuilder(this.#menu); + } + + public register( + listener: AbstractCommandListener, + handler: ( + interaction: Interaction, + index: number, + ) => ReturnType, + ) { + if (this.#menu instanceof SelectMenuBuilder) { + return listener.addHook(this.#menu.getCustomId(), (interaction) => { + const index = Number(interaction.getData().values[0]); + return handler(interaction, index); + }); + } + + for (const [index, button] of this.#menu.entries()) { + listener.addHook(button.getCustomId(), (interaction) => + handler(interaction, index), + ); + } + } + + public unregister(listener: AbstractCommandListener) { + if (this.#menu instanceof SelectMenuBuilder) { + listener.removeHook(this.#menu.getCustomId()); + } else { + for (const button of this.#menu) { + listener.removeHook(button.getCustomId()); + } + } + } +} diff --git a/packages/discord/src/util/error.message.ts b/packages/discord/src/util/error.message.ts index 2858d0744..09c64741f 100644 --- a/packages/discord/src/util/error.message.ts +++ b/packages/discord/src/util/error.message.ts @@ -31,7 +31,7 @@ export class ErrorMessage extends Message { public constructor( title: LocalizationString, description: LocalizationString, - options?: ErrorMessageOptions + options?: ErrorMessageOptions, ); public constructor( titleOrKey: LocalizationString, @@ -41,7 +41,7 @@ export class ErrorMessage extends Message { thumbnail, buttons = [], color = STATUS_COLORS.error, - }: ErrorMessageOptions = {} + }: ErrorMessageOptions = {}, ) { const embed = new EmbedBuilder().color(color); @@ -59,16 +59,15 @@ export class ErrorMessage extends Message { if (image) { data.files = [image]; - embed.image(`attachment://${data.files[0].name}`); } else if (thumbnail) { data.files = [thumbnail]; - embed.thumbnail(`attachment://${data.files[0].name}`); } else { const errorIcon = readFileSync(getLogoPath("error", 52)); data.files = [{ name: "error.png", data: errorIcon, type: "image/png" }]; - embed.thumbnail(`attachment://${data.files[0].name}`); } + embed.thumbnail(`attachment://${data.files[0].name}`); + super(data); } } diff --git a/packages/discord/src/util/parse-discord-error.ts b/packages/discord/src/util/parse-discord-error.ts index 86f89bf46..2b5c1cce4 100644 --- a/packages/discord/src/util/parse-discord-error.ts +++ b/packages/discord/src/util/parse-discord-error.ts @@ -12,10 +12,9 @@ import type { RestClient } from "tiny-discord"; export const parseDiscordResponse = (response: RestClient.RequestResult): T => { if (response.headers["content-type"] !== "application/json") return noop(); - // @ts-ignore tiny-discord doesn't have a proper types yet + // @ts-expect-error tiny-discord doesn't have a proper types yet if (response.status >= 200 && response.status < 300) return response.body.json as T; - // @ts-ignore tiny-discord doesn't have a proper types yet const body = response.body.json as Record; let message = body.message; @@ -30,7 +29,7 @@ export const parseDiscordResponse = (response: RestClient.RequestResult): T = export const parseDiscordError = (error: any = {}, errorKey = ""): string => { if (typeof error.message === "string") - return `${errorKey.length ? `${errorKey} - ${error.code}` : `${error.code}`}: ${ + return `${errorKey.length > 0 ? `${errorKey} - ${error.code}` : `${error.code}`}: ${ error.message }`.trim(); @@ -47,8 +46,13 @@ export const parseDiscordError = (error: any = {}, errorKey = ""): string => { } if (typeof value === "string") message += value; - else if ("_errors" in value) - for (const error of value._errors) message += parseDiscordError(error, nextKey); + else if ("_errors" in value) { + // Discord's api uses dangling underscores when reporting errors + // oxlint-disable-next-line no-underscore-dangle + for (const error of value._errors) { + message += parseDiscordError(error, nextKey); + } + } else message += parseDiscordError(value, nextKey); } diff --git a/packages/discord/tsconfig.json b/packages/discord/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/discord/tsconfig.json +++ b/packages/discord/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/logger/eslint.config.js b/packages/logger/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/logger/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/logger/package.json b/packages/logger/package.json index c15f89f7c..f40ff474e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -6,13 +6,14 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "chalk": "5.6.0", "luxon": "^3.5.0" }, @@ -20,4 +21,4 @@ "@nestjs/common": "^11.1.6", "@types/luxon": "^3.4.2" } -} \ No newline at end of file +} diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index 1d9975ed6..d2f715e65 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -23,6 +23,15 @@ export const STATUS_COLORS = { fatal: 0x81181A, } as const; +const ColorByLogLevel: Record = { + debug: STATUS_COLORS.debug, + warn: STATUS_COLORS.warn, + error: STATUS_COLORS.error, + verbose: STATUS_COLORS.info, + log: STATUS_COLORS.success, + fatal: STATUS_COLORS.fatal, +}; + const isProduction = await config("environment") === "prod"; /** @@ -59,7 +68,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "log"); + Logger.printMessage(messages, context, "log"); } public error(message: any, context?: string): void; @@ -69,20 +78,22 @@ export class Logger implements LoggerService { return; } + let normalizedMessage = message; + if (message instanceof Error) { const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); transaction?.setStatus("internal_error"); Sentry.captureException(message); - message = message.stack; + normalizedMessage = message.stack; } const { messages, context } = this.getContextAndMessages([ - message, + normalizedMessage, ...optionalParameters, ]); - this.printMessage(messages, context, "error", "stderr", "๐Ÿ“‰"); + Logger.printMessage(messages, context, "error", "stderr", "๐Ÿ“‰"); } public warn(message: any, context?: string): void; @@ -97,7 +108,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "warn"); + Logger.printMessage(messages, context, "warn"); } public debug(message: any, context?: string): void; @@ -112,7 +123,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "debug"); + Logger.printMessage(messages, context, "debug"); } public verbose(message: any, context?: string): void; @@ -127,7 +138,7 @@ export class Logger implements LoggerService { ...optionalParameters, ]); - this.printMessage(messages, context, "verbose"); + Logger.printMessage(messages, context, "verbose"); } public fatal(message: any, context?: string): void; @@ -137,20 +148,22 @@ export class Logger implements LoggerService { return; } + let normalizedMessage = message; + if (message instanceof Error) { const transaction = Sentry.getCurrentHub().getScope()?.getTransaction(); transaction?.setStatus("internal_error"); Sentry.captureException(message); - message = message.stack; + normalizedMessage = message.stack; } const { messages, context } = this.getContextAndMessages([ - message, + normalizedMessage, ...optionalParameters, ]); - this.printMessage(messages, context, "fatal", "stderr", "๐Ÿ“‰"); + Logger.printMessage(messages, context, "fatal", "stderr", "๐Ÿ“‰"); } public setLogLevels(levels: LogLevel[]) { @@ -187,29 +200,7 @@ export class Logger implements LoggerService { return { messages, context: this.context }; } - private getColorByLogLevel(logLevel: LogLevel) { - switch (logLevel) { - case "debug": - return STATUS_COLORS.debug; - - case "warn": - return STATUS_COLORS.warn; - - case "error": - return STATUS_COLORS.error; - - case "verbose": - return STATUS_COLORS.info; - - case "log": - return STATUS_COLORS.success; - - case "fatal": - return STATUS_COLORS.fatal; - } - } - - private getTimeStamp() { + private static getTimeStamp() { if (isProduction) return DateTime.now().toFormat("h:mma"); const now = Date.now(); @@ -225,18 +216,18 @@ export class Logger implements LoggerService { return diff; } - private printMessage( + private static printMessage( messages: unknown[], context = "Default", logLevel: LogLevel = "log", writeStreamType: "stdout" | "stderr" = "stdout", icon = "๐Ÿ“ˆ" ) { - const color = this.getColorByLogLevel(logLevel); + const color = ColorByLogLevel[logLevel]; for (const message of messages) { const output = typeof message === "object" ? JSON.stringify(message) : message; - const timeStamp = this.getTimeStamp(); + const timeStamp = Logger.getTimeStamp(); const computedMessage = `${chalk.bold(`${icon}`)} ${chalk.hex(color.toString(16))( context @@ -247,6 +238,8 @@ export class Logger implements LoggerService { } } + + if (import.meta.vitest) { const { suite, it, expect, vi } = import.meta.vitest; diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/math/eslint.config.js b/packages/math/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/math/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/math/package.json b/packages/math/package.json index b7e1ae322..7f4d1b280 100644 --- a/packages/math/package.json +++ b/packages/math/package.json @@ -6,11 +6,12 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12" + "@swc/helpers": "^0.5.23" } -} \ No newline at end of file +} diff --git a/packages/math/src/index.ts b/packages/math/src/index.ts index 6a7dac212..1dbf1fa83 100644 --- a/packages/math/src/index.ts +++ b/packages/math/src/index.ts @@ -33,9 +33,9 @@ export const ratio = (n1 = 0, n2 = 0, multiply = 1) => { return roundTo(result * multiply); } else if (n1 === 0 && n2 === 0) { return 0; - } else { - return roundTo(n1 * multiply) || 0; } + return roundTo(n1 * multiply) || 0; + }; export const add = (...args: number[]): number => diff --git a/packages/math/tsconfig.json b/packages/math/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/math/tsconfig.json +++ b/packages/math/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/rendering/eslint.config.js b/packages/rendering/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/rendering/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/rendering/package.json b/packages/rendering/package.json index 8acf09b38..1a56658c8 100644 --- a/packages/rendering/package.json +++ b/packages/rendering/package.json @@ -15,16 +15,17 @@ }, "scripts": { "build": "swc src --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@sentry/node": "^7.118.0", "@statsify/assets": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "axios": "1.11.0", - "skia-canvas": "https://github.com/samizdatco/skia-canvas/releases/download/v0.9.30/skia-canvas-v0.9.30-linux-x64-glibc.tar.gz", + "skia-canvas": "3.0.8", "typedi": "^0.10.0" }, "imports": { @@ -49,4 +50,4 @@ "default": "./dist/jsx/index.js" } } -} \ No newline at end of file +} diff --git a/packages/rendering/src/colors/index.ts b/packages/rendering/src/colors/index.ts index af00d401d..17f3681e8 100644 --- a/packages/rendering/src/colors/index.ts +++ b/packages/rendering/src/colors/index.ts @@ -44,7 +44,7 @@ export const parseColor = (color: string): RGBA => { .split(")")[0] .split(",") .map((o) => +o) as RGBA; - } else { - return [0, 0, 0, 0]; } + + return [0, 0, 0, 0]; }; diff --git a/packages/rendering/src/font/font-renderer.ts b/packages/rendering/src/font/font-renderer.ts index bd5d6d775..ab54eacb4 100644 --- a/packages/rendering/src/font/font-renderer.ts +++ b/packages/rendering/src/font/font-renderer.ts @@ -8,10 +8,10 @@ import _positions from "../../positions.json" with { type: "json" }; import _sizes from "../../sizes.json" with { type: "json" }; -import { - type Canvas, - type CanvasRenderingContext2D, - type ImageData, +import type { + Canvas, + CanvasRenderingContext2D, + ImageData, } from "skia-canvas"; import { type TextNode, type Token, tokens } from "./tokens.js"; import { createCanvas } from "../canvas.js"; @@ -47,11 +47,13 @@ export class FontRenderer { public async loadImages(fontPath: string) { const files = await readdir(fontPath); - const pictures = files.filter((file) => file.endsWith(".png")); - - for (const file of pictures) { + const pictures = await Promise.all(files.filter((file) => file.endsWith(".png")).map(async (file) => { const image = await loadImage(join(fontPath, file)); + const id = file.replace("unicode_page_", "").replace(".png", ""); + return [id, image] as const; + })); + for (const [id, image] of pictures) { const canvas = createCanvas(image.width, image.height); const ctx = canvas.getContext("2d"); @@ -62,15 +64,12 @@ export class FontRenderer { this.canvases.set(ctx, canvas); this.scales.set(ctx, image.width / 256); - this.images.set( - file.replace("unicode_page_", "").replace(".png", ""), - ctx - ); + this.images.set(id, ctx); } } public measureText(nodes: TextNode[]): { width: number; height: number } { - if (!nodes.length) return { width: 0, height: 0 }; + if (nodes.length === 0) return { width: 0, height: 0 }; let width = 0; let largestSize = nodes[0].size; @@ -143,7 +142,7 @@ export class FontRenderer { const nodes: TextNode[] = []; for (const part of parts) { - if (!part.length) continue; + if (part.length === 0) continue; let token: Token | null = null; let matches: RegExpMatchArray | null = null; @@ -168,9 +167,9 @@ export class FontRenderer { if (matches) text = text.slice(matches[0].length); - state = { ...state, ...effect }; + Object.assign(state, effect); - if (!text.length) continue; + if (text.length === 0) continue; const node: TextNode = { ...state, @@ -268,7 +267,7 @@ export class FontRenderer { bold: boolean ) { // Minecraft has weird spacing for the space - let gap = size * (width + (char == " " ? -2 : 2) * scale); + let gap = size * (width + (char === " " ? -2 : 2) * scale); if (bold) { gap += scale * size; diff --git a/packages/rendering/src/hooks/useGradient.ts b/packages/rendering/src/hooks/useGradient.ts index 3e6b377f2..09fb2f7bf 100644 --- a/packages/rendering/src/hooks/useGradient.ts +++ b/packages/rendering/src/hooks/useGradient.ts @@ -34,7 +34,9 @@ export function useGradient( ctx.createLinearGradient(x, y, x + width, y) : ctx.createLinearGradient(x, y, x, y + height); - colors.forEach(([offset, color]) => gradient.addColorStop(offset, color)); + for (const [offset, color] of colors) { + gradient.addColorStop(offset, color); + } return gradient; }; diff --git a/packages/rendering/src/index.ts b/packages/rendering/src/index.ts index 1d20f2e01..64b7c22cf 100644 --- a/packages/rendering/src/index.ts +++ b/packages/rendering/src/index.ts @@ -6,7 +6,6 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -/* eslint-disable @typescript-eslint/no-namespace */ export * from "./colors/index.js"; export * from "./canvas.js"; export * from "./font/index.js"; @@ -18,10 +17,8 @@ import type * as JSXInternal from "./jsx/index.js"; declare global { namespace JSX { - // @ts-ignore Typescript for the love of god won't let me override this interface type IntrinsicElements = JSXInternal.IntrinsicProps; - // @ts-ignore Typescript for the love of god won't let me override this interface type Element = JSXInternal.ElementNode; type Children = JSXInternal.Children; diff --git a/packages/rendering/src/intrinsics/Box.ts b/packages/rendering/src/intrinsics/Box.ts index e375c0994..d65393802 100644 --- a/packages/rendering/src/intrinsics/Box.ts +++ b/packages/rendering/src/intrinsics/Box.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type CanvasRenderingContext2D } from "skia-canvas"; +import type { CanvasRenderingContext2D } from "skia-canvas"; import type * as JSX from "#jsx"; import type { DeferredGradient } from "#hooks"; diff --git a/packages/rendering/src/jsx-runtime/convert.ts b/packages/rendering/src/jsx-runtime/convert.ts index efe2a58b0..1b5747906 100644 --- a/packages/rendering/src/jsx-runtime/convert.ts +++ b/packages/rendering/src/jsx-runtime/convert.ts @@ -156,7 +156,7 @@ export const elementToNode = ( let nodeOtherLength = 0; - node.children.forEach((child) => { + for (const child of node.children) { sideData = gatherSideData(child, side, sideData); if (typeof child[other].size === "string" && child[other].size !== "remaining") { @@ -170,7 +170,7 @@ export const elementToNode = ( const childOtherLength = getTotalSize(child[other]); if (childOtherLength > nodeOtherLength) nodeOtherLength = childOtherLength; } - }); + } node[other].minSize = nodeOtherLength; node[side].minSize = processSideData(sideData); diff --git a/packages/rendering/src/jsx/create-instructions.ts b/packages/rendering/src/jsx/create-instructions.ts index cdfb7c8dc..b5e268c1e 100644 --- a/packages/rendering/src/jsx/create-instructions.ts +++ b/packages/rendering/src/jsx/create-instructions.ts @@ -67,7 +67,7 @@ export const createInstructions = ( node.children[i] = createInstructions(child, child.component ?? component); } - if (!remaining.length) return node as Instruction; + if (remaining.length === 0) return node as Instruction; const remainingSideLength = remainingSide / remaining.length; diff --git a/packages/rendering/src/jsx/render.ts b/packages/rendering/src/jsx/render.ts index 2dea261d8..b1e3a1e1b 100644 --- a/packages/rendering/src/jsx/render.ts +++ b/packages/rendering/src/jsx/render.ts @@ -7,7 +7,7 @@ */ import * as Sentry from "@sentry/node"; -import { type Canvas, type CanvasRenderingContext2D } from "skia-canvas"; +import type { Canvas, CanvasRenderingContext2D } from "skia-canvas"; import { Container } from "typedi"; import { FontRenderer } from "#font"; import { IntrinsicRenders, intrinsicRenders } from "./instrinsics.js"; @@ -22,7 +22,7 @@ import type { Theme, } from "./types.js"; -const _render = ( +const renderRecursive = ( ctx: CanvasRenderingContext2D, context: ComputedThemeContext, intrinsicElements: IntrinsicRenders, @@ -81,7 +81,7 @@ const _render = ( applyDelta(getPositionalDelta(instruction, side), side); - instruction.children.forEach((child) => { + for (const child of instruction.children) { const size = getTotalSize(child[side]); switch (child.style.align) { @@ -92,12 +92,12 @@ const _render = ( const centerDelta = (instruction[oppositeSide].size - oppositeSize) / 2; applyDelta(centerDelta, oppositeSide); - _render(ctx, context, intrinsicElements, child, x, y); + renderRecursive(ctx, context, intrinsicElements, child, x, y); applyDelta(-centerDelta, oppositeSide); break; } case "left": - _render(ctx, context, intrinsicElements, child, x, y); + renderRecursive(ctx, context, intrinsicElements, child, x, y); break; case "right": { const oppositeSide = side === "x" ? "y" : "x"; @@ -108,14 +108,14 @@ const _render = ( child[oppositeSide].padding2); applyDelta(delta, oppositeSide); - _render(ctx, context, intrinsicElements, child, x, y); + renderRecursive(ctx, context, intrinsicElements, child, x, y); applyDelta(-delta, oppositeSide); break; } } applyDelta(size, side); - }); + } }; export function render(node: ElementNode, theme?: Theme): Canvas { @@ -151,7 +151,7 @@ export function render(node: ElementNode, theme?: Theme): Canvas { if (!context.renderer) context.renderer = Container.get(FontRenderer); - _render( + renderRecursive( ctx, context, { ...intrinsicRenders, ...theme?.elements }, diff --git a/packages/rendering/tsconfig.json b/packages/rendering/tsconfig.json index ffd6d6582..6e5689bdc 100644 --- a/packages/rendering/tsconfig.json +++ b/packages/rendering/tsconfig.json @@ -6,7 +6,6 @@ "include": [ "src", "tests", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/schemas/eslint.config.js b/packages/schemas/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/schemas/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 5aac15176..bf915c65a 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -6,15 +6,16 @@ "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths --copy-files", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github" }, "dependencies": { "@nestjs/swagger": "^11.2.0", "@statsify/logger": "workspace:^", "@statsify/math": "workspace:^", "@statsify/util": "workspace:^", - "@swc/helpers": "^0.5.12", + "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", "class-validator": "^0.14.1", "luxon": "^3.5.0" @@ -52,4 +53,4 @@ "default": "./dist/player/gamemodes/prefixes.js" } } -} \ No newline at end of file +} diff --git a/packages/schemas/src/game/game-modes.ts b/packages/schemas/src/game/game-modes.ts index e499b8486..ff214e21e 100644 --- a/packages/schemas/src/game/game-modes.ts +++ b/packages/schemas/src/game/game-modes.ts @@ -53,7 +53,7 @@ export class GameModes { this.hypixelModes = Object.fromEntries( modes .map((m) => { - if (typeof m.hypixel !== "string") return undefined; + if (typeof m.hypixel !== "string") return; const formatted = m.formatted ?? prettify((m as { api: string }).api); return [m.hypixel, formatted] as const; }).filter((entry) => entry !== undefined) diff --git a/packages/schemas/src/guild/index.ts b/packages/schemas/src/guild/index.ts index 4642a47db..33c427164 100644 --- a/packages/schemas/src/guild/index.ts +++ b/packages/schemas/src/guild/index.ts @@ -113,7 +113,8 @@ export class Guild { public cached?: boolean; public constructor(data: APIData = {}) { - this.id = data._id; + // oxlint-disable-next-line no-underscore-dangle + this.id = data._id; // Hypixel uses MongoDB which has object id fields that start with an underscore this.name = data.name; this.nameToLower = this.name?.toLowerCase(); this.description = data.description; diff --git a/packages/schemas/src/guild/member.ts b/packages/schemas/src/guild/member.ts index b736413d4..2664a8f5f 100644 --- a/packages/schemas/src/guild/member.ts +++ b/packages/schemas/src/guild/member.ts @@ -62,14 +62,12 @@ export class GuildMember { this.weekly = 0; this.monthly = 0; - Object.entries(data.expHistory as Record).forEach( - ([day, exp], index) => { + for (const [index, [day, exp]] of Object.entries(data.expHistory as Record).entries()) { this.expHistory[index] = exp; this.expHistoryDays[index] = day; if (index === 0) this.daily = exp; this.weekly += exp; - } - ); + } } public static isGuildMaster(member: GuildMember): boolean { diff --git a/packages/schemas/src/guild/util.ts b/packages/schemas/src/guild/util.ts index a885376e6..df31f70c5 100644 --- a/packages/schemas/src/guild/util.ts +++ b/packages/schemas/src/guild/util.ts @@ -22,9 +22,7 @@ export const getLevel = (exp: number) => { let level = 0; for (let i = 0; i <= 1000; i += 1) { - let need = 0; - - need = i >= REQUIRED_GEXP.length ? REQUIRED_GEXP.at(-1)! : REQUIRED_GEXP[i]; + const need = i >= REQUIRED_GEXP.length ? REQUIRED_GEXP.at(-1)! : REQUIRED_GEXP[i]; if (exp - need < 0) return { diff --git a/packages/schemas/src/metadata/deserialize.ts b/packages/schemas/src/metadata/deserialize.ts index 4ad72b48d..ef4ee5852 100644 --- a/packages/schemas/src/metadata/deserialize.ts +++ b/packages/schemas/src/metadata/deserialize.ts @@ -7,14 +7,17 @@ */ import { type Constructor, type Flatten, unflatten } from "@statsify/util"; -import { MetadataScanner } from "./metadata-scanner.js"; +import { scanMetadata } from "./metadata-scanner.js"; import { roundTo } from "@statsify/math"; import type { FieldMetadata } from "./metadata.interface.js"; -export const deserialize = (constructor: Constructor, instance: Flatten): T => { - const metadataEntries = MetadataScanner.scan(constructor) as [ +export const deserialize = ( + constructor: Constructor, + instance: Flatten, +): T => { + const metadataEntries = scanMetadata(constructor) as [ keyof Flatten, - FieldMetadata + FieldMetadata, ][]; const deserialized: Flatten = {} as Flatten; @@ -35,7 +38,9 @@ export const deserialize = (constructor: Constructor, instance: Flatten // If the value is numimercal round it to 2 digits of precision if (typeof deserialized[key] === "number") - deserialized[key] = roundTo(deserialized[key] as unknown as number) as any; + deserialized[key] = roundTo( + deserialized[key] as unknown as number, + ) as any; } // Unflatten the object to return the original type diff --git a/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts b/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts index b82181c49..4f10a81b1 100644 --- a/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts +++ b/packages/schemas/src/metadata/field/get-leaderboard-metadata.ts @@ -13,7 +13,10 @@ import type { LeaderboardMetadata, TypeMetadata, } from "../metadata.interface.js"; -import type { HistoricalOptions, LeaderboardOptions } from "../field.options.js"; +import type { + HistoricalOptions, + LeaderboardOptions, +} from "../field.options.js"; const getLeaderboardName = (field: string) => { const ratioIndex = RATIOS.indexOf(field); @@ -55,9 +58,10 @@ export const getLeaderboardMetadata = ( typeMetadata: TypeMetadata, propertyKey: string, leaderboardOptions?: LeaderboardOptions, - historicalOptions?: HistoricalOptions + historicalOptions?: HistoricalOptions, ): { leaderboard: LeaderboardMetadata; historical: HistoricalMetadata } => { - const fieldName = leaderboardOptions?.fieldName ?? getLeaderboardName(propertyKey); + const fieldName = + leaderboardOptions?.fieldName ?? getLeaderboardName(propertyKey); const name = leaderboardOptions?.name ?? fieldName; const historicalFieldName = historicalOptions?.fieldName ?? fieldName; @@ -77,8 +81,6 @@ export const getLeaderboardMetadata = ( fieldName, name, }; - - historical = { ...leaderboard, fieldName: historicalFieldName, name: historicalName }; } else if (leaderboardOptions?.enabled === false) { leaderboard = { enabled: false, @@ -89,13 +91,6 @@ export const getLeaderboardMetadata = ( fieldName, name, }; - - historical = { - ...leaderboard, - ...historicalOptions, - fieldName: historicalFieldName, - name: historicalName, - }; } else { leaderboard = { enabled: true, @@ -107,17 +102,18 @@ export const getLeaderboardMetadata = ( additionalFields: leaderboardOptions?.additionalFields || [], extraDisplay: leaderboardOptions?.extraDisplay, formatter: leaderboardOptions?.formatter, - limit: leaderboardOptions?.limit ?? getDefaultLeaderboardLimit(propertyKey), + limit: + leaderboardOptions?.limit ?? getDefaultLeaderboardLimit(propertyKey), resetEvery: leaderboardOptions?.resetEvery, }; - - historical = { - ...leaderboard, - ...historicalOptions, - fieldName: historicalFieldName, - name: historicalName, - }; } + historical = { + ...leaderboard, + ...historicalOptions, + fieldName: historicalFieldName, + name: historicalName, + }; + return { leaderboard, historical }; }; diff --git a/packages/schemas/src/metadata/metadata-scanner.ts b/packages/schemas/src/metadata/metadata-scanner.ts index 070d47291..5a7d3ef1c 100644 --- a/packages/schemas/src/metadata/metadata-scanner.ts +++ b/packages/schemas/src/metadata/metadata-scanner.ts @@ -17,104 +17,109 @@ import type { Constructor } from "@statsify/util"; export type MetadataEntry = [string, FieldMetadata]; -export class MetadataScanner { - private static tokens: Map = new Map(); +const tokens = new Map(); - public static scan(target: Constructor) { - if (this.tokens.has(target)) return this.tokens.get(target)!; +export function scanMetadata(target: Constructor) { + if (tokens.has(target)) return tokens.get(target)!; - const metadata = this.getMetadataEntries(target); + const metadata = getMetadataEntries(target); - this.tokens.set(target, metadata); + tokens.set(target, metadata); - return metadata; - } - - private static getMetadataEntries( - constructor: Constructor, - base = "", - baseName = "" - ): MetadataEntry[] { - const classMetadata = Reflect.getMetadata( - METADATA_KEY, - constructor.prototype - ) as ClassMetadata; - - if (!classMetadata) return []; - - const entries = Object.entries(classMetadata); - const keys = Object.keys(classMetadata); - - const metadataEntries: MetadataEntry[] = []; - - entries.forEach(([key, value]) => { - const path = `${base ? `${base}.` : ""}${key}`; - const name = value.leaderboard.name ? - `${baseName ? `${baseName} ` : ""}${value.leaderboard.name}` : - baseName; - - const historicalName = value.historical.name ? - `${baseName ? `${baseName} ` : ""}${value.historical.name}` : - baseName; - - for (const ratio of LEADERBOARD_RATIO_KEYS) { - if (!ratio.includes(key)) continue; - - const remainingStats = ratio - .filter((r) => r !== key && keys.includes(r)) - .map((r) => `${base ? `${base}.` : ""}${r}`); - - if (!remainingStats.length) continue; - - value.leaderboard.additionalFields = remainingStats; - // TODO: Investigate if this is needed or if there is another way - // TODO: Does this break anything? - // ! This is needed for the ratios to work with sub modes - value.historical.additionalFields = remainingStats; - break; - } - - // Apply metadata to historical - if ( - !value.historical.additionalFields || - value.historical.additionalFields.length === 0 - ) - value.historical.additionalFields = value.leaderboard.additionalFields; + return metadata; +} - if (value.type.primitive || value.type.array) - return metadataEntries.push([ - path, - { - ...value, - leaderboard: { ...value.leaderboard, name }, - historical: { ...value.historical, name: historicalName }, - }, - ]); +function getMetadataEntries( + constructor: Constructor, + base = "", + baseName = "", +): MetadataEntry[] { + const classMetadata = Reflect.getMetadata( + METADATA_KEY, + constructor.prototype, + ) as ClassMetadata; + + if (!classMetadata) return []; + + const entries = Object.entries(classMetadata); + const keys = Object.keys(classMetadata); + + const metadataEntries: MetadataEntry[] = []; + + for (const [key, value] of entries) { + const path = `${base ? `${base}.` : ""}${key}`; + const name = value.leaderboard.name + ? `${baseName ? `${baseName} ` : ""}${value.leaderboard.name}` + : baseName; + + const historicalName = value.historical.name + ? `${baseName ? `${baseName} ` : ""}${value.historical.name}` + : baseName; + + for (const ratio of LEADERBOARD_RATIO_KEYS) { + if (!ratio.includes(key)) continue; + + const remainingStats = ratio + .filter((r) => r !== key && keys.includes(r)) + .map((r) => `${base ? `${base}.` : ""}${r}`); + + if (remainingStats.length === 0) continue; + + value.leaderboard.additionalFields = remainingStats; + // TODO: Investigate if this is needed or if there is another way + // TODO: Does this break anything? + // ! This is needed for the ratios to work with sub modes + value.historical.additionalFields = remainingStats; + break; + } + + // Apply metadata to historical + if ( + !value.historical.additionalFields || + value.historical.additionalFields.length === 0 + ) + value.historical.additionalFields = value.leaderboard.additionalFields; + + if (value.type.primitive || value.type.array) { + metadataEntries.push([ + path, + { + ...value, + leaderboard: { ...value.leaderboard, name }, + historical: { ...value.historical, name: historicalName }, + }, + ]); - // Carry the metadata down to the children - const subMetadataEntries = this.getMetadataEntries(value.type.type, path, name).map( - ([keyPath, metadata]) => { - if (!metadata.leaderboard.additionalFields?.length) - metadata.leaderboard.additionalFields = value.leaderboard.additionalFields; + continue; + } - if (!metadata.leaderboard.extraDisplay) - metadata.leaderboard.extraDisplay = value.leaderboard.extraDisplay; + // Carry the metadata down to the children + const subMetadataEntries = getMetadataEntries( + value.type.type, + path, + name, + ).map(([keyPath, metadata]) => { + if (!metadata.leaderboard.additionalFields?.length) + metadata.leaderboard.additionalFields = + value.leaderboard.additionalFields; - if (value.leaderboard.resetEvery && !metadata.leaderboard.resetEvery) - metadata.leaderboard.resetEvery = value.leaderboard.resetEvery; + if (!metadata.leaderboard.extraDisplay) + metadata.leaderboard.extraDisplay = value.leaderboard.extraDisplay; - if (!metadata.historical.additionalFields?.length) - metadata.historical.additionalFields = value.historical.additionalFields; + if (value.leaderboard.resetEvery && !metadata.leaderboard.resetEvery) + metadata.leaderboard.resetEvery = value.leaderboard.resetEvery; - return [keyPath, metadata] as MetadataEntry; - } - ); + if (!metadata.historical.additionalFields?.length) + metadata.historical.additionalFields = + value.historical.additionalFields; - metadataEntries.push(...subMetadataEntries); + return [keyPath, metadata] as MetadataEntry; }); - return metadataEntries; + metadataEntries.push(...subMetadataEntries); } + + return metadataEntries; } if (import.meta.vitest) { @@ -125,7 +130,9 @@ if (import.meta.vitest) { const stringMetadata = (name: string): FieldMetadata => { const lastIndexOfDot = name.lastIndexOf("."); - const fieldName = prettify(name.slice(Math.max(0, lastIndexOfDot === -1 ? 0 : lastIndexOfDot + 1))); + const fieldName = prettify( + name.slice(Math.max(0, lastIndexOfDot === -1 ? 0 : lastIndexOfDot + 1)), + ); return { leaderboard: { @@ -155,14 +162,14 @@ if (import.meta.vitest) { }; }; - suite("MetadataScanner", () => { + suite("Schema Metadata", () => { it("should read and write basic string metadata", () => { class Clazz { @Field() public fieldA: string; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ ["fieldA", stringMetadata("fieldA")], ]); }); @@ -173,7 +180,7 @@ if (import.meta.vitest) { public fieldA: number; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ [ "fieldA", { @@ -214,7 +221,7 @@ if (import.meta.vitest) { public fieldA: number; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ [ "fieldA", { @@ -250,7 +257,7 @@ if (import.meta.vitest) { public fieldA: string[]; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ [ "fieldA", { @@ -283,7 +290,7 @@ if (import.meta.vitest) { public fieldB: NestedClazz; } - expect(MetadataScanner.scan(Clazz)).toEqual([ + expect(scanMetadata(Clazz)).toEqual([ ["fieldA", stringMetadata("fieldA")], ["fieldB.fieldA", stringMetadata("fieldB.fieldA")], ["fieldB.fieldB.fieldA", stringMetadata("fieldB.fieldB.fieldA")], @@ -301,7 +308,7 @@ if (import.meta.vitest) { public fieldB: string; } - expect(MetadataScanner.scan(ChildClazz)).toEqual([ + expect(scanMetadata(ChildClazz)).toEqual([ ["fieldA", stringMetadata("fieldA")], ["fieldB", stringMetadata("fieldB")], ]); @@ -314,11 +321,13 @@ if (import.meta.vitest) { } class ParentClazz { - @Field({ leaderboard: { additionalFields: ["fieldA"], extraDisplay: "fieldA" } }) + @Field({ + leaderboard: { additionalFields: ["fieldA"], extraDisplay: "fieldA" }, + }) public fieldA: ChildClazz; } - const [[, { leaderboard }]] = MetadataScanner.scan(ParentClazz); + const [[, { leaderboard }]] = scanMetadata(ParentClazz); expect(leaderboard).toEqual({ enabled: true, diff --git a/packages/schemas/src/metadata/serialize.ts b/packages/schemas/src/metadata/serialize.ts index 71312d4a6..7f9416de2 100644 --- a/packages/schemas/src/metadata/serialize.ts +++ b/packages/schemas/src/metadata/serialize.ts @@ -6,17 +6,17 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { MetadataScanner } from "./metadata-scanner.js"; +import { scanMetadata } from "./metadata-scanner.js"; import type { Constructor, Flatten } from "@statsify/util"; import type { FieldMetadata } from "./metadata.interface.js"; export const serialize = ( constructor: Constructor, - instance: Flatten + instance: Flatten, ): Flatten => { - const metadataEntries = MetadataScanner.scan(constructor) as [ + const metadataEntries = scanMetadata(constructor) as [ keyof Flatten, - FieldMetadata + FieldMetadata, ][]; const serialized: Flatten = {} as Flatten; diff --git a/packages/schemas/src/player/gamemodes/duels/mode.ts b/packages/schemas/src/player/gamemodes/duels/mode.ts index 57cd014a0..9f218a630 100644 --- a/packages/schemas/src/player/gamemodes/duels/mode.ts +++ b/packages/schemas/src/player/gamemodes/duels/mode.ts @@ -37,7 +37,7 @@ export class BaseDuelsGameMode { this.wins = data[`${prefix}wins`]; this.losses = data[`${prefix}losses`]; - if (mode == "") { + if (mode === "") { this.winstreak = data.current_winstreak; this.bestWinstreak = data.best_overall_winstreak; } else { @@ -156,7 +156,7 @@ export class BridgeDuels { this.fours, new BridgeDuelsMode(data, "bridge_2v2v2v2"), new BridgeDuelsMode(data, "bridge_3v3v3v3"), - new BridgeDuelsMode(data, "capture_threes") + new BridgeDuelsMode(data, "capture_threes"), ); this.overall.winstreak = data.current_bridge_winstreak; @@ -164,7 +164,12 @@ export class BridgeDuels { PVPBaseDuelsGameMode.applyRatios(this.overall); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: "Bridge", data, @@ -200,7 +205,13 @@ export class MultiPVPDuelsGameMode { @Field() public doubles: BowPVPBaseDuelsGameMode; - public constructor(data: APIData, title: string, short: string, long: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + short: string, + long: string, + titleRequirement: TitleRequirement, + ) { this.solo = new BowPVPBaseDuelsGameMode(data, `${short}_duel`); this.doubles = new BowPVPBaseDuelsGameMode(data, `${short}_doubles`); @@ -210,7 +221,12 @@ export class MultiPVPDuelsGameMode { this.overall.bestWinstreak = data[`best_${long}_winstreak`]; this.overall.winstreak = data[`current_${long}_winstreak`]; - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: title, data, @@ -237,10 +253,20 @@ export class SinglePVPDuelsGameMode extends PVPBaseDuelsGameMode { @Field() public progression: Progression; - public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + mode: string, + titleRequirement: TitleRequirement, + ) { super(data, mode); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.wins, mode: title, data, @@ -258,7 +284,12 @@ export class SingleBowPVPDuelsGameMode extends SinglePVPDuelsGameMode { @Field() public shotsFired: number; - public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + mode: string, + titleRequirement: TitleRequirement, + ) { super(data, title, mode, titleRequirement); mode = mode ? `${mode}_` : mode; this.shotsFired = data[`${mode}bow_shots`]; @@ -278,10 +309,20 @@ export class SingleDuelsGameMode extends BaseDuelsGameMode { @Field() public progression: Progression; - public constructor(data: APIData, title: string, mode: string, titleRequirement: TitleRequirement) { + public constructor( + data: APIData, + title: string, + mode: string, + titleRequirement: TitleRequirement, + ) { super(data, mode); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.wins, mode: title, data, @@ -342,7 +383,12 @@ export class UHCDuels { this.fours = new BowPVPBaseDuelsGameMode(data, "uhc_four"); this.deathmatch = new BowPVPBaseDuelsGameMode(data, "uhc_meetup"); - this.overall = deepAdd(this.solo, this.doubles, this.fours, this.deathmatch); + this.overall = deepAdd( + this.solo, + this.doubles, + this.fours, + this.deathmatch, + ); this.overall.winstreak = data.current_uhc_winstreak; this.overall.bestWinstreak = data.best_uhc_winstreak; BowPVPBaseDuelsGameMode.applyRatios(this.overall); @@ -351,10 +397,15 @@ export class UHCDuels { data.uhc_duel_golden_apples_eaten, data.uhc_doubles_golden_apples_eaten, data.uhc_four_golden_apples_eaten, - data.uhc_meetu_golden_apples_eaten + data.uhc_meetu_golden_apples_eaten, ); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: "UHC", data, @@ -375,8 +426,16 @@ export class SkyWarsDuels extends MultiPVPDuelsGameMode { public constructor(data: APIData) { super(data, "SkyWars", "sw", "skywars", "default"); - const kit = data.sw_duels_kit_new3 ?? data.sw_duels_kit_new2 ?? data.sw_duels_kit_new ?? "none"; - this.kit = kit.replace("kit_", "").replaceAll("ranked_", "").replaceAll("mega_", "").replaceAll("defending_team_", ""); + const kit = + data.sw_duels_kit_new3 ?? + data.sw_duels_kit_new2 ?? + data.sw_duels_kit_new ?? + "none"; + this.kit = kit + .replace("kit_", "") + .replaceAll("ranked_", "") + .replaceAll("mega_", "") + .replaceAll("defending_team_", ""); } } @@ -501,7 +560,12 @@ export class BedwarsDuels { this.rush = new PVPBaseDuelsGameMode(data, "bedwars_two_one_duels_rush"); this.overall = new BedWarsDuelsOverallMode(data); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overall.wins, mode: "Bed Wars", data, @@ -562,7 +626,12 @@ export class SpleefDuels { this.bowSpleef = new BowSpleefDuelMode(data); this.overallWins = add(this.spleef.wins, this.bowSpleef.wins); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.overallWins, mode: "Spleef", data, @@ -604,7 +673,12 @@ export class MegaWallsDuels extends SinglePVPDuelsGameMode { PVPBaseDuelsGameMode.applyRatios(this); - const { titleFormatted, titleLevelFormatted, nextTitleLevelFormatted, progression } = getTitleAndProgression({ + const { + titleFormatted, + titleLevelFormatted, + nextTitleLevelFormatted, + progression, + } = getTitleAndProgression({ score: this.wins, mode: "Mega Walls", data, diff --git a/packages/schemas/src/player/gamemodes/murdermystery/index.ts b/packages/schemas/src/player/gamemodes/murdermystery/index.ts index f321ef0d0..7980274ee 100644 --- a/packages/schemas/src/player/gamemodes/murdermystery/index.ts +++ b/packages/schemas/src/player/gamemodes/murdermystery/index.ts @@ -87,9 +87,9 @@ const BRACKETS: Record string> = { }; const PREFIX_STAT: Record number | undefined> = { - random_cosmetic: () => undefined, - random_favorite_cosmetic: () => undefined, - prefixstat_none: () => undefined, + random_cosmetic: () => {}, + random_favorite_cosmetic: () => {}, + prefixstat_none: () => {}, prefixstat_classic_wins: (mm) => add(mm.classic.wins, mm.doubleUp.wins), prefixstat_infection_wins: (mm) => mm.infection.wins ?? 0, prefixstat_assassins_wins: (mm) => mm.assassins.wins ?? 0, diff --git a/packages/schemas/src/player/gamemodes/murdermystery/mode.ts b/packages/schemas/src/player/gamemodes/murdermystery/mode.ts index 547c120b5..3fe4ad413 100644 --- a/packages/schemas/src/player/gamemodes/murdermystery/mode.ts +++ b/packages/schemas/src/player/gamemodes/murdermystery/mode.ts @@ -234,7 +234,7 @@ export class MurderMysteryKnife { this.kind = data.active_knife_skin?.replace("knife_skin_", "") ?? "none"; if (this.kind === "random_cosmetic") { - let max: [string, number] | undefined = undefined; + let max; const knifes = Object.entries( data?.knifeSkinPrestiges?.xp ?? ({} as Record) diff --git a/packages/schemas/src/player/gamemodes/quests/util.ts b/packages/schemas/src/player/gamemodes/quests/util.ts index ddfdddd88..5468830f3 100644 --- a/packages/schemas/src/player/gamemodes/quests/util.ts +++ b/packages/schemas/src/player/gamemodes/quests/util.ts @@ -70,13 +70,13 @@ const processQuests = ( options: QuestOption[], fieldPrefix?: string ) => { - options.forEach((quest) => { + for (const quest of options) { const k = quest.propertyKey ?? quest.field; const field = fieldPrefix ? `${fieldPrefix}_${quest.field}` : quest.field; instance[k] = getQuestCountDuring(time, quests[field]); instance.total += instance[k] ?? 0; - }); + } }; const assignQuestMetadata = ( @@ -84,7 +84,7 @@ const assignQuestMetadata = ( time: QuestTime, options: QuestOption[] ) => { - options.forEach((quest) => { + for (const quest of options) { const hasOverall = quest.overall !== undefined; const canDisplayOverall = hasOverall && time === QuestTime.Overall; @@ -101,7 +101,7 @@ const assignQuestMetadata = ( }); decorator(constructor.prototype, quest.propertyKey ?? quest.field); - }); + } }; const questTotalFieldData = (game: FormattedGame, enabled = false) => ({ @@ -224,13 +224,13 @@ export function createQuestsInstance< [key: string]: Record; public constructor(data: APIData) { - modes.forEach(([game, quests]) => { + for (const [game, quests] of modes) { this[game] = new quests[time](data); - }); + } } } - modes.forEach(([gameName, quests]) => { + for (const [gameName, quests] of modes) { const GameModeClass = quests[time]; const decorator = Field({ @@ -240,7 +240,7 @@ export function createQuestsInstance< }); decorator(QuestInstance.prototype, gameName); - }); + } return QuestInstance as unknown as IQuestInstance; } diff --git a/packages/schemas/src/player/gamemodes/skywars/util.ts b/packages/schemas/src/player/gamemodes/skywars/util.ts index a56847c5b..7f122ce23 100644 --- a/packages/schemas/src/player/gamemodes/skywars/util.ts +++ b/packages/schemas/src/player/gamemodes/skywars/util.ts @@ -461,7 +461,7 @@ export function getFormattedLevel( selectedEmblem = selectedEmblem?.replace("emblem_", ""); let schemeKey: keyof typeof SCHEME_MAP; - let emblemKey: keyof typeof EMBLEM_MAP | undefined = undefined; + let emblemKey: keyof typeof EMBLEM_MAP; if (selectedScheme) { if (selectedScheme in SCHEME_MAP) { @@ -485,7 +485,7 @@ export function getFormattedLevel( emblemKey = "default"; } - const emblem = emblemKey ? EMBLEM_MAP[emblemKey] : undefined; + const emblem = EMBLEM_MAP[emblemKey]; const scheme = SCHEME_MAP[schemeKey]; return scheme(level, bold, underline, strikethrough, emblem); diff --git a/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts b/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts index 413a0f7dd..b95caf536 100644 --- a/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts +++ b/packages/schemas/src/player/gamemodes/woolgames/sheepwars.ts @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { type APIData } from "@statsify/util"; +import type { APIData } from "@statsify/util"; import { Field } from "#metadata"; import { ratio } from "@statsify/math"; diff --git a/packages/schemas/src/player/index.ts b/packages/schemas/src/player/index.ts index 28e39fc18..e1256f468 100644 --- a/packages/schemas/src/player/index.ts +++ b/packages/schemas/src/player/index.ts @@ -12,7 +12,12 @@ import { modelOptions as ModelOptions, Severity } from "@typegoose/typegoose"; import { PlayerSocials } from "./socials.js"; import { PlayerStats } from "./stats.js"; import { PlayerStatus } from "./status.js"; -import { PlayerUtil } from "./util.js"; +import { + getDisplayName, + getPlayerRank, + getPlusColor, + getRankColor, +} from "./util.js"; import type { APIData } from "@statsify/util"; @ModelOptions({ options: { allowMixed: Severity.ALLOW } }) @@ -34,7 +39,8 @@ export class Player { @Field({ docs: { - description: "The player's name with their rank color as seen in game lobbies", + description: + "The player's name with their rank color as seen in game lobbies", examples: ["ยงbj4cobi"], }, }) @@ -84,13 +90,13 @@ export class Player { this.username = data.displayname; this.usernameToLower = this.username?.toLowerCase(); - this.rank = PlayerUtil.getRank(data); - this.plusColor = PlayerUtil.getPlusColor(this.rank, data?.rankPlusColor); - this.prefixName = `${PlayerUtil.getRankColor(this.rank).toString()}${this.username}`; - this.displayName = PlayerUtil.getDisplayName( + this.rank = getPlayerRank(data); + this.plusColor = getPlusColor(this.rank, data?.rankPlusColor); + this.prefixName = `${getRankColor(this.rank).toString()}${this.username}`; + this.displayName = getDisplayName( this.username, this.rank, - this.plusColor.code + this.plusColor.code, ); this.socials = new PlayerSocials(data?.socialMedia?.links ?? {}); @@ -106,4 +112,4 @@ export * from "./gamemodes/index.js"; export * from "./socials.js"; export * from "./stats.js"; export * from "./status.js"; -export { rankMap } from "./util.js"; +export { RANK_MAP as rankMap } from "./util.js"; diff --git a/packages/schemas/src/player/status.ts b/packages/schemas/src/player/status.ts index b67c0dd58..663975432 100644 --- a/packages/schemas/src/player/status.ts +++ b/packages/schemas/src/player/status.ts @@ -25,12 +25,18 @@ function findLastAction(data: APIData): { action: string; time: number } { lastQuestStart = quest.active.started; } - if (quest.completions?.length && quest.completions.at(-1)?.time > lastQuestEnd) { + if ( + quest.completions?.length && + quest.completions.at(-1)?.time > lastQuestEnd + ) { lastQuestEnd = quest.completions.at(-1).time; } } - actions.push({ action: "QUEST_START", time: lastQuestStart }, { action: "QUEST_COMPLETED", time: lastQuestEnd }); + actions.push( + { action: "QUEST_START", time: lastQuestStart }, + { action: "QUEST_COMPLETED", time: lastQuestEnd }, + ); const allPets = data?.petStats ?? {}; @@ -42,7 +48,7 @@ function findLastAction(data: APIData): { action: string; time: number } { const thisPetTime = Math.max( pet?.THIRST?.timestamp ?? 0, pet?.EXERCISE?.timestamp ?? 0, - pet?.HUNGER?.timestamp ?? 0 + pet?.HUNGER?.timestamp ?? 0, ); if (thisPetTime > lastPetTime) { @@ -53,16 +59,19 @@ function findLastAction(data: APIData): { action: string; time: number } { // It really is not necessary to display which pet action was last done // Therefore just putting pet is explanation enough to the players last // known whereabouts. - actions.push({ action: "PET", time: lastPetTime }, { - action: "PET_JOURNEY", - time: data?.petJourneyTimestamp ?? 0, - }); + actions.push( + { action: "PET", time: lastPetTime }, + { + action: "PET_JOURNEY", + time: data?.petJourneyTimestamp ?? 0, + }, + ); if (data?.stats?.SkyWars) { // Lab modes are explained each first time any player enters the game // as well as when they click the book while in queue. const explains = Object.entries(data?.stats?.SkyWars).filter((e) => - e[0].endsWith("explained_last") + e[0].endsWith("explained_last"), ); if (explains.length > 0) { @@ -111,7 +120,7 @@ function findLastAction(data: APIData): { action: string; time: number } { { action: "PIT_TRADE", time: Math.max(...(pitProfile.trade_timestamps ?? [0])), - } + }, ); } @@ -133,14 +142,19 @@ function findLastAction(data: APIData): { action: string; time: number } { { action: "LOGOUT", time: data?.lastLogout ?? 0, - } + }, ); // This is good for tracking ap hunters who are playing games with very // little in the way of time stats in the game they are playing. if (data?.achievementRewardsNew) { - const rewardsArr: number[] = Object.values(data?.achievementRewardsNew ?? {}); - actions.push({ action: "ACHIEVEMENT_REWARD", time: Math.max(...rewardsArr) }); + const rewardsArr: number[] = Object.values( + data?.achievementRewardsNew ?? {}, + ); + actions.push({ + action: "ACHIEVEMENT_REWARD", + time: Math.max(...rewardsArr), + }); } // Many people who just wait in lobbies will be shown on this stat since they @@ -154,8 +168,13 @@ function findLastAction(data: APIData): { action: string; time: number } { if (data.stats) { const games = Object.values(data.stats); - const tourneyAds = games.map((g: any) => g.lastTourneyAd).filter((v) => !!v); - actions.push({ action: "TOURNAMENT_ADVERTISEMENT", time: Math.max(...tourneyAds) }); + const tourneyAds = games + .map((g: any) => g.lastTourneyAd) + .filter((v) => !!v); + actions.push({ + action: "TOURNAMENT_ADVERTISEMENT", + time: Math.max(...tourneyAds), + }); } // First login is used as a baseline due to it being literally the oldest timestamp @@ -198,6 +217,7 @@ export class PlayerStatus { public constructor(data: APIData) { // The first login provided by hypixel is not fully accurate for very old players, it is better to use the `_id` field + // oxlint-disable-next-line no-underscore-dangle this.firstLogin = Number.parseInt(data._id?.slice(0, 8) ?? 0, 16) * 1000; const lastAction = findLastAction(data); diff --git a/packages/schemas/src/player/util.ts b/packages/schemas/src/player/util.ts index 675ec8ae8..0ee5e9977 100644 --- a/packages/schemas/src/player/util.ts +++ b/packages/schemas/src/player/util.ts @@ -9,143 +9,143 @@ import { Color, type ColorCode, type ColorId } from "#color"; import type { APIData } from "@statsify/util"; -export const rankMap: Record string> = { +export const RANK_MAP: Record string> = { "MVP+": (plusColor) => `ยงb[MVP${plusColor}+ยงb]`, "MVP++": (plusColor) => `ยง6[MVP${plusColor}++ยง6]`, "bMVP++": (plusColor) => `ยงb[MVP${plusColor}++ยงb]`, - "MVP": () => "ยงb[MVP]", + MVP: () => "ยงb[MVP]", "VIP+": () => "ยงa[VIPยง6+ยงa]", - "VIP": () => "ยงa[VIP]", - "YOUTUBE": () => "ยงc[ยงfYOUTUBEยงc]", + VIP: () => "ยงa[VIP]", + YOUTUBE: () => "ยงc[ยงfYOUTUBEยงc]", "PIG+++": () => "ยงd[PIGยงb+++ยงd]", - "INNIT": () => "ยงd[INNIT]", - "GM": () => "ยง2[GM]", - "ADMIN": () => "ยงc[ADMIN]", - "OWNER": () => "ยงc[OWNER]", - "STAFF": () => "ยงc[ยง6แ‹žยงc]", - "MOJANG": () => "ยง6[MOJANG]", - "EVENTS": () => "ยง6[EVENTS]", - "DEFAULT": () => "ยง7", + INNIT: () => "ยงd[INNIT]", + GM: () => "ยง2[GM]", + ADMIN: () => "ยงc[ADMIN]", + OWNER: () => "ยงc[OWNER]", + STAFF: () => "ยงc[ยง6แ‹žยงc]", + MOJANG: () => "ยง6[MOJANG]", + EVENTS: () => "ยง6[EVENTS]", + DEFAULT: () => "ยง7", }; -/** - * A set of utility functions for getting things like `rank`, `displayName` and `plusColor` - */ -export class PlayerUtil { - public static getRank(data: APIData) { - let rank = "DEFAULT"; - - if (data.monthlyPackageRank || data.packageRank || data.newPackageRank) { - if (data.monthlyPackageRank === "SUPERSTAR") { - rank = data.monthlyPackageRank; - - if (data.monthlyRankColor && data.monthlyRankColor !== "GOLD") { - rank = "bMVP++"; - } - } else if (data.newPackageRank && data.newPackageRank !== "NONE") { - rank = data.newPackageRank; - } else if (data.packageRank && data.packageRank !== "NONE") { - rank = data.packageRank; - } - } +export function getPlayerRank(data: APIData) { + let rank = "DEFAULT"; - if (data.rank && data.rank !== "NORMAL") { - rank = data.rank; - } + if (data.monthlyPackageRank || data.packageRank || data.newPackageRank) { + if (data.monthlyPackageRank === "SUPERSTAR") { + rank = data.monthlyPackageRank; - if (data.prefix) { - rank = data.prefix.replace(/ยง.|\[|]/g, ""); + if (data.monthlyRankColor && data.monthlyRankColor !== "GOLD") { + rank = "bMVP++"; + } + } else if (data.newPackageRank && data.newPackageRank !== "NONE") { + rank = data.newPackageRank; + } else if (data.packageRank && data.packageRank !== "NONE") { + rank = data.packageRank; } + } - rank = this.replaceRank(rank); - - return rank.length === 0 ? "DEFAULT" : rank; + if (data.rank && data.rank !== "NORMAL") { + rank = data.rank; } - public static getPlusColor(rank: string, plusColor?: ColorId): Color { - const rankColorMap: Record = { - "MVP+": new Color("RED"), - "MVP++": new Color("RED"), - "bMVP++": new Color("RED"), - "MVP": new Color("AQUA"), - "VIP": new Color("GREEN"), - "VIP+": new Color("GOLD"), - "PIG+++": new Color("AQUA"), - }; + if (data.prefix) { + rank = data.prefix.replaceAll(/ยง.|\[|]/g, ""); + } - if (plusColor === undefined || rank === "PIG+++" || rank === "VIP") { - const rankColor: Color = rankColorMap[rank]; + rank = replaceRank(rank); - if (!rankColor) return new Color("GRAY"); + return rank.length === 0 ? "DEFAULT" : rank; +} - return rankColor; - } +const RANK_COLOR_MAP: Record = { + "MVP+": new Color("RED"), + "MVP++": new Color("RED"), + "bMVP++": new Color("RED"), + MVP: new Color("AQUA"), + VIP: new Color("GREEN"), + "VIP+": new Color("GOLD"), + "PIG+++": new Color("AQUA"), +}; - const rankColor = new Color(plusColor); +export function getPlusColor(rank: string, plusColor?: ColorId): Color { + if (plusColor === undefined || rank === "PIG+++" || rank === "VIP") { + const rankColor: Color = RANK_COLOR_MAP[rank]; if (!rankColor) return new Color("GRAY"); return rankColor; } - public static getRankColor(rank: string): Color { - switch (rank) { - case "STAFF": - case "YOUTUBE": - case "ADMIN": - case "OWNER": - case "SLOTH": - case "MCP": - case "MINISTER": - return new Color("RED"); - - case "PIG+++": - case "INNIT": - return new Color("LIGHT_PURPLE"); - - case "MOD": - case "GM": - return new Color("DARK_GREEN"); - - case "HELPER": - return new Color("BLUE"); - - case "BUILD TEAM": - return new Color("DARK_AQUA"); - - case "MVP++": - case "APPLE": - case "MOJANG": - case "EVENTS": - return new Color("GOLD"); - - case "MVP": - case "MVP+": - case "bMVP++": - return new Color("AQUA"); - - case "VIP": - case "VIP+": - return new Color("GREEN"); - - default: - return new Color("GRAY"); - } - } + const rankColor = new Color(plusColor); - public static getDisplayName(username: string, rank: string, plusColor: ColorCode) { - const colorRank = rankMap[rank](plusColor); - return `${colorRank}${colorRank === "ยง7" ? "" : " "}${username}`; - } + if (!rankColor) return new Color("GRAY"); + + return rankColor; +} - private static replaceRank(rank: string) { - return rank - .replace("SUPERSTAR", "MVP++") - .replace("VIP_PLUS", "VIP+") - .replace("MVP_PLUS", "MVP+") - .replace("MODERATOR", "MOD") - .replace("GAME_MASTER", "GM") - .replace("YOUTUBER", "YOUTUBE") - .replace("NONE", ""); +export function getRankColor(rank: string): Color { + switch (rank) { + case "STAFF": + case "YOUTUBE": + case "ADMIN": + case "OWNER": + case "SLOTH": + case "MCP": + case "MINISTER": + return new Color("RED"); + + case "PIG+++": + case "INNIT": + return new Color("LIGHT_PURPLE"); + + case "MOD": + case "GM": + return new Color("DARK_GREEN"); + + case "HELPER": + return new Color("BLUE"); + + case "BUILD TEAM": + return new Color("DARK_AQUA"); + + case "MVP++": + case "APPLE": + case "MOJANG": + case "EVENTS": + return new Color("GOLD"); + + case "MVP": + case "MVP+": + case "bMVP++": + return new Color("AQUA"); + + case "VIP": + case "VIP+": + return new Color("GREEN"); + + default: + return new Color("GRAY"); } } + +export function getDisplayName( + username: string, + rank: string, + plusColor: ColorCode, +) { + const rankFormatter = rank in RANK_MAP ? RANK_MAP[rank] : RANK_MAP.DEFAULT; + const coloredRank = rankFormatter(plusColor); + return `${coloredRank}${coloredRank === "ยง7" ? "" : " "}${username}`; +} + +function replaceRank(rank: string) { + return rank + .replace("SUPERSTAR", "MVP++") + .replace("VIP_PLUS", "VIP+") + .replace("MVP_PLUS", "MVP+") + .replace("MODERATOR", "MOD") + .replace("GAME_MASTER", "GM") + .replace("YOUTUBER", "YOUTUBE") + .replace("NONE", ""); +} diff --git a/packages/schemas/src/util/create-historical-player.ts b/packages/schemas/src/util/create-historical-player.ts index c7642e524..8601cb3b2 100644 --- a/packages/schemas/src/util/create-historical-player.ts +++ b/packages/schemas/src/util/create-historical-player.ts @@ -15,33 +15,41 @@ export function createHistoricalPlayer(oldOne: T, newOne: T): T { const keys = Object.keys({ ...oldOne, ...(newOne as any) }); - for (const _key of keys) { - const key = _key as keyof T; + for (const untypedKey of keys) { + const key = untypedKey as keyof T; const newOneType = typeof newOne[key]; if (typeof oldOne[key] === "number" || newOneType === "number") { - const ratioIndex = RATIOS.indexOf(_key); + const ratioIndex = RATIOS.indexOf(untypedKey); if (ratioIndex === -1) { merged[key] = sub( newOne[key] as unknown as number, - oldOne[key] as unknown as number + oldOne[key] as unknown as number, ) as unknown as T[keyof T]; } else { const numerator = sub( - newOne[RATIO_STATS[ratioIndex][0] as unknown as keyof T] as unknown as number, - oldOne[RATIO_STATS[ratioIndex][0] as unknown as keyof T] as unknown as number + newOne[ + RATIO_STATS[ratioIndex][0] as unknown as keyof T + ] as unknown as number, + oldOne[ + RATIO_STATS[ratioIndex][0] as unknown as keyof T + ] as unknown as number, ); const denominator = sub( - newOne[RATIO_STATS[ratioIndex][1] as unknown as keyof T] as unknown as number, - oldOne[RATIO_STATS[ratioIndex][1] as unknown as keyof T] as unknown as number + newOne[ + RATIO_STATS[ratioIndex][1] as unknown as keyof T + ] as unknown as number, + oldOne[ + RATIO_STATS[ratioIndex][1] as unknown as keyof T + ] as unknown as number, ); merged[key] = ratio( numerator, denominator, - RATIO_STATS[ratioIndex][4] ?? 1 + RATIO_STATS[ratioIndex][4] ?? 1, ) as unknown as T[keyof T]; } } else if (newOneType === "string") { @@ -52,7 +60,10 @@ export function createHistoricalPlayer(oldOne: T, newOne: T): T { continue; } - merged[key] = createHistoricalPlayer(oldOne[key] ?? {}, newOne[key] ?? {}) as unknown as T[keyof T]; + merged[key] = createHistoricalPlayer( + oldOne[key] ?? {}, + newOne[key] ?? {}, + ) as unknown as T[keyof T]; } } diff --git a/packages/schemas/src/util/historical-scanner.ts b/packages/schemas/src/util/historical-scanner.ts deleted file mode 100644 index 8cde98115..000000000 --- a/packages/schemas/src/util/historical-scanner.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { - type HistoricalEnabledMetadata, - type HistoricalMetadata, - type MetadataEntry, - MetadataScanner, -} from "#metadata"; -import { parseAdditionalFields } from "./parse-fields.js"; -import type { Constructor } from "@statsify/util"; - -export class HistoricalScanner { - public static getHistoricalMetadata(constructor: Constructor) { - const metadata = MetadataScanner.scan(constructor); - - const fields = metadata.filter(([, { historical }]) => historical.enabled); - - return fields; - } - - public static getHistoricalFields(constructor: Constructor) { - return this.getHistoricalMetadata(constructor); - } - - public static getHistoricalField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled?: true - ): HistoricalEnabledMetadata; - public static getHistoricalField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled: false - ): HistoricalMetadata; - public static getHistoricalField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled = true - ): HistoricalMetadata { - const field: MetadataEntry | undefined = MetadataScanner.scan(constructor).find( - ([k]) => k === key - ); - if (!field) throw new Error(`${key} is not a field for ${constructor.name}`); - - const [, { historical }] = field; - - if (!historical.enabled && leaderboardMustBeEnabled) - throw new Error( - `${key} is not a historical leaderboard field for ${constructor.name}` - ); - - if (Array.isArray(historical.additionalFields)) { - historical.additionalFields = historical.additionalFields.map( - parseAdditionalFields.bind(this, key) - ); - } - - return historical; - } -} diff --git a/packages/schemas/src/util/index.ts b/packages/schemas/src/util/index.ts index 810c76679..87b5d83fc 100644 --- a/packages/schemas/src/util/index.ts +++ b/packages/schemas/src/util/index.ts @@ -8,4 +8,3 @@ export * from "./leaderboard-scanner.js"; export * from "./create-historical-player.js"; -export * from "./historical-scanner.js"; diff --git a/packages/schemas/src/util/leaderboard-scanner.ts b/packages/schemas/src/util/leaderboard-scanner.ts index 8dd402a05..4260ace0b 100644 --- a/packages/schemas/src/util/leaderboard-scanner.ts +++ b/packages/schemas/src/util/leaderboard-scanner.ts @@ -9,57 +9,60 @@ import { type LeaderboardEnabledMetadata, type LeaderboardMetadata, - MetadataScanner, + scanMetadata, } from "#metadata"; import { parseAdditionalFields } from "./parse-fields.js"; import type { Constructor } from "@statsify/util"; -export class LeaderboardScanner { - public static getLeaderboardFields(constructor: Constructor) { - const metadata = MetadataScanner.scan(constructor); +export function getLeaderboardFields(constructor: Constructor) { + const metadata = scanMetadata(constructor); - const fields = metadata.filter(([, { leaderboard }]) => leaderboard.enabled); + const fields = metadata.filter(([, { leaderboard }]) => leaderboard.enabled); - return fields; - } + return fields; +} - public static getLeaderboardField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled?: true - ): LeaderboardEnabledMetadata; - public static getLeaderboardField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled: false - ): LeaderboardMetadata; - public static getLeaderboardField( - constructor: Constructor, - key: string, - leaderboardMustBeEnabled = true - ): LeaderboardMetadata { - const metadata = MetadataScanner.scan(constructor); +export function getLeaderboardField( + constructor: Constructor, + key: string, + leaderboardMustBeEnabled?: true, +): LeaderboardEnabledMetadata; +export function getLeaderboardField( + constructor: Constructor, + key: string, + leaderboardMustBeEnabled: false, +): LeaderboardMetadata; +export function getLeaderboardField( + constructor: Constructor, + key: string, + leaderboardMustBeEnabled = true, +): LeaderboardMetadata { + const metadata = scanMetadata(constructor); - const field = metadata.find(([k]) => k === key); + const field = metadata.find(([k]) => k === key); - if (!field) throw new Error(`${key} is not a field for ${constructor.name}`); + if (!field) throw new Error(`${key} is not a field for ${constructor.name}`); - const [, { store, leaderboard }] = field; + const [, { store, leaderboard }] = field; - if (!leaderboard.enabled && leaderboardMustBeEnabled) - throw new Error(`${key} is not a leaderboard field for ${constructor.name}`); + if (!leaderboard.enabled && leaderboardMustBeEnabled) + throw new Error( + `${key} is not a leaderboard field for ${constructor.name}`, + ); - leaderboard.default = store.default; + leaderboard.default = store.default; - if (Array.isArray(leaderboard.additionalFields)) { - leaderboard.additionalFields = leaderboard.additionalFields.map( - parseAdditionalFields.bind(this, key) - ); - } + if (Array.isArray(leaderboard.additionalFields)) { + leaderboard.additionalFields = leaderboard.additionalFields.map( + parseAdditionalFields.bind(null, key), + ); + } - if (leaderboard.extraDisplay) - leaderboard.extraDisplay = parseAdditionalFields(key, leaderboard.extraDisplay); + if (leaderboard.extraDisplay) + leaderboard.extraDisplay = parseAdditionalFields( + key, + leaderboard.extraDisplay, + ); - return leaderboard; - } + return leaderboard; } diff --git a/packages/schemas/src/util/parse-fields.ts b/packages/schemas/src/util/parse-fields.ts index d4782b424..51e2e5b30 100644 --- a/packages/schemas/src/util/parse-fields.ts +++ b/packages/schemas/src/util/parse-fields.ts @@ -15,7 +15,7 @@ export function parseAdditionalFields(field: string, additionalKey: string) { const additionalFieldParts = additionalKey.split(".").slice(1); const ending = additionalFieldParts.pop(); - if (!additionalFieldParts.length) return [...fieldParts, ending].join("."); + if (additionalFieldParts.length === 0) return [...fieldParts, ending].join("."); const splitIndex = fieldParts.findIndex((part) => additionalFieldParts.includes(part)); diff --git a/packages/schemas/tsconfig.json b/packages/schemas/tsconfig.json index b1633af34..08154a472 100644 --- a/packages/schemas/tsconfig.json +++ b/packages/schemas/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src", - "eslint.config.js", "vitest.config.ts" ] } \ No newline at end of file diff --git a/packages/skin-renderer/index.cjs b/packages/skin-renderer/index.cjs index 3ea3c1b6d..f404ee093 100644 --- a/packages/skin-renderer/index.cjs +++ b/packages/skin-renderer/index.cjs @@ -3,9 +3,6 @@ // @ts-nocheck /* auto-generated by NAPI-RS */ -const { createRequire } = require('node:module') -require = createRequire(__filename) - const { readFileSync } = require('node:fs') let nativeBinding = null const loadErrors = [] @@ -66,7 +63,7 @@ const isMuslFromChildProcess = () => { function requireNative() { if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) { try { - nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); + return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); } catch (err) { loadErrors.push(err) } @@ -108,7 +105,24 @@ function requireNative() { } } else if (process.platform === 'win32') { if (process.arch === 'x64') { + if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') { + try { + return require('./skin-renderer.win32-x64-gnu.node') + } catch (e) { + loadErrors.push(e) + } try { + const binding = require('@statsify/skin-renderer-win32-x64-gnu') + const bindingPackageVersion = require('@statsify/skin-renderer-win32-x64-gnu/package.json').version + if (bindingPackageVersion !== '0.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding + } catch (e) { + loadErrors.push(e) + } + } else { + try { return require('./skin-renderer.win32-x64-msvc.node') } catch (e) { loadErrors.push(e) @@ -123,6 +137,7 @@ function requireNative() { } catch (e) { loadErrors.push(e) } + } } else if (process.arch === 'ia32') { try { return require('./skin-renderer.win32-ia32-msvc.node') @@ -348,6 +363,40 @@ function requireNative() { loadErrors.push(e) } } + } else if (process.arch === 'loong64') { + if (isMusl()) { + try { + return require('./skin-renderer.linux-loong64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + const binding = require('@statsify/skin-renderer-linux-loong64-musl') + const bindingPackageVersion = require('@statsify/skin-renderer-linux-loong64-musl/package.json').version + if (bindingPackageVersion !== '0.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./skin-renderer.linux-loong64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + const binding = require('@statsify/skin-renderer-linux-loong64-gnu') + const bindingPackageVersion = require('@statsify/skin-renderer-linux-loong64-gnu/package.json').version + if (bindingPackageVersion !== '0.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { + throw new Error(`Native binding package version mismatch, expected 0.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) + } + return binding + } catch (e) { + loadErrors.push(e) + } + } } else if (process.arch === 'riscv64') { if (isMusl()) { try { @@ -476,23 +525,47 @@ function requireNative() { nativeBinding = requireNative() -if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { +// NAPI_RS_FORCE_WASI is a tri-state flag: +// unset / any other value โ†’ native binding preferred, WASI is only a fallback +// 'true' โ†’ force WASI fallback even if native loaded +// 'error' โ†’ force WASI and throw if no WASI binding is found +// Treating any non-empty string as truthy (the historical behavior) meant +// NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered +// the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file. +const forceWasi = + process.env.NAPI_RS_FORCE_WASI === 'true' || process.env.NAPI_RS_FORCE_WASI === 'error' + +if (!nativeBinding || forceWasi) { + let wasiBinding = null + let wasiBindingError = null try { - nativeBinding = require('./skin-renderer.wasi.cjs') + wasiBinding = require('./skin-renderer.wasi.cjs') + nativeBinding = wasiBinding } catch (err) { - if (process.env.NAPI_RS_FORCE_WASI) { - loadErrors.push(err) + if (forceWasi) { + wasiBindingError = err } } - if (!nativeBinding) { + if (!nativeBinding || forceWasi) { try { - nativeBinding = require('@statsify/skin-renderer-wasm32-wasi') + wasiBinding = require('@statsify/skin-renderer-wasm32-wasi') + nativeBinding = wasiBinding } catch (err) { - if (process.env.NAPI_RS_FORCE_WASI) { + if (forceWasi) { + if (!wasiBindingError) { + wasiBindingError = err + } else { + wasiBindingError.cause = err + } loadErrors.push(err) } } } + if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) { + const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error') + error.cause = wasiBindingError + throw error + } } if (!nativeBinding) { @@ -501,7 +574,12 @@ if (!nativeBinding) { `Cannot find native binding. ` + `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` + 'Please try `npm i` again after removing both package-lock.json and node_modules directory.', - { cause: loadErrors } + { + cause: loadErrors.reduce((err, cur) => { + cur.cause = err + return cur + }), + }, ) } throw new Error(`Failed to load native binding`) diff --git a/packages/skin-renderer/package.json b/packages/skin-renderer/package.json index 9368536c3..bc370d329 100644 --- a/packages/skin-renderer/package.json +++ b/packages/skin-renderer/package.json @@ -19,7 +19,8 @@ "build:napi:debug": "napi build --platform && mv index.js index.cjs", "build:wasm": "wasm-pack build --target web --release", "build:wasm:debug": "wasm-pack build --target web --dev", - "lint": "cargo fmt && cargo clippy --fix --allow-dirty" + "lint": "cargo fmt && cargo clippy --fix --allow-dirty", + "lint:ci": "cargo fmt && cargo clippy --fix --allow-dirty" }, "napi": { "binaryName": "skin-renderer", @@ -39,4 +40,4 @@ ] } } -} \ No newline at end of file +} diff --git a/packages/util/eslint.config.js b/packages/util/eslint.config.js deleted file mode 100644 index 3325f85ed..000000000 --- a/packages/util/eslint.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineConfig } from "../../eslint.config.js"; - -export default defineConfig({ tsconfigDirName: import.meta.dirname }); diff --git a/packages/util/package.json b/packages/util/package.json index a14ebe2b3..96b6e641a 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,15 +1,17 @@ { "name": "@statsify/util", "version": "0.0.0", + "type": "module", "main": "dist/index.js", "types": "src/index.ts", - "type": "module", "scripts": { "build": "swc src --config-file ../../.swcrc --out-dir dist --strip-leading-paths", - "test:types": "tsc --noEmit", - "lint": "eslint" + "typecheck": "tsgo --noEmit", + "lint": "oxlint", + "lint:ci": "oxlint --format=github", + "fmt": "oxfmt" }, "dependencies": { - "@swc/helpers": "^0.5.12" + "@swc/helpers": "^0.5.23" } -} \ No newline at end of file +} diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index 4d968fcdb..c2bf731f8 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -11,7 +11,7 @@ import { existsSync } from "node:fs"; import { fileURLToPath } from "node:url"; import type { DeepFlatten } from "./flatten.js"; -const __dirname = dirname(fileURLToPath(import.meta.url)); +const directory = import.meta.dirname; export interface Config { database: { @@ -246,7 +246,12 @@ async function loadConfig(): Promise<{ default: Config }> { database: { mongoUri: "", redisUrl: "" }, hypixelApi: { key: "", timeout: 5000 }, api: { port: 3000, mediaRoot: "" }, - discordBot: { publicKey: "", token: "", applicationId: "", testingGuild: "" }, + discordBot: { + publicKey: "", + token: "", + applicationId: "", + testingGuild: "", + }, supportBot: { createTicketChannel: "", ticketLogsChannel: "", @@ -276,16 +281,16 @@ async function loadConfig(): Promise<{ default: Config }> { }; } - if (existsSync(join(__dirname, "../../../config.json"))) { - return import(join(__dirname, "../../../config.json")); - } else if (existsSync(join(__dirname, "../../../config.js"))) { - return import(join(__dirname, "../../../config.js")); - } else { - throw new Error("No config file detected!"); + if (existsSync(join(directory, "../../../config.json"))) { + return import(join(directory, "../../../config.json")); + } else if (existsSync(join(directory, "../../../config.js"))) { + return import(join(directory, "../../../config.js")); } + throw new Error("No config file detected!"); + } -let cfg: Config | undefined = undefined; +let cfg: Config; export interface ConfigOptions { required?: boolean; @@ -294,12 +299,11 @@ export interface ConfigOptions { export const config = async ( key: T, - { required = true, default: defaultValue }: ConfigOptions = {} + { required = true, default: defaultValue }: ConfigOptions = {}, ): Promise => { // Don't load the config while testing if (process.env.VITEST) return defaultValue as FlatConfig[T]; - if (!cfg) - cfg = await loadConfig().then((c) => c.default); + if (!cfg) cfg = await loadConfig().then((c) => c.default); const value = (key as string).split(".").reduce((a: any, b) => a?.[b], cfg) || undefined; @@ -313,7 +317,7 @@ export const config = async ( throw new Error( `Missing required environment variable: ${key as string} | Add ${ key as string - } to your config` + } to your config`, ); } diff --git a/packages/util/src/flatten.ts b/packages/util/src/flatten.ts index 0b3d26003..9f296cfe1 100644 --- a/packages/util/src/flatten.ts +++ b/packages/util/src/flatten.ts @@ -44,10 +44,10 @@ export type DeepFlatten = { */ export const flatten = (data: T, prefix = "", dest: APIData = {}): Flatten => { if (isObject(data)) { - Object.keys(data ?? {}).forEach((key) => { + for (const key of Object.keys(data ?? {})) { const tmpPrefix = prefix.length > 0 ? `${prefix}.${key}` : prefix + key; flatten(data[key as keyof T], tmpPrefix, dest); - }); + } } else { dest[prefix] = data; } diff --git a/packages/util/src/types.ts b/packages/util/src/types.ts index c3265fb76..5911d64cf 100644 --- a/packages/util/src/types.ts +++ b/packages/util/src/types.ts @@ -10,7 +10,7 @@ export type APIData = Record; export type RemoveMethods = Pick< T, - // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + // oxlint-disable-next-line no-unsafe-function-type { [Key in keyof T]: T[Key] extends Function ? never : Key }[keyof T] >; diff --git a/packages/util/src/unflatten.ts b/packages/util/src/unflatten.ts index 79271abda..98f650c45 100644 --- a/packages/util/src/unflatten.ts +++ b/packages/util/src/unflatten.ts @@ -20,9 +20,9 @@ export const unflatten = (instance: Flatten): T => { const result: APIData = {}; const obj = instance as APIData; - Object.keys(obj).forEach((k) => { - if (k.includes(".")) { - const path = k.split("."); + for (const key of Object.keys(obj)) { + if (key.includes(".")) { + const path = key.split("."); const x = path.pop(); const body = path.reduce((cur, p) => { @@ -30,11 +30,11 @@ export const unflatten = (instance: Flatten): T => { return cur[p]; }, result); - body[x ?? ""] = obj[k]; + body[x ?? ""] = obj[key]; } else { - result[k] = obj[k]; + result[key] = obj[key]; } - }); + } return result as T; }; diff --git a/packages/util/src/util.ts b/packages/util/src/util.ts index b217009e3..064aef4f3 100644 --- a/packages/util/src/util.ts +++ b/packages/util/src/util.ts @@ -86,28 +86,30 @@ export const romanNumeral = (num: number): string => { }; export const prettify = (s: string): string => { - if (/[a-z]/gi.test(s) && s === s.toUpperCase()) { - s = s.toLowerCase(); + let formatted = s; + + if (/[a-z]/gi.test(formatted) && formatted === formatted.toUpperCase()) { + formatted = formatted.toLowerCase(); } // Convert camelCase to Snake_Case (if applicable) if (!["_", " "].some((l) => s.includes(l))) { - s = - s.charAt(0).toLowerCase() + - s.slice(1).replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`); + formatted = + formatted.charAt(0).toLowerCase() + + formatted.slice(1).replaceAll(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`); } // Convert snake_case to Title Case - return s + return formatted .replaceAll("_", " ") - .replace( + .replaceAll( /\w\S*/g, (t) => t.charAt(0).toUpperCase() + t.slice(1).toLowerCase() ); }; export const removeFormatting = (s: string): string => - s.replace(/ยง#([A-Fa-f0-9]{6})|ยง./gm, ""); + s.replaceAll(/ยง#([A-Fa-f0-9]{6})|ยง./gm, ""); export interface FormatTimeOptions { /** diff --git a/packages/util/tsconfig.json b/packages/util/tsconfig.json index b1633af34..1da8cb9e2 100644 --- a/packages/util/tsconfig.json +++ b/packages/util/tsconfig.json @@ -1,8 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": [ - "src", - "eslint.config.js", - "vitest.config.ts" - ] -} \ No newline at end of file + "include": ["src", "vitest.config.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e289028fb..03e8e2a0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,88 +4,61 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - skia-canvas: 3.0.8 - importers: .: devDependencies: - '@commitlint/cli': - specifier: ^19.6.1 - version: 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - '@commitlint/config-conventional': - specifier: ^19.6.0 - version: 19.8.1 - '@eslint/js': - specifier: ^9.19.0 - version: 9.34.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + version: 1.0.2(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3) '@napi-rs/cli': - specifier: ^3.1.5 - version: 3.1.5(@emnapi/runtime@1.7.1)(@types/node@24.3.0) + specifier: ^3.7.0 + version: 3.7.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)(@types/node@25.9.1) '@rollup/pluginutils': specifier: ^5.1.0 - version: 5.2.0(rollup@4.49.0) - '@stylistic/eslint-plugin': - specifier: ^5.2.3 - version: 5.2.3(eslint@9.34.0(jiti@2.6.1)) + version: 5.4.0(rollup@4.61.0) '@swc/cli': - specifier: ^0.7.8 - version: 0.7.8(@swc/core@1.13.5(@swc/helpers@0.5.17)) + specifier: ^0.8.1 + version: 0.8.1(@swc/core@1.15.40(@swc/helpers@0.5.23)) '@swc/core': - specifier: 1.13.5 - version: 1.13.5(@swc/helpers@0.5.17) - '@types/eslint__js': - specifier: ^9.14.0 - version: 9.14.0 + specifier: 1.15.40 + version: 1.15.40(@swc/helpers@0.5.23) '@types/node': - specifier: ^24.3.0 - version: 24.3.0 + specifier: ^25.9.1 + version: 25.9.1 + '@typescript/native-preview': + specifier: 7.0.0-dev.20260601.1 + version: 7.0.0-dev.20260601.1 '@vitest/coverage-v8': - specifier: ^3.0.4 - version: 3.2.4(vitest@3.2.4) + specifier: ^4.1.8 + version: 4.1.8(vitest@4.1.8) '@vitest/ui': - specifier: ^3.0.4 - version: 3.2.4(vitest@3.2.4) - commitizen: - specifier: ^4.3.1 - version: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@24.3.0)(typescript@5.9.2) - eslint: - specifier: ^9.19.0 - version: 9.34.0(jiti@2.6.1) + specifier: ^4.1.8 + version: 4.1.8(vitest@4.1.8) eslint-plugin-license-header: - specifier: ^0.8.0 - version: 0.8.0 - eslint-plugin-unicorn: - specifier: ^60.0.0 - version: 60.0.0(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-unused-imports: - specifier: ^4.1.4 - version: 4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)) + specifier: ^0.9.0 + version: 0.9.0(eslint@9.34.0(jiti@2.7.0)) + oxfmt: + specifier: ^0.53.0 + version: 0.53.0 + oxlint: + specifier: ^1.68.0 + version: 1.68.0 pm2: specifier: ^6.0.8 version: 6.0.8 turbo: - specifier: ^2.4.0 - version: 2.5.6 + specifier: ^2.9.16 + version: 2.9.16 typescript: - specifier: ^5.7.3 - version: 5.9.2 - typescript-eslint: - specifier: ^8.22.0 - version: 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + specifier: ^6.0.3 + version: 6.0.3 unplugin: - specifier: ^2.1.2 - version: 2.3.8 + specifier: ^3.0.0 + version: 3.0.0 vitest: - specifier: ^3.0.4 - version: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2) + specifier: ^4.1.8 + version: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) apps/api: dependencies: @@ -138,8 +111,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -178,8 +151,8 @@ importers: version: 3.1.0 devDependencies: '@nestjs/testing': - specifier: ^11.1.6 - version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2)) + specifier: ^11.1.24 + version: 11.1.24(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@types/luxon': specifier: ^3.4.2 version: 3.7.1 @@ -214,8 +187,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -271,12 +244,9 @@ importers: '@statsify/util': specifier: workspace:^ version: link:../../packages/util - '@swc/core': - specifier: ^1.13.5 - version: 1.13.5(@swc/helpers@0.5.17) '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 chalk: specifier: ^5.6.0 version: 5.6.0 @@ -305,18 +275,15 @@ importers: '@types/inquirer': specifier: ^9.0.7 version: 9.0.9 - globals: - specifier: ^16.3.0 - version: 16.3.0 apps/site: dependencies: '@radix-ui/react-popover': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-slot': specifier: ^1.2.4 - version: 1.2.4(@types/react@19.2.7)(react@19.2.1) + version: 1.2.4(@types/react@19.2.16)(react@19.2.1) '@statsify/schemas': specifier: workspace:^ version: link:../../packages/schemas @@ -345,48 +312,39 @@ importers: specifier: ^19.2.1 version: 19.2.1(react@19.2.1) tailwind-merge: - specifier: ^3.4.0 - version: 3.4.0 + specifier: ^3.6.0 + version: 3.6.0 zod: specifier: ^4.1.5 version: 4.1.5 devDependencies: - '@eslint/eslintrc': - specifier: ^3.2.0 - version: 3.3.1 '@statsify/api-client': specifier: workspace:^ version: link:../../packages/api-client '@tailwindcss/postcss': - specifier: 4.1.17 - version: 4.1.17 + specifier: 4.3.0 + version: 4.3.0 '@types/node': - specifier: ^24.3.0 - version: 24.3.0 + specifier: ^25.9.1 + version: 25.9.1 '@types/react': - specifier: ^19.2.7 - version: 19.2.7 + specifier: ^19.2.16 + version: 19.2.16 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.7) - eslint: - specifier: ^9.19.0 - version: 9.34.0(jiti@2.6.1) - eslint-config-next: - specifier: 15.5.2 - version: 15.5.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + version: 19.2.3(@types/react@19.2.16) mongoose: specifier: ^8.18.0 version: 8.18.0(socks@2.8.7) postcss: - specifier: ^8.5.3 - version: 8.5.6 + specifier: ^8.5.15 + version: 8.5.15 tailwindcss: - specifier: ^4.1.17 - version: 4.1.17 + specifier: ^4.3.0 + version: 4.3.0 typescript: - specifier: ^5.7.3 - version: 5.9.2 + specifier: ^6.0.3 + version: 6.0.3 apps/support-bot: dependencies: @@ -415,8 +373,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -470,8 +428,8 @@ importers: specifier: workspace:^ version: link:../../packages/util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -490,19 +448,6 @@ importers: stackblur-canvas: specifier: ^2.7.0 version: 2.7.0 - devDependencies: - '@commitlint/cli': - specifier: ^19.4.1 - version: 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - '@commitlint/config-conventional': - specifier: ^19.4.1 - version: 19.8.1 - commitizen: - specifier: ^4.3.0 - version: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@24.3.0)(typescript@5.9.2) assets/public: dependencies: @@ -534,8 +479,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: ^1.11.0 version: 1.11.0 @@ -549,8 +494,8 @@ importers: specifier: workspace:^ version: link:../schemas '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: 1.11.0 version: 1.11.0 @@ -579,8 +524,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: ^1.11.0 version: 1.11.0 @@ -619,8 +564,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 chalk: specifier: 5.6.0 version: 5.6.0 @@ -641,8 +586,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 packages/rendering: dependencies: @@ -656,8 +601,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 axios: specifier: 1.11.0 version: 1.11.0 @@ -683,8 +628,8 @@ importers: specifier: workspace:^ version: link:../util '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 '@typegoose/typegoose': specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) @@ -701,11 +646,13 @@ importers: packages/skin-renderer: {} + packages/skin-renderer/pkg: {} + packages/util: dependencies: '@swc/helpers': - specifier: ^0.5.12 - version: 0.5.17 + specifier: ^0.5.23 + version: 0.5.23 packages: @@ -713,10 +660,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@azure/msal-common@14.16.0': resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} engines: {node: '>=0.8.0'} @@ -725,20 +668,16 @@ packages: resolution: {integrity: sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==} engines: {node: '>=16'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true @@ -746,8 +685,8 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -757,239 +696,170 @@ packages: '@borewit/text-codec@0.1.1': resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@commitlint/cli@19.8.1': - resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} - engines: {node: '>=v18'} - hasBin: true - - '@commitlint/config-conventional@19.8.1': - resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==} - engines: {node: '>=v18'} - - '@commitlint/config-validator@19.8.1': - resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} - engines: {node: '>=v18'} - - '@commitlint/ensure@19.8.1': - resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==} - engines: {node: '>=v18'} - - '@commitlint/execute-rule@19.8.1': - resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} - engines: {node: '>=v18'} - - '@commitlint/format@19.8.1': - resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==} - engines: {node: '>=v18'} - - '@commitlint/is-ignored@19.8.1': - resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==} - engines: {node: '>=v18'} - - '@commitlint/lint@19.8.1': - resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==} - engines: {node: '>=v18'} - - '@commitlint/load@19.8.1': - resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} - engines: {node: '>=v18'} - - '@commitlint/message@19.8.1': - resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==} - engines: {node: '>=v18'} - - '@commitlint/parse@19.8.1': - resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} - engines: {node: '>=v18'} - - '@commitlint/read@19.8.1': - resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==} - engines: {node: '>=v18'} - - '@commitlint/resolve-extends@19.8.1': - resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} - engines: {node: '>=v18'} - - '@commitlint/rules@19.8.1': - resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==} - engines: {node: '>=v18'} - - '@commitlint/to-lines@19.8.1': - resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==} - engines: {node: '>=v18'} - - '@commitlint/top-level@19.8.1': - resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==} - engines: {node: '>=v18'} - - '@commitlint/types@19.8.1': - resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} - engines: {node: '>=v18'} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1000,12 +870,18 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.3.1': @@ -1016,16 +892,16 @@ packages: resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.34.0': resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.3.5': @@ -1086,22 +962,22 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -1243,13 +1119,17 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/checkbox@2.5.0': resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} engines: {node: '>=18'} - '@inquirer/checkbox@4.2.2': - resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} - engines: {node: '>=18'} + '@inquirer/checkbox@5.2.1': + resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1260,18 +1140,18 @@ packages: resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} engines: {node: '>=18'} - '@inquirer/confirm@5.1.16': - resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} - engines: {node: '>=18'} + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@10.2.0': - resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} - engines: {node: '>=18'} + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1286,9 +1166,9 @@ packages: resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==} engines: {node: '>=18'} - '@inquirer/editor@4.2.18': - resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} - engines: {node: '>=18'} + '@inquirer/editor@5.2.2': + resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1299,18 +1179,18 @@ packages: resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} engines: {node: '>=18'} - '@inquirer/expand@4.0.18': - resolution: {integrity: sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==} - engines: {node: '>=18'} + '@inquirer/expand@5.1.1': + resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@1.0.1': - resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} - engines: {node: '>=18'} + '@inquirer/external-editor@3.0.3': + resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1321,13 +1201,17 @@ packages: resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/input@2.3.0': resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} engines: {node: '>=18'} - '@inquirer/input@4.2.2': - resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} - engines: {node: '>=18'} + '@inquirer/input@5.1.2': + resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1338,9 +1222,9 @@ packages: resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==} engines: {node: '>=18'} - '@inquirer/number@3.0.18': - resolution: {integrity: sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==} - engines: {node: '>=18'} + '@inquirer/number@4.1.1': + resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1351,9 +1235,9 @@ packages: resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==} engines: {node: '>=18'} - '@inquirer/password@4.0.18': - resolution: {integrity: sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==} - engines: {node: '>=18'} + '@inquirer/password@5.1.1': + resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1364,9 +1248,9 @@ packages: resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==} engines: {node: '>=18'} - '@inquirer/prompts@7.8.4': - resolution: {integrity: sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==} - engines: {node: '>=18'} + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1377,9 +1261,9 @@ packages: resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==} engines: {node: '>=18'} - '@inquirer/rawlist@4.1.6': - resolution: {integrity: sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==} - engines: {node: '>=18'} + '@inquirer/rawlist@5.3.1': + resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1390,9 +1274,9 @@ packages: resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==} engines: {node: '>=18'} - '@inquirer/search@3.1.1': - resolution: {integrity: sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==} - engines: {node: '>=18'} + '@inquirer/search@4.2.1': + resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1403,9 +1287,9 @@ packages: resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} engines: {node: '>=18'} - '@inquirer/select@4.3.2': - resolution: {integrity: sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==} - engines: {node: '>=18'} + '@inquirer/select@5.2.1': + resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1420,9 +1304,9 @@ packages: resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} engines: {node: '>=18'} - '@inquirer/type@3.0.8': - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} - engines: {node: '>=18'} + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -1444,16 +1328,9 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@j4cobi/eslint-plugin-sort-imports@1.0.2': resolution: {integrity: sha512-0bTHYIohk2RnWW8+FQoE06s/80aF1iPxP62JiS2+9chUFrs9D7+p0niFtNctcZGRPo5aOKG9q/ypPlT8OWcwyg==} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1464,18 +1341,18 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -1499,18 +1376,15 @@ packages: '@mongodb-js/saslprep@1.3.0': resolution: {integrity: sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==} - '@napi-rs/cli@3.1.5': - resolution: {integrity: sha512-Wn6ZPw27qJiEWglGjkaAa70AHuLtyPya6FvjINYJ5U20uvbRhoB0Ta2+bFTAFfUb9R+wvuFvog9JQdy65OmFAQ==} + '@napi-rs/cli@3.7.0': + resolution: {integrity: sha512-3d3+rmxlOIV/G1zPWeX4PCxuYnhcCQM2BvY9rtimC8RO0dFR9gtYP+Grov+WoduZtfWRj5N1XvytWeRxxCk5zw==} engines: {node: '>= 16'} hasBin: true peerDependencies: - '@emnapi/runtime': ^1.1.0 - emnapi: ^1.1.0 + '@emnapi/runtime': ^1.7.1 peerDependenciesMeta: '@emnapi/runtime': optional: true - emnapi: - optional: true '@napi-rs/cross-toolchain@1.0.3': resolution: {integrity: sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg==} @@ -1857,11 +1731,11 @@ packages: resolution: {integrity: sha512-7cmzIu+Vbupriudo7UudoMRH2OA3cTw67vva8MxeoAe5S7vPFI7z0vp0pMXiA25S8IUJefImQ90FeJjl8fjEaQ==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - - '@napi-rs/wasm-runtime@1.0.3': - resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': resolution: {integrity: sha512-lr07E/l571Gft5v4aA1dI8koJEmF1F0UigBbsqg9OWNzg80H3lDPO+auv85y3T/NHE3GirDk7x/D3sLO57vayw==} @@ -2025,8 +1899,8 @@ packages: class-validator: optional: true - '@nestjs/testing@11.1.6': - resolution: {integrity: sha512-srYzzDNxGvVCe1j0SpTS9/ix75PKt6Sn6iMaH1rpJ6nj2g8vwNrhK0CoJJXvpCYgrnI+2WES2pprYnq8rAMYHA==} + '@nestjs/testing@11.1.24': + resolution: {integrity: sha512-+4M4UAnhtprBQN0J2uI6IP0wDqhy9aH8XCMu5SO8oCi0oB04YXA4a4PAEkxmsPn7gHW4dj1u4GFteNQOWgvTJw==} peerDependencies: '@nestjs/common': ^11.0.0 '@nestjs/core': ^11.0.0 @@ -2041,9 +1915,6 @@ packages: '@next/env@16.0.7': resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/eslint-plugin-next@15.5.2': - resolution: {integrity: sha512-lkLrRVxcftuOsJNhWatf1P2hNVfh98k/omQHrCEPPriUypR6RcS13IvLdIrEvkm9AH2Nu2YpR5vLqBuy6twH3Q==} - '@next/swc-darwin-arm64@16.0.7': resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} @@ -2104,10 +1975,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - '@nuxt/opencollective@0.4.1': resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} @@ -2117,23 +1984,23 @@ packages: resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} - '@octokit/core@7.0.3': - resolution: {integrity: sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==} + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} engines: {node: '>= 20'} - '@octokit/endpoint@11.0.0': - resolution: {integrity: sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==} + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} engines: {node: '>= 20'} - '@octokit/graphql@9.0.1': - resolution: {integrity: sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==} + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} engines: {node: '>= 20'} - '@octokit/openapi-types@25.1.0': - resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - '@octokit/plugin-paginate-rest@13.1.1': - resolution: {integrity: sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==} + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' @@ -2144,30 +2011,254 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@16.0.0': - resolution: {integrity: sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==} + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@7.0.0': - resolution: {integrity: sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==} + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} engines: {node: '>= 20'} - '@octokit/request@10.0.3': - resolution: {integrity: sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==} + '@octokit/request@10.0.10': + resolution: {integrity: sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==} engines: {node: '>= 20'} - '@octokit/rest@22.0.0': - resolution: {integrity: sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA==} + '@octokit/rest@22.0.1': + resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==} engines: {node: '>= 20'} - '@octokit/types@14.1.0': - resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@oxfmt/binding-android-arm-eabi@0.53.0': + resolution: {integrity: sha512-XfVM8AmIovBTKXCt14Op5wbfcoM8418nttd+nhMgM3RAVaJg1MtJc73FyWfUt0oxLyBGVwfniNVUsbV/b3VmPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.53.0': + resolution: {integrity: sha512-btHDfXckwdf9zgyAVznfZkf+GVyB0I1m1hlvaOMRx2xoyz3hphfPX97s89J3wfCN8QBETLtk4lQUaeOkrMuQOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.53.0': + resolution: {integrity: sha512-k2RjMcSTkHjoOlsVGbL35JVzXL+oQco3GHPl/5kjebVF4oHNfE24In8F5isqBh9LBJucycWHKDXdGrCchdWcHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.53.0': + resolution: {integrity: sha512-65jIBE2H1l5SSs16fmv6/7b6sAx/WpvnsgDhVWK9qSjNFDUro7MPQ6q5UhpY7kl46yltfR046iAnxy/Bzqbiew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.53.0': + resolution: {integrity: sha512-oYe1gkz7U49PCYrS9147d2fJZj8mDI4Di6AvlsU5fu9p+Tq8S7qqOMSZjUiVTLX8bXuSA9Lk/tIxuegVjkNYRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.53.0': + resolution: {integrity: sha512-ailB2vLzGi629tymdAb2VYJyEHref7oqGxP+tRBrtRBxQrb6NV55JMT7xtGZ8uTeG2+Y9zojqW4LhJYxQnz9Pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.53.0': + resolution: {integrity: sha512-abh4mWBvOvD966sobqF7r103y2yYx7Rb4WGHLOS4+5igGqLbbPxS9aK5+45D6iUY7dWMsk3Muz9a8gUtufvqJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.53.0': + resolution: {integrity: sha512-z73PvuhJ8qA+cDbaiqbtopHglA91U4+y5wn2sTJJrnpB957d5P33FEuyP3DQIFd7ofljmDmfVT4G0CVGHZaJWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.53.0': + resolution: {integrity: sha512-I6bhOTroqc3ThrwZ89l2k3ivKuELhdPLbAcJhRNyjWvlgwb0vjRgEnVL1XLx5Jud04/ypNRZBykAWrSk6l/D+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.53.0': + resolution: {integrity: sha512-w0p3JzB/PkkQjXALMJMqP9YfP3yq4w6zGsu5kezQmUnxRkN3b/Theg2l/nDgBsOcczxS3gL6Gam5XNAVrO6QJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.53.0': + resolution: {integrity: sha512-mzBhF6k1Yq1K/dqDmVe/AAafnlJfEpx7yfUiksyeWXJk5iSzZqBSxcsa02zIytYgQFRZ7h6WPZfwHg/DoOE1Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.53.0': + resolution: {integrity: sha512-AlFCpnRQhogQFzZXWbO6xB6/Udy745L+eQNmDPGg7G/OeWsYmJc4jZYfUN5pQg0reOPWSED2mOQqKZOJM1U8cA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.53.0': + resolution: {integrity: sha512-XD4ulY4f1DWbuuZXAqxhVn+gdPmrhnmojWtFN78ctVoupmS845fGhsUrk1HZXKQI+iymbaiz9vAjPsghHNQ7Ag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.53.0': + resolution: {integrity: sha512-xg8KWX0QnxmYWRe60CgHYWXI0ZOtBbqTsXvWiWrcl2XUHJ3fht2QerOk2iWvylzX3zNT2GpvBRxGoR4d3sxPRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.53.0': + resolution: {integrity: sha512-MWExpYBGvl+pIvVB/gj/CcWlN2al8AizT7rUbtaYaWNoQkhWARM6W3qpgoCr72CYSN9PborzPmM5MIRe2BrNdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.53.0': + resolution: {integrity: sha512-u4sajgO4nxgmJIgc/y2AqPhkdbOkQH8WugXpA1+pW0ESQhvGZ1oGq61Q4xMbJHJU1hFgtO18QNrcFYDPYH0gwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.53.0': + resolution: {integrity: sha512-Yq9sOZoIOJ5xPjO0qOyHJS4CiPuTkB2en9auxZz7Ar2p5RaC7BzLyVVmAA7zz9/L9YnjjY1DwNxN+ivKXimN/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.53.0': + resolution: {integrity: sha512-es1fVNZEkBqEcQtBpn19SYFgZF7FawlkCjkT/iImfEAus4gun8fBwB1E9hpV5LcR9B0DBNvRIXhW8BQk3JaE+Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.53.0': + resolution: {integrity: sha512-QFmJs2bEu9AO4O6qsmEaZNGi6dFq8N+rT8EHAAnZIq/B9SeJDUbc4DzVxQ48MfDsL7D3sCZzo37zuTuspcURgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.68.0': + resolution: {integrity: sha512-wEdsIspexXLLMCPAEOcCuFLMt6aE3AzTuA/nQKLPRnoJ+EQTturmGheDkhHuuVHx0GbutjQ3JKmEn+Gz6Ag28Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.68.0': + resolution: {integrity: sha512-6aZRNNXQTsYtgaus8HTb9nuCcsrQTlKXGnktwvwW0n/SooRWNxNb3925grDkC63aEYZuCIyOVLV16IdYIoC2aQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.68.0': + resolution: {integrity: sha512-lVTbsE3kO4bLpZELgjRZuAJc8kP98wb83yMXWH8gaPaFZ+cM2IDeZto4ByoUAYj0Mxv2rvw+A1ssZequSepVSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.68.0': + resolution: {integrity: sha512-nCmw2XrmQskjBUh/sfP5yKs93V68LijQgjd1cuuZ/q4SCARngLYs60/qqyzuMsg8QQ9KArDI98hxs/RDGE4KRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.68.0': + resolution: {integrity: sha512-TI4ovQJliYE9V6e06cEv+qEI9uj7Ao65fmif4er4HD+aouyYyh0P31q2jh3KtqsOHHcQqv2PZ61TjJFLpBDGWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.68.0': + resolution: {integrity: sha512-LcNnEi9g71Cmry5ZpLbKT+oVv+/zYG3hYVAbBBB5X85nOQZSk8l92CnDkxJMcxUg0NCnMCOFZuaVDlMyv4tYJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.68.0': + resolution: {integrity: sha512-OovHahL3FX4UaK+hgSf11llUx2vszqjSdQQ61Ck9InOEI/ptZoC4XSQJurITqItVvd53JSlmkLMeaNjM1PoQew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.68.0': + resolution: {integrity: sha512-YbzTglnHLzzi9zv5or8Ztz5fykAoZE8W9iM42/bOrF4HBSB6rJTqdLQWuoP76EHQw9DuKl76K1QmFlG29sPJXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.68.0': + resolution: {integrity: sha512-qVKtCZNic+OoNnOr/hCQAu22HSQzflI7Fsq/Blzkw02SnLuv163k3kfmrVpZjSBlUHgsRKj6WgQiw30d3SX02Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.68.0': + resolution: {integrity: sha512-zExyZ8ZOUuAyQ0y9jpTcyjKUz62YY9JhKPyVxzvjTpXzZ3ujdqiVwfPWDdnA1SsIOrxdtxHn7KErDHLWskFjXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.68.0': + resolution: {integrity: sha512-6C4MPuwewyDavA7sxM14wzgRi5GGL68HPIxRCdVyS75U4MDbpFVYzKO9WNR6KLKTMPq2pcz3THwo1sK2uiqngw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.68.0': + resolution: {integrity: sha512-bnZooVeHAcvA+dH0EDLgx+7HY/DRi6e0hFszg3P+OBatuUjV6EvfIyNIzWOusmqAVh4L6r21GGTZtiKE4iqM4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.68.0': + resolution: {integrity: sha512-dIqnZnJSmHCMOUpUcWQOiV14o3DDPVx1DSsMaSzvdhNjC1tB1iEPZbdiMSCIEYbkgbsYznHXWqFdKL8WUB3F8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.68.0': + resolution: {integrity: sha512-zc9lEnfV/HreDTY6gdMlZe+irkwHSxQ4/B1pS9GyK7RVaA5LxhoZY/w6/o2vIwLLEYiXQ5ujGxOM1ZazeFAAIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.68.0': + resolution: {integrity: sha512-Dl5QEX0TCo/40Cdh1o1JdPS//+YiWqjC+Hrrya5OQmStZZr4svAFtdlqcpCrU9yq2Mo3vRVyO9B3h0dzD8s36Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.68.0': + resolution: {integrity: sha512-/qy6dOvi4S3/LeXq0l5BT5pRKPYA7oj3uKwJOAZOr5HRLL+HK6jdBynvWuXIA2wwfE01RzNYmbBdM7vwYx00sA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.68.0': + resolution: {integrity: sha512-fHNtVqPHSYE7UFDSLVFUjxQjnSVXxseNJmRW+XuP4pXXDwePdPda43NL7/BBCFTxHjycOc44JNDaOPtFDNui9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.68.0': + resolution: {integrity: sha512-NnKXr4Wgo4nps3erhrE0f8shBvBPZMHg72nDsvX0JyrRvsNiP3f1JNvbCKh+A6VFvpF7ZoJxu904P3cKMhvZnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.68.0': + resolution: {integrity: sha512-zg5pA+84AlU6XHJ3ruiRxziO71QTrz8nLsk6u01JGS5+tL9/bnlakFiklFrcy4R1/V7ktWtaNitN3JZWmKnf6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] '@pm2/agent@2.1.1': resolution: {integrity: sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==} @@ -2413,8 +2504,8 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2422,215 +2513,137 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm-eabi@4.49.0': - resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} + '@rollup/rollup-android-arm-eabi@4.61.0': + resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.61.0': + resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.49.0': - resolution: {integrity: sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-arm64@4.49.0': - resolution: {integrity: sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==} + '@rollup/rollup-darwin-arm64@4.61.0': + resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.49.0': - resolution: {integrity: sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==} + '@rollup/rollup-darwin-x64@4.61.0': + resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-arm64@4.49.0': - resolution: {integrity: sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==} + '@rollup/rollup-freebsd-arm64@4.61.0': + resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.61.0': + resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.49.0': - resolution: {integrity: sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-gnueabihf@4.49.0': - resolution: {integrity: sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.49.0': - resolution: {integrity: sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==} + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.49.0': - resolution: {integrity: sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==} + '@rollup/rollup-linux-arm64-gnu@4.61.0': + resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.61.0': + resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.49.0': - resolution: {integrity: sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loong64-gnu@4.61.0': + resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.49.0': - resolution: {integrity: sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==} + '@rollup/rollup-linux-loong64-musl@4.61.0': + resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.49.0': - resolution: {integrity: sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==} + '@rollup/rollup-linux-ppc64-musl@4.61.0': + resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.49.0': - resolution: {integrity: sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.49.0': - resolution: {integrity: sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==} + '@rollup/rollup-linux-riscv64-musl@4.61.0': + resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.49.0': - resolution: {integrity: sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==} + '@rollup/rollup-linux-s390x-gnu@4.61.0': + resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.61.0': + resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.49.0': - resolution: {integrity: sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==} + '@rollup/rollup-linux-x64-musl@4.61.0': + resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-openbsd-x64@4.61.0': + resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==} cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.49.0': - resolution: {integrity: sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==} - cpu: [x64] - os: [linux] + os: [openbsd] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-openharmony-arm64@4.61.0': + resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==} cpu: [arm64] - os: [win32] + os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.49.0': - resolution: {integrity: sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==} + '@rollup/rollup-win32-arm64-msvc@4.61.0': + resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.49.0': - resolution: {integrity: sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==} + '@rollup/rollup-win32-ia32-msvc@4.61.0': + resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-gnu@4.61.0': + resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.49.0': - resolution: {integrity: sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==} + '@rollup/rollup-win32-x64-msvc@4.61.0': + resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==} cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/eslint-patch@1.12.0': - resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} - '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sentry-internal/tracing@7.120.4': resolution: {integrity: sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw==} engines: {node: '>=8'} @@ -2655,89 +2668,102 @@ packages: resolution: {integrity: sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==} engines: {node: '>=8'} - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} - '@stylistic/eslint-plugin@5.2.3': - resolution: {integrity: sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=9.0.0' + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - '@swc/cli@0.7.8': - resolution: {integrity: sha512-27Ov4rm0s2C6LLX+NDXfDVB69LGs8K94sXtFhgeUyQ4DBywZuCgTBu2loCNHRr8JhT9DeQvJM5j9FAu/THbo4w==} - engines: {node: '>= 16.14.0'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/cli@0.8.1': + resolution: {integrity: sha512-L+ACCGHCiS0VqHVep/INLVnvRvJ2XooQFLZq4L8snhxw1jsqz+XRcY313UsyPVturPPE1shW3jic7rt3qEQTSQ==} + engines: {node: '>= 20.19.0'} hasBin: true peerDependencies: '@swc/core': ^1.2.66 - chokidar: ^4.0.1 + chokidar: ^5.0.0 peerDependenciesMeta: chokidar: optional: true - '@swc/core-darwin-arm64@1.13.5': - resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} + '@swc/core-darwin-arm64@1.15.40': + resolution: {integrity: sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.13.5': - resolution: {integrity: sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==} + '@swc/core-darwin-x64@1.15.40': + resolution: {integrity: sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.13.5': - resolution: {integrity: sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==} + '@swc/core-linux-arm-gnueabihf@1.15.40': + resolution: {integrity: sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.13.5': - resolution: {integrity: sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==} + '@swc/core-linux-arm64-gnu@1.15.40': + resolution: {integrity: sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.13.5': - resolution: {integrity: sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==} + '@swc/core-linux-arm64-musl@1.15.40': + resolution: {integrity: sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.13.5': - resolution: {integrity: sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==} + '@swc/core-linux-ppc64-gnu@1.15.40': + resolution: {integrity: sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.40': + resolution: {integrity: sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.40': + resolution: {integrity: sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.13.5': - resolution: {integrity: sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==} + '@swc/core-linux-x64-musl@1.15.40': + resolution: {integrity: sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.13.5': - resolution: {integrity: sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==} + '@swc/core-win32-arm64-msvc@1.15.40': + resolution: {integrity: sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.13.5': - resolution: {integrity: sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==} + '@swc/core-win32-ia32-msvc@1.15.40': + resolution: {integrity: sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.13.5': - resolution: {integrity: sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==} + '@swc/core-win32-x64-msvc@1.15.40': + resolution: {integrity: sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.13.5': - resolution: {integrity: sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==} + '@swc/core@1.15.40': + resolution: {integrity: sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -2751,75 +2777,71 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@swc/types@0.1.24': - resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - '@tailwindcss/node@4.1.17': - resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - '@tailwindcss/oxide-android-arm64@4.1.17': - resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.17': - resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.17': - resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.17': - resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': - resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': - resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.17': - resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.17': - resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.17': - resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.17': - resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2830,24 +2852,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': - resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.17': - resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.17': - resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} - '@tailwindcss/postcss@4.1.17': - resolution: {integrity: sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==} + '@tailwindcss/postcss@4.3.0': + resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} '@tanstack/query-core@5.90.12': resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} @@ -2861,14 +2883,48 @@ packages: resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@turbo/darwin-64@2.9.16': + resolution: {integrity: sha512-jLjApWTSNd7JZ5JaLYfelW1ytnGQOvB7ivl+2RD1xQvJTbi8I9gBjzcga7tDZVPyaxpl10YTfJt3BrYXR18KDw==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.9.16': + resolution: {integrity: sha512-YPgrn+5HIGzrx0O2a631SV4MBQUe4W/DafMFUuBVgaU32PW9/OTT0ehviF0QSxTXuRJlHvW2eUTemddF5/spmw==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.9.16': + resolution: {integrity: sha512-vAEf1H6l26lTpl9FJ/peQo1NUB8RC0sbEJJz5mPcUhHA2bPDup2x3CZPgo/bH8S4cUcBLm4FN3UHd5iUO2RAew==} + cpu: [x64] + os: [linux] + + '@turbo/linux-arm64@2.9.16': + resolution: {integrity: sha512-xDBLR2PZg4BrQOchfG6svgpv5FCNJ2TOtT2psLdEJcdKo1BH+pnPs9Xj6pvUjgfkHbuvBOfeE4R6tvxMoQKDHQ==} + cpu: [arm64] + os: [linux] + + '@turbo/windows-64@2.9.16': + resolution: {integrity: sha512-NBAJnaUiGdgkSzQwUIdOvkCkcpTSu58G/sBGa0mvBtzfvFOOgrQwepKOOQ8cp6sWM6OcKDNFj2p1dsZA1OWjPg==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.9.16': + resolution: {integrity: sha512-Y7SJppD0Z8wjO3Ec0ZGd9KQ4Yv0BMnA8CIowj5Vp+OEVsosXDG2weK6/t1RRLfJmc2Ozrnd6y4DOgQys+mn3WQ==} + cpu: [arm64] + os: [win32] + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@typegoose/typegoose@12.19.0': resolution: {integrity: sha512-rsHMd3M6Rj6YYw6ecZU6YtXjiBzCqO3zJtgrrVCau1bEp6na8sbMcqRy8kNbTRyA2QCBAGEvM7nXTM8hdxeEiQ==} @@ -2876,24 +2932,17 @@ packages: peerDependencies: mongoose: ~8.18.0 - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - - '@types/conventional-commits-parser@5.0.1': - resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint__js@9.14.0': - resolution: {integrity: sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==} - deprecated: This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed. + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} '@types/i18next-fs-backend@1.2.0': resolution: {integrity: sha512-30XnjBF+SLndemvooRQRtcoD5xmF2nNNTa5RqE63+OWssaZOxN9r895ZvXUMbkk8YZr1Cy3scpQBZ6YXLH+jEg==} @@ -2905,9 +2954,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/luxon@3.7.1': resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==} @@ -2917,19 +2963,19 @@ packages: '@types/node-rsa@1.1.4': resolution: {integrity: sha512-dB0ECel6JpMnq5ULvpUTunx3yNm8e/dIkv8Zu9p2c8me70xIRUUG3q+qXRwcSf9rN3oqamv4116iHy90dJGRpA==} - '@types/node@22.18.0': - resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.7': - resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} '@types/readable-stream@4.0.21': resolution: {integrity: sha512-19eKVv9tugr03IgfXlA9UVUVRbW6IuqRO5B92Dl4a6pT7K8uaGrNS0GkxiZD0BOk6PLuXl5FhWl//eX/pzYdTQ==} @@ -2949,80 +2995,32 @@ packages: '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@typescript-eslint/eslint-plugin@8.41.0': - resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.41.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.41.0': - resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.37.0': resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.41.0': - resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.37.0': resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.41.0': - resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.37.0': resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/tsconfig-utils@8.41.0': - resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.41.0': - resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.37.0': resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.41.0': - resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.37.0': resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.41.0': - resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.37.0': resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3030,116 +3028,57 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.41.0': - resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.37.0': resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.41.0': - resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-d4PVG8gcotwb5eJiMK14GdFOXRCH3tx4nAJxBcwJ3ZxPJ8Se3eQ54NZMeuuulU9isMJgtVxusAgjI8Qkhg4xDg==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-JJ34gLHbemqkRRuWshdWYL+WFXVYMmivRKD6qyHkhLGWmq3AmPaAsjNoscdaDRWU3GrQm1gI2hx8N+BpaJow7Q==} + engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-Pr3/dVouvJ1So1buF6OZ5sUJ2Ij8BOX2vZXugJeoyeSgCjkhsZO4IJ3hW87aY3KpFrgJMLimKy2Ud1S3o9wPxQ==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] + '@typescript/native-preview-linux-arm@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-8jMjFrryB4hosxgKY6R1RJA9imUvxwk99AoRcfmy4xHZ7pLQ/QgAxElZaISOT8/gXQfVWppfI2Sj5YakgiAqyQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-FJUXnaSz8OWZSQiX02Sd51pXQSpZEHvkChuM/UxTsJ1kfRCzx59jB5fmN3JLiRoUizJIa0rhxu/+YA+/c/euqw==} + engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-tzc4eMCpdu+rHKxNUzWclm107WoCIbbcYrDg5DU5/07Wk5QlXG6bXsaKILpXxA60tyseVLbRe4wv6Ww79X7EgA==} + engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-H0YctU7f48BpxTaGTdK7f1UT5+1EY6pg7vMK9zBQXVhc8wSrCpQg4O/rf7kM8vyLUsC/pJpTE5OLUlxk+addCg==} + engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] + '@typescript/native-preview@7.0.0-dev.20260601.1': + resolution: {integrity: sha512-IAoqEMiW2aw3m74TLQbNI1V235p9Sk8XhvvKTw2U5YAOfkPEFZaoYFvmoqWA/d2OLap1D3atyNbtD/dub7Jn9g==} + engines: {node: '>=16.20.0'} + hasBin: true + '@vercel/analytics@1.6.1': resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} peerDependencies: @@ -3189,48 +3128,48 @@ packages: vue-router: optional: true - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.1.8': + resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.1.8 + vitest: 4.1.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/ui@3.2.4': - resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} + '@vitest/ui@4.1.8': + resolution: {integrity: sha512-RUS2ZU2TsduVrI+9c12uTNaKrNUTsm6yFt3fueEUB9iKvyC2UP83F+sqIz00HQIah4UOL1TMoDAki8K0NjGvsA==} peerDependencies: - vitest: 3.2.4 + vitest: 4.1.8 - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} '@xboxreplay/errors@0.1.0': resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} @@ -3238,49 +3177,45 @@ packages: '@xboxreplay/xboxlive-auth@3.3.3': resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} - '@xhmikosr/archive-type@7.1.0': - resolution: {integrity: sha512-xZEpnGplg1sNPyEgFh0zbHxqlw5dtYg6viplmWSxUj12+QjU9SKu3U/2G73a15pEjLaOqTefNSZ1fOPUOT4Xgg==} - engines: {node: '>=18'} - - '@xhmikosr/bin-check@7.1.0': - resolution: {integrity: sha512-y1O95J4mnl+6MpVmKfMYXec17hMEwE/yeCglFNdx+QvLLtP0yN4rSYcbkXnth+lElBuKKek2NbvOfOGPpUXCvw==} - engines: {node: '>=18'} + '@xhmikosr/archive-type@8.0.1': + resolution: {integrity: sha512-toXuiWChyfOpEiCPsIw6HGHaNji5LVkvB6EREL548vGWr+hGaehwxG4LzN20vm9aGFXwnA/Jty8yW2/SmV+1zQ==} + engines: {node: '>=20'} - '@xhmikosr/bin-wrapper@13.2.0': - resolution: {integrity: sha512-t9U9X0sDPRGDk5TGx4dv5xiOvniVJpXnfTuynVKwHgtib95NYEw4MkZdJqhoSiz820D9m0o6PCqOPMXz0N9fIw==} - engines: {node: '>=18'} + '@xhmikosr/bin-check@8.2.1': + resolution: {integrity: sha512-DNruLq+kalxcE7JeDxtqrN9kyWjLW8VqsQPLRTwD1t9ck/1rF4qBL0mX5Fe2/xLOMjo5wPb67BNX2kSAhzfLjA==} + engines: {node: '>=20'} - '@xhmikosr/decompress-tar@8.1.0': - resolution: {integrity: sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg==} - engines: {node: '>=18'} + '@xhmikosr/bin-wrapper@14.2.5': + resolution: {integrity: sha512-MXfD5mNdc9xQM4/I4O7uWSdQqeZPTYRQSfddUtfH9oUeVkDUTnX4HI2udTsvDEs7ptv2ywHE9UfxlMUs+79wFw==} + engines: {node: '>=20'} - '@xhmikosr/decompress-tarbz2@8.1.0': - resolution: {integrity: sha512-aCLfr3A/FWZnOu5eqnJfme1Z1aumai/WRw55pCvBP+hCGnTFrcpsuiaVN5zmWTR53a8umxncY2JuYsD42QQEbw==} - engines: {node: '>=18'} + '@xhmikosr/decompress-tar@9.0.1': + resolution: {integrity: sha512-4AkVR1SoqTxYY22IRRYKDeLirPIDGqMqYsqgjKYuwhgRcBb+yDP4t5Xph33UCzL/nahK/aADmlMEjTNstbX7kw==} + engines: {node: '>=20'} - '@xhmikosr/decompress-targz@8.1.0': - resolution: {integrity: sha512-fhClQ2wTmzxzdz2OhSQNo9ExefrAagw93qaG1YggoIz/QpI7atSRa7eOHv4JZkpHWs91XNn8Hry3CwUlBQhfPA==} - engines: {node: '>=18'} + '@xhmikosr/decompress-tarbz2@9.0.1': + resolution: {integrity: sha512-aFONnsbqEOuXudvK7V7wB8dcEAKR389oUYQfZhrQZA8OtogJpDjrUAvEH3Qlc9yFqTU6r5/svTEcRwtXhoIJbQ==} + engines: {node: '>=20'} - '@xhmikosr/decompress-unzip@7.1.0': - resolution: {integrity: sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA==} - engines: {node: '>=18'} + '@xhmikosr/decompress-targz@9.0.1': + resolution: {integrity: sha512-1JXu2b6yrpm5EuBoOzMU57B4qrHXJKWQQ7LlMynNEiz85mEjDciO3ayf//GXaTLLCEKiHjWlU3q3THjgf7uODA==} + engines: {node: '>=20'} - '@xhmikosr/decompress@10.2.0': - resolution: {integrity: sha512-MmDBvu0+GmADyQWHolcZuIWffgfnuTo4xpr2I/Qw5Ox0gt+e1Be7oYqJM4te5ylL6mzlcoicnHVDvP27zft8tg==} - engines: {node: '>=18'} + '@xhmikosr/decompress-unzip@8.1.1': + resolution: {integrity: sha512-/B+Z0qJflGn5UEtmMZ2qeKeXwexOycxaibYhMOyLcRPJriXs4IkoSngVUVZXLYViu9TdHyFWynC6NB4EWBg8cg==} + engines: {node: '>=20'} - '@xhmikosr/downloader@15.2.0': - resolution: {integrity: sha512-lAqbig3uRGTt0sHNIM4vUG9HoM+mRl8K28WuYxyXLCUT6pyzl4Y4i0LZ3jMEsCYZ6zjPZbO9XkG91OSTd4si7g==} - engines: {node: '>=18'} + '@xhmikosr/decompress@11.1.3': + resolution: {integrity: sha512-NiyhJq6z7ERsYghcnXZUI6ooDXgZtoB+G9eUsYhfSM4VLp2rKx9UxhKI1NEf1PqosrNPxG3bnSsr2UBVbNurlg==} + engines: {node: '>=20'} - '@xhmikosr/os-filter-obj@3.0.0': - resolution: {integrity: sha512-siPY6BD5dQ2SZPl3I0OZBHL27ZqZvLEosObsZRQ1NUB8qcxegwt0T9eKtV96JMFQpIz1elhkzqOg4c/Ri6Dp9A==} - engines: {node: ^14.14.0 || >=16.0.0} + '@xhmikosr/downloader@16.1.3': + resolution: {integrity: sha512-jtQZZbO3xsRmDDeEz7m23ydgbW9YpVnOALNygmKNvjjuTuQwtcXGVJ9xWv4x7niElvziJrak+WUBmWYcFosolA==} + engines: {node: '>=20'} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + '@xhmikosr/os-filter-obj@4.1.0': + resolution: {integrity: sha512-y5ArHvQ7BVule/+L9yE2nYMhceiJhgsqo58lOfnisQ7bg+Kjfmkgr7JBuVFiTkl+ErdShpp829QstZQyLugl8g==} + engines: {node: '>=20'} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -3294,8 +3229,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -3317,6 +3252,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -3342,10 +3280,6 @@ packages: resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3362,9 +3296,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arch@3.0.0: - resolution: {integrity: sha512-AmIAC+Wtm2AU8lGfTtHsw0Y9Qtftx2YXEEtiBP10xFUtMOA+sHHx6OAddyL52mUKh1vsXQ6/w1mVDptZCyUt4Q==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3372,45 +3303,6 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - asn1@0.2.3: resolution: {integrity: sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==} @@ -3418,19 +3310,12 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + ast-v8-to-istanbul@1.0.3: + resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -3441,43 +3326,37 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.6.1: - resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + bare-events@2.8.3: + resolution: {integrity: sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3490,20 +3369,17 @@ packages: before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} - bin-version-check@5.1.0: - resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} - engines: {node: '>=12'} - - bin-version@6.0.0: - resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} - engines: {node: '>=12'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + binary-version-check@6.1.0: + resolution: {integrity: sha512-REKdLKmuViV2WrtWXvNSiPX04KbIjfUV3Cy8batUeOg+FtmowavzJorfFhWq95cVJzINnL/44ixP26TrdJZACA==} + engines: {node: '>=18'} + + binary-version@7.1.0: + resolution: {integrity: sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw==} + engines: {node: '>=18'} blessed@0.1.81: resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} @@ -3513,28 +3389,23 @@ packages: bodec@0.1.0: resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.3: - resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - bson@6.10.4: resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} engines: {node: '>=16.20.1'} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -3551,56 +3422,33 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@5.0.0: - resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} - engines: {node: '>=18.20'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + byte-counter@0.1.0: + resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} + engines: {node: '>=20'} cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} + cacheable-request@13.0.19: + resolution: {integrity: sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==} + engines: {node: '>=18'} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001737: - resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} - caniuse-lite@1.0.30001759: resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -3613,56 +3461,29 @@ packages: resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} charm@0.1.2: resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} - engines: {node: '>=8'} - class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} class-validator@0.14.2: resolution: {integrity: sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-tableau@2.0.1: resolution: {integrity: sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==} engines: {node: '>=8.10.0'} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -3675,28 +3496,14 @@ packages: peerDependencies: typanion: '*' - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -3721,14 +3528,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commitizen@4.3.1: - resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} - engines: {node: '>= 12'} - hasBin: true - - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3740,46 +3539,25 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} - conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} - conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} - conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - core-js-compat@3.45.1: - resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} - - cosmiconfig-typescript-loader@6.1.0: - resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} - engines: {node: '>=v18'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=9' - typescript: '>=5' - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - croner@4.1.97: resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} @@ -3797,33 +3575,10 @@ packages: culvert@0.1.2: resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} - cz-conventional-changelog@3.3.0: - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -3859,39 +3614,22 @@ packages: supports-color: optional: true - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + 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'} + decompress-response@10.0.0: + resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} + engines: {node: '>=20'} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - defaults@2.0.2: - resolution: {integrity: sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA==} - engines: {node: '>=16'} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -3912,14 +3650,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -3933,14 +3663,6 @@ packages: discord-api-types@0.38.22: resolution: {integrity: sha512-2gnYrgXN3yTlv2cKBISI/A8btZwsSZLwKpIQXeI1cS8a7W7wP3sFVQOm3mPuuinTD8jJCKGPGNH399zE7Un1kA==} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3951,8 +3673,13 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - electron-to-chromium@1.5.209: - resolution: {integrity: sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==} + emnapi@1.10.0: + resolution: {integrity: sha512-swoyZjupDvLoe/KC3HZ4SY1JUN+tviT6eOZ3Px28TZAYdBHtRIiMWWrIUUH+2/9CYY4fNTID1YhYZ+kdFHszHg==} + peerDependencies: + node-addon-api: '>= 6.1.0' + peerDependenciesMeta: + node-addon-api: + optional: true emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3963,25 +3690,14 @@ packages: endian-toggle@0.0.0: resolution: {integrity: sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.22.1: + resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==} engines: {node: '>=10.13.0'} enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -3990,12 +3706,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -4005,33 +3717,17 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - es-toolkit@1.39.10: - resolution: {integrity: sha512-E0iGnTtbDhkeczB0T+mxmoVlT4YNweEKBLq7oaU4p11mecdsZpNWOglI4895Vh4usbQ+LsJiuLuI2L0Vdmfm2w==} + es-toolkit@1.47.0: + resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -4041,97 +3737,10 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-next@15.5.2: - resolution: {integrity: sha512-3hPZghsLupMxxZ2ggjIIrat/bPniM2yRpsVPVM40rp8ZMzKWOJp2CGWn7+EzoV2ddkUr5fxNfHpF+wU1hGt/3g==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-license-header@0.8.0: - resolution: {integrity: sha512-khTCz6G3JdoQfwrtY4XKl98KW4PpnWUKuFx8v+twIRhJADEyYglMDC0td8It75C1MZ88gcvMusWuUlJsos7gYg==} - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} + eslint-plugin-license-header@0.9.0: + resolution: {integrity: sha512-Qd7cCljVC0h+uJjcIuYjpRFrdzwqBBDCi5U0ocr6Bt/5t3zuBkZSa1Igc4lBLEVBDoUUqIcok/UUNAAu6CtwmQ==} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-unicorn@60.0.0: - resolution: {integrity: sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==} - engines: {node: ^20.10.0 || >=21.0.0} - peerDependencies: - eslint: '>=9.29.0' - - eslint-plugin-unused-imports@4.2.0: - resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true + eslint: ^9 || ^10 eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} @@ -4164,8 +3773,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -4196,20 +3805,23 @@ packages: eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} ext-list@2.2.2: @@ -4227,9 +3839,6 @@ packages: extrareqp2@1.0.0: resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==} - fast-content-type-parse@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -4239,10 +3848,6 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -4269,9 +3874,18 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} @@ -4287,8 +3901,9 @@ packages: fclone@1.0.11: resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -4298,29 +3913,32 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@20.5.0: - resolution: {integrity: sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==} - engines: {node: '>=18'} - file-type@21.0.0: resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} engines: {node: '>=20'} - filename-reserved-regex@3.0.0: - resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + file-type@21.3.4: + resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} + engines: {node: '>=20'} - filenamify@6.0.0: - resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==} - engines: {node: '>=16'} + filename-reserved-regex@4.0.0: + resolution: {integrity: sha512-9ZT504KxEQDamsOogZImAWGEN24R1uFAxU3ZS4AZqn2ooidmN68Olh7n4/RcA4lLatZztjA0ZSuxeLHVoCc8JA==} + engines: {node: '>=20'} + + filenamify@7.0.1: + resolution: {integrity: sha512-9b4rfnaX2MkJCgp27wypV6DAMvj4WMOSgJ+TdcpJIO84Dql+Cv6iJjdG4XDTLubOWkfNiBv3joO59sau/TXw+Q==} + engines: {node: '>=20'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -4330,38 +3948,20 @@ packages: resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==} engines: {node: '>=20'} - find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + find-versions@6.0.0: + resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} engines: {node: '>=18'} - find-versions@5.1.0: - resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} - engines: {node: '>=12'} - - findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -4372,17 +3972,13 @@ packages: debug: optional: true - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} @@ -4402,13 +3998,6 @@ packages: react-dom: optional: true - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -4417,21 +4006,14 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} fuse.js@7.1.0: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4444,16 +4026,13 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} @@ -4467,12 +4046,6 @@ packages: js-git: optional: true - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. - hasBin: true - git-sha1@0.1.2: resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} @@ -4484,83 +4057,36 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - got@13.0.0: - resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} - engines: {node: '>=16'} + got@14.6.6: + resolution: {integrity: sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==} + engines: {node: '>=20'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -4573,10 +4099,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -4599,9 +4121,13 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} i18next-fs-backend@2.6.0: resolution: {integrity: sha512-3ZlhNoF9yxnM8pa8bWp5120/Ob6t4lVl1l/tbLmkml/ei3ud8IWySCHt2lrY5xWRlSU5D9IV2sm5bEbGuTqwTw==} @@ -4613,8 +4139,8 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -4624,10 +4150,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -4635,46 +4157,23 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@10.2.2: resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} engines: {node: '>=18'} - inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - inspect-with-kind@1.0.5: resolution: {integrity: sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - ioredis@5.7.0: resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} engines: {node: '>=12.22.0'} @@ -4687,40 +4186,10 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-builtin-module@5.0.0: - resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} - engines: {node: '>=18.20'} - - is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-class@0.0.9: resolution: {integrity: sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg==} @@ -4728,191 +4197,94 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} - is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} - - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} - hasBin: true - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-git@0.7.8: resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-ref-resolver@2.0.1: resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} @@ -4928,25 +4300,13 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} @@ -4960,17 +4320,13 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4984,79 +4340,76 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-esm@1.0.2: resolution: {integrity: sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==} engines: {node: '>=13.2.0'} @@ -5068,13 +4421,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -5099,65 +4445,26 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} lodash.reduce@4.6.0: resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - loglevel@1.9.2: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} @@ -5177,14 +4484,15 @@ packages: macaddress@0.5.3: resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -5197,10 +4505,6 @@ packages: memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5208,9 +4512,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -5232,22 +4533,14 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} mimic-response@4.0.0: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minecraft-data@3.93.0: resolution: {integrity: sha512-AaQ+mdcHb58uDqcoK380lRh83r3IpkGREdLi577BI51t2kru+mTVDO4IFDJzDm3e9N8C7T4KQ1qWl0id98KbtA==} @@ -5262,15 +4555,16 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -5369,18 +4663,18 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.3: - resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: @@ -5433,9 +4727,6 @@ packages: encoding: optional: true - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-rsa@0.4.2: resolution: {integrity: sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==} @@ -5443,92 +4734,82 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.2: - resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + oxfmt@0.53.0: + resolution: {integrity: sha512-9cB5glS3Ip6NMuZ+6NYTao9FCWkDhRtPYCtR3QBu/NxHoFbgzzTvi41N4jxz/GqGfuLKspui1qb/LlSu2IbMcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint@1.68.0: + resolution: {integrity: sha512-dXcbq+xsmLrMy6T8d0euf3IYUfLmjHIE11pOxiUSi5LHkFZaYPv568R6sEjcavVpUxoaQe66UBuK4HEi74NxpA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} pac-proxy-agent@7.2.0: resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} @@ -5551,37 +4832,25 @@ packages: parenthesis@3.1.8: resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -5593,22 +4862,18 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pidusage@2.0.21: @@ -5632,10 +4897,6 @@ packages: piscina@4.9.2: resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==} - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - pm2-axon-rpc@0.7.1: resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} engines: {node: '>=5'} @@ -5659,22 +4920,22 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + prismarine-auth@2.7.0: resolution: {integrity: sha512-L8wTF6sdtnN6hViPNy+Nx39a8iQBwR5iO92AWCiym5cSXp/92pmnuwnTdcmNDWyqq6zY4hbibVGYhgLA1Ox8sQ==} @@ -5715,9 +4976,6 @@ packages: promptly@2.2.0: resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - protodef-validator@1.4.0: resolution: {integrity: sha512-2y2coBolqCEuk5Kc3QwO7ThR+/7TZiOit4FrpAgl+vFMvq8w76nDhh09z08e2NQOdrgPLsN2yzXsvRvtADgUZQ==} hasBin: true @@ -5759,9 +5017,6 @@ packages: peerDependencies: react: ^19.2.1 - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -5800,10 +5055,6 @@ packages: resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} engines: {node: '>=0.8'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5827,26 +5078,6 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -5862,37 +5093,18 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + responselike@4.0.2: + resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} + engines: {node: '>=20'} ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} @@ -5909,20 +5121,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.49.0: - resolution: {integrity: sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==} + rollup@4.61.0: + resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -5936,21 +5139,9 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} @@ -5982,10 +5173,6 @@ packages: resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} engines: {node: '>=12'} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -6001,21 +5188,14 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -6034,22 +5214,6 @@ packages: shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - sift@17.1.3: resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} @@ -6063,8 +5227,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} skia-canvas@3.0.8: @@ -6122,9 +5286,6 @@ packages: sprintf-js@1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -6139,15 +5300,11 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + streamx@2.26.0: + resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} string-split-by@1.0.0: resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==} @@ -6160,29 +5317,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -6194,36 +5328,29 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - strip-dirs@3.0.0: resolution: {integrity: sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ==} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -6237,9 +5364,9 @@ packages: babel-plugin-macros: optional: true - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -6252,35 +5379,31 @@ packages: swagger-ui-dist@5.21.0: resolution: {integrity: sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==} + system-architecture@1.0.0: + resolution: {integrity: sha512-0OJWD12D7XX3KUg1DYkMaTTjSTo2k/mhIYI3HlBlceXSMcJhW/1qO735fPKS5prcyjvn57Ub151vvASYXpQrEw==} + engines: {node: '>=18'} + systeminformation@5.27.8: resolution: {integrity: sha512-d3Z0gaQO1MlUxzDUKsmXz5y4TOBCMZ8IyijzaYOykV3AcNOTQ7mT+tpndUOXYNSxzLK3la8G32xiUFvZ0/s6PA==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - tailwind-merge@3.4.0: - resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - tailwindcss@4.1.17: - resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - - text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -6288,6 +5411,10 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-discord@https://codeload.github.com/timotejroiko/tiny-discord/tar.gz/f6d020085ea88e33ebaf6ce323930deffe74fb0d: resolution: {tarball: https://codeload.github.com/timotejroiko/tiny-discord/tar.gz/f6d020085ea88e33ebaf6ce323930deffe74fb0d} version: 0.0.1 @@ -6295,26 +5422,20 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} 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} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -6340,6 +5461,10 @@ packages: resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} engines: {node: '>=14.16'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -6357,47 +5482,14 @@ packages: peerDependencies: typescript: '>=4.8.4' - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@1.9.3: resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.6: - resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.5.6: - resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.5.6: - resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.5.6: - resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.5.6: - resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.5.6: - resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==} - cpu: [arm64] - os: [win32] - - turbo@2.5.6: - resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==} + turbo@2.9.16: + resolution: {integrity: sha512-NqgRQy6j6dPYcdSdv0q1g9QsZg7SWg87RERM8otw/1AtKU2yTFVClOM7cbwKzOonZr/Ek1blTBucw64L9H0Bwg==} hasBin: true tv4@1.3.0: @@ -6418,34 +5510,15 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} typedi@0.10.0: resolution: {integrity: sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==} - typescript-eslint@8.41.0: - resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -6462,42 +5535,25 @@ packages: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unplugin@2.3.8: - resolution: {integrity: sha512-lkaSIlxceytPyt9yfb1h7L9jDFqwMqvUZeGsKB7Z8QrvAO3xZv2S+xMQQYzxk0AGJHcQhbcvhKEstrMy99jnuQ==} - engines: {node: '>=18.12.0'} - - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6522,25 +5578,18 @@ packages: '@types/react': optional: true - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid-1345@1.0.2: resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==} uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true validator@13.15.15: resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} - 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 - vite@7.0.4: resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6581,26 +5630,39 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.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.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -6613,8 +5675,8 @@ packages: resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} engines: {node: '>=4.0'} - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -6633,26 +5695,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6682,9 +5724,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -6697,23 +5736,11 @@ packages: utf-8-validate: optional: true - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yauzl@3.2.0: - resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} + yauzl@3.3.2: + resolution: {integrity: sha512-Md9ankxxN23wncAN8s7+Tn3Co52zLUPMtnrLAbVCnfG5d2tKBFfmygYSgXlqFgXObtzIgqkx7aNgDBpso9+4qA==} engines: {node: '>=12'} yggdrasil@1.7.0: @@ -6723,14 +5750,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + zod@4.1.5: resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} @@ -6738,11 +5765,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@azure/msal-common@14.16.0': {} '@azure/msal-node@2.16.2': @@ -6751,140 +5773,26 @@ snapshots: jsonwebtoken: 9.0.2 uuid: 8.3.2 - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.28.0': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.29.7 '@babel/runtime@7.27.6': {} - '@babel/types@7.28.1': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@1.0.2': {} '@borewit/text-codec@0.1.1': {} - '@commitlint/cli@19.8.1(@types/node@24.3.0)(typescript@5.9.2)': - dependencies: - '@commitlint/format': 19.8.1 - '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - '@commitlint/read': 19.8.1 - '@commitlint/types': 19.8.1 - tinyexec: 1.0.1 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript - - '@commitlint/config-conventional@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - conventional-changelog-conventionalcommits: 7.0.2 - - '@commitlint/config-validator@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - ajv: 8.17.1 - - '@commitlint/ensure@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - - '@commitlint/execute-rule@19.8.1': {} - - '@commitlint/format@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - chalk: 5.6.0 - - '@commitlint/is-ignored@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - semver: 7.7.2 - - '@commitlint/lint@19.8.1': - dependencies: - '@commitlint/is-ignored': 19.8.1 - '@commitlint/parse': 19.8.1 - '@commitlint/rules': 19.8.1 - '@commitlint/types': 19.8.1 - - '@commitlint/load@19.8.1(@types/node@24.3.0)(typescript@5.9.2)': - dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/execute-rule': 19.8.1 - '@commitlint/resolve-extends': 19.8.1 - '@commitlint/types': 19.8.1 - chalk: 5.6.0 - cosmiconfig: 9.0.0(typescript@5.9.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - - '@commitlint/message@19.8.1': {} - - '@commitlint/parse@19.8.1': - dependencies: - '@commitlint/types': 19.8.1 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 - - '@commitlint/read@19.8.1': - dependencies: - '@commitlint/top-level': 19.8.1 - '@commitlint/types': 19.8.1 - git-raw-commits: 4.0.0 - minimist: 1.2.8 - tinyexec: 1.0.1 - - '@commitlint/resolve-extends@19.8.1': - dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/types': 19.8.1 - global-directory: 4.0.1 - import-meta-resolve: 4.1.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - - '@commitlint/rules@19.8.1': - dependencies: - '@commitlint/ensure': 19.8.1 - '@commitlint/message': 19.8.1 - '@commitlint/to-lines': 19.8.1 - '@commitlint/types': 19.8.1 - - '@commitlint/to-lines@19.8.1': {} - - '@commitlint/top-level@19.8.1': - dependencies: - find-up: 7.0.0 - - '@commitlint/types@19.8.1': - dependencies: - '@types/conventional-commits-parser': 5.0.1 - chalk: 5.6.0 + '@borewit/text-codec@0.2.2': {} '@emnapi/core@1.5.0': dependencies: @@ -6892,11 +5800,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -6907,96 +5810,101 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.6': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.6': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.25.6': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.25.6': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.25.6': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.25.6': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.6': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.25.6': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.6': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.6': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.6': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.6': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.25.6': + '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.7.0))': + dependencies: + eslint: 9.34.0(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@9.34.0(jiti@2.7.0))': dependencies: - eslint: 9.34.0(jiti@2.6.1) + eslint: 9.34.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.2': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1 - minimatch: 3.1.2 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -7006,23 +5914,23 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.12.6 - debug: 4.4.1 + ajv: 6.15.0 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 + js-yaml: 4.2.0 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color '@eslint/js@9.34.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.3.5': dependencies: @@ -7110,16 +6018,19 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/module-importer@1.0.1': {} + '@humanfs/types@0.15.0': {} - '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -7220,6 +6131,8 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/ansi@2.0.7': {} + '@inquirer/checkbox@2.5.0': dependencies: '@inquirer/core': 9.2.1 @@ -7228,47 +6141,45 @@ snapshots: ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 - '@inquirer/checkbox@4.2.2(@types/node@24.3.0)': + '@inquirer/checkbox@5.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/confirm@3.2.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/confirm@5.1.16(@types/node@24.3.0)': + '@inquirer/confirm@6.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 - '@inquirer/core@10.2.0(@types/node@24.3.0)': + '@inquirer/core@11.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) cli-width: 4.1.0 - mute-stream: 2.0.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/core@9.2.1': dependencies: '@inquirer/figures': 1.0.13 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.18.0 + '@types/node': 22.19.19 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -7284,13 +6195,13 @@ snapshots: '@inquirer/type': 1.5.5 external-editor: 3.1.0 - '@inquirer/editor@4.2.18(@types/node@24.3.0)': + '@inquirer/editor@5.2.2(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/external-editor': 1.0.1(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/external-editor': 3.0.3(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/expand@2.3.0': dependencies: @@ -7298,46 +6209,47 @@ snapshots: '@inquirer/type': 1.5.5 yoctocolors-cjs: 2.1.3 - '@inquirer/expand@4.0.18(@types/node@24.3.0)': + '@inquirer/expand@5.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 - '@inquirer/external-editor@1.0.1(@types/node@24.3.0)': + '@inquirer/external-editor@3.0.3(@types/node@25.9.1)': dependencies: - chardet: 2.1.0 - iconv-lite: 0.6.3 + chardet: 2.1.1 + iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/figures@1.0.13': {} + '@inquirer/figures@2.0.7': {} + '@inquirer/input@2.3.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/input@4.2.2(@types/node@24.3.0)': + '@inquirer/input@5.1.2(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/number@1.1.0': dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 - '@inquirer/number@3.0.18(@types/node@24.3.0)': + '@inquirer/number@4.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/password@2.2.0': dependencies: @@ -7345,13 +6257,13 @@ snapshots: '@inquirer/type': 1.5.5 ansi-escapes: 4.3.2 - '@inquirer/password@4.0.18(@types/node@24.3.0)': + '@inquirer/password@5.1.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/prompts@5.5.0': dependencies: @@ -7366,20 +6278,20 @@ snapshots: '@inquirer/search': 1.1.0 '@inquirer/select': 2.5.0 - '@inquirer/prompts@7.8.4(@types/node@24.3.0)': - dependencies: - '@inquirer/checkbox': 4.2.2(@types/node@24.3.0) - '@inquirer/confirm': 5.1.16(@types/node@24.3.0) - '@inquirer/editor': 4.2.18(@types/node@24.3.0) - '@inquirer/expand': 4.0.18(@types/node@24.3.0) - '@inquirer/input': 4.2.2(@types/node@24.3.0) - '@inquirer/number': 3.0.18(@types/node@24.3.0) - '@inquirer/password': 4.0.18(@types/node@24.3.0) - '@inquirer/rawlist': 4.1.6(@types/node@24.3.0) - '@inquirer/search': 3.1.1(@types/node@24.3.0) - '@inquirer/select': 4.3.2(@types/node@24.3.0) + '@inquirer/prompts@8.5.2(@types/node@25.9.1)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@25.9.1) + '@inquirer/confirm': 6.1.1(@types/node@25.9.1) + '@inquirer/editor': 5.2.2(@types/node@25.9.1) + '@inquirer/expand': 5.1.1(@types/node@25.9.1) + '@inquirer/input': 5.1.2(@types/node@25.9.1) + '@inquirer/number': 4.1.1(@types/node@25.9.1) + '@inquirer/password': 5.1.1(@types/node@25.9.1) + '@inquirer/rawlist': 5.3.1(@types/node@25.9.1) + '@inquirer/search': 4.2.1(@types/node@25.9.1) + '@inquirer/select': 5.2.1(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/rawlist@2.3.0': dependencies: @@ -7387,13 +6299,12 @@ snapshots: '@inquirer/type': 1.5.5 yoctocolors-cjs: 2.1.3 - '@inquirer/rawlist@4.1.6(@types/node@24.3.0)': + '@inquirer/rawlist@5.3.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/search@1.1.0': dependencies: @@ -7402,14 +6313,13 @@ snapshots: '@inquirer/type': 1.5.5 yoctocolors-cjs: 2.1.3 - '@inquirer/search@3.1.1(@types/node@24.3.0)': + '@inquirer/search@4.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/select@2.5.0': dependencies: @@ -7419,15 +6329,14 @@ snapshots: ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 - '@inquirer/select@4.3.2(@types/node@24.3.0)': + '@inquirer/select@5.2.1(@types/node@25.9.1)': dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@25.9.1) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@inquirer/type@1.5.5': dependencies: @@ -7437,9 +6346,9 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.8(@types/node@24.3.0)': + '@inquirer/type@4.0.7(@types/node@25.9.1)': optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@ioredis/commands@1.3.1': {} @@ -7458,21 +6367,14 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@istanbuljs/schema@0.1.3': {} - - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.37.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.37.0(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@jridgewell/gen-mapping@0.3.12': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -7481,24 +6383,24 @@ snapshots: '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@keyv/serialize@1.1.1': {} + '@lukeed/csprng@1.1.0': {} '@lukeed/ms@2.0.2': {} @@ -7517,23 +6419,24 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 - '@napi-rs/cli@3.1.5(@emnapi/runtime@1.7.1)(@types/node@24.3.0)': + '@napi-rs/cli@3.7.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)(@types/node@25.9.1)': dependencies: - '@inquirer/prompts': 7.8.4(@types/node@24.3.0) - '@napi-rs/cross-toolchain': 1.0.3 - '@napi-rs/wasm-tools': 1.0.1 - '@octokit/rest': 22.0.0 + '@inquirer/prompts': 8.5.2(@types/node@25.9.1) + '@napi-rs/cross-toolchain': 1.0.3(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + '@napi-rs/wasm-tools': 1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + '@octokit/rest': 22.0.1 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 - debug: 4.4.1 - es-toolkit: 1.39.10 - find-up: 7.0.0 - js-yaml: 4.1.0 - semver: 7.7.2 + emnapi: 1.10.0 + es-toolkit: 1.47.0 + js-yaml: 4.1.1 + obug: 2.1.1 + semver: 7.8.1 typanion: 3.14.0 optionalDependencies: '@emnapi/runtime': 1.7.1 transitivePeerDependencies: + - '@emnapi/core' - '@napi-rs/cross-toolchain-arm64-target-aarch64' - '@napi-rs/cross-toolchain-arm64-target-armv7' - '@napi-rs/cross-toolchain-arm64-target-ppc64le' @@ -7545,14 +6448,17 @@ snapshots: - '@napi-rs/cross-toolchain-x64-target-s390x' - '@napi-rs/cross-toolchain-x64-target-x86_64' - '@types/node' + - node-addon-api - supports-color - '@napi-rs/cross-toolchain@1.0.3': + '@napi-rs/cross-toolchain@1.0.3(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/lzma': 1.4.5 - '@napi-rs/tar': 1.1.0 - debug: 4.4.1 + '@napi-rs/lzma': 1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + '@napi-rs/tar': 1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + debug: 4.4.3 transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - supports-color '@napi-rs/lzma-android-arm-eabi@1.4.5': @@ -7594,9 +6500,12 @@ snapshots: '@napi-rs/lzma-linux-x64-musl@1.4.5': optional: true - '@napi-rs/lzma-wasm32-wasi@1.4.5': + '@napi-rs/lzma-wasm32-wasi@1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@napi-rs/lzma-win32-arm64-msvc@1.4.5': @@ -7608,7 +6517,7 @@ snapshots: '@napi-rs/lzma-win32-x64-msvc@1.4.5': optional: true - '@napi-rs/lzma@1.4.5': + '@napi-rs/lzma@1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': optionalDependencies: '@napi-rs/lzma-android-arm-eabi': 1.4.5 '@napi-rs/lzma-android-arm64': 1.4.5 @@ -7623,10 +6532,13 @@ snapshots: '@napi-rs/lzma-linux-s390x-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-musl': 1.4.5 - '@napi-rs/lzma-wasm32-wasi': 1.4.5 + '@napi-rs/lzma-wasm32-wasi': 1.4.5(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) '@napi-rs/lzma-win32-arm64-msvc': 1.4.5 '@napi-rs/lzma-win32-ia32-msvc': 1.4.5 '@napi-rs/lzma-win32-x64-msvc': 1.4.5 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -7736,9 +6648,12 @@ snapshots: '@napi-rs/tar-linux-x64-musl@1.1.0': optional: true - '@napi-rs/tar-wasm32-wasi@1.1.0': + '@napi-rs/tar-wasm32-wasi@1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@napi-rs/tar-win32-arm64-msvc@1.1.0': @@ -7750,7 +6665,7 @@ snapshots: '@napi-rs/tar-win32-x64-msvc@1.1.0': optional: true - '@napi-rs/tar@1.1.0': + '@napi-rs/tar@1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': optionalDependencies: '@napi-rs/tar-android-arm-eabi': 1.1.0 '@napi-rs/tar-android-arm64': 1.1.0 @@ -7764,23 +6679,19 @@ snapshots: '@napi-rs/tar-linux-s390x-gnu': 1.1.0 '@napi-rs/tar-linux-x64-gnu': 1.1.0 '@napi-rs/tar-linux-x64-musl': 1.1.0 - '@napi-rs/tar-wasm32-wasi': 1.1.0 + '@napi-rs/tar-wasm32-wasi': 1.1.0(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) '@napi-rs/tar-win32-arm64-msvc': 1.1.0 '@napi-rs/tar-win32-ia32-msvc': 1.1.0 '@napi-rs/tar-win32-x64-msvc': 1.1.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 - optional: true - - '@napi-rs/wasm-runtime@1.0.3': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.2 optional: true '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': @@ -7810,9 +6721,12 @@ snapshots: '@napi-rs/wasm-tools-linux-x64-musl@1.0.1': optional: true - '@napi-rs/wasm-tools-wasm32-wasi@1.0.1': + '@napi-rs/wasm-tools-wasm32-wasi@1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1': @@ -7824,7 +6738,7 @@ snapshots: '@napi-rs/wasm-tools-win32-x64-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools@1.0.1': + '@napi-rs/wasm-tools@1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1)': optionalDependencies: '@napi-rs/wasm-tools-android-arm-eabi': 1.0.1 '@napi-rs/wasm-tools-android-arm64': 1.0.1 @@ -7835,10 +6749,13 @@ snapshots: '@napi-rs/wasm-tools-linux-arm64-musl': 1.0.1 '@napi-rs/wasm-tools-linux-x64-gnu': 1.0.1 '@napi-rs/wasm-tools-linux-x64-musl': 1.0.1 - '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1 + '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1(@emnapi/core@1.5.0)(@emnapi/runtime@1.7.1) '@napi-rs/wasm-tools-win32-arm64-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-ia32-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-x64-msvc': 1.0.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' '@nestjs/axios@4.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.11.0)(rxjs@7.8.2)': dependencies: @@ -7913,7 +6830,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.2 - '@nestjs/testing@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2))': + '@nestjs/testing@11.1.24(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2))': dependencies: '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -7921,10 +6838,6 @@ snapshots: '@next/env@16.0.7': {} - '@next/eslint-plugin-next@15.5.2': - dependencies: - fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.7': optional: true @@ -7961,75 +6874,185 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nolyfill/is-core-module@1.0.39': {} - '@nuxt/opencollective@0.4.1': dependencies: consola: 3.4.2 '@octokit/auth-token@6.0.0': {} - '@octokit/core@7.0.3': + '@octokit/core@7.0.6': dependencies: '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.1 - '@octokit/request': 10.0.3 - '@octokit/request-error': 7.0.0 - '@octokit/types': 14.1.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.10 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@11.0.0': + '@octokit/endpoint@11.0.3': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/graphql@9.0.1': + '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 10.0.3 - '@octokit/types': 14.1.0 + '@octokit/request': 10.0.10 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/openapi-types@25.1.0': {} + '@octokit/openapi-types@27.0.0': {} - '@octokit/plugin-paginate-rest@13.1.1(@octokit/core@7.0.3)': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 7.0.3 - '@octokit/types': 14.1.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.3)': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 7.0.3 + '@octokit/core': 7.0.6 - '@octokit/plugin-rest-endpoint-methods@16.0.0(@octokit/core@7.0.3)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 7.0.3 - '@octokit/types': 14.1.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/request-error@7.0.0': + '@octokit/request-error@7.1.0': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 16.0.0 - '@octokit/request@10.0.3': + '@octokit/request@10.0.10': dependencies: - '@octokit/endpoint': 11.0.0 - '@octokit/request-error': 7.0.0 - '@octokit/types': 14.1.0 - fast-content-type-parse: 3.0.0 + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + content-type: 2.0.0 + json-with-bigint: 3.5.8 universal-user-agent: 7.0.3 - '@octokit/rest@22.0.0': + '@octokit/rest@22.0.1': dependencies: - '@octokit/core': 7.0.3 - '@octokit/plugin-paginate-rest': 13.1.1(@octokit/core@7.0.3) - '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.3) - '@octokit/plugin-rest-endpoint-methods': 16.0.0(@octokit/core@7.0.3) + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - '@octokit/types@14.1.0': + '@octokit/types@16.0.0': dependencies: - '@octokit/openapi-types': 25.1.0 + '@octokit/openapi-types': 27.0.0 + + '@oxfmt/binding-android-arm-eabi@0.53.0': + optional: true + + '@oxfmt/binding-android-arm64@0.53.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.53.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.53.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.53.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.53.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.53.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.53.0': + optional: true - '@pkgjs/parseargs@0.11.0': + '@oxfmt/binding-linux-arm64-musl@0.53.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.53.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.53.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.53.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.53.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.53.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.53.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.53.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.68.0': + optional: true + + '@oxlint/binding-android-arm64@1.68.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.68.0': + optional: true + + '@oxlint/binding-darwin-x64@1.68.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.68.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.68.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.68.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.68.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.68.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.68.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.68.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.68.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.68.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.68.0': optional: true '@pm2/agent@2.1.1': @@ -8078,7 +7101,7 @@ snapshots: '@pm2/pm2-version-check@1.0.4': dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8086,331 +7109,284 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.16)(react@19.2.1) aria-hidden: 1.2.6 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.1) + react-remove-scroll: 2.7.1(@types/react@19.2.16)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.16)(react@19.2.1) '@radix-ui/rect': 1.1.1 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.16)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.2.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.16)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 '@radix-ui/rect@1.1.1': {} - '@rollup/pluginutils@5.2.0(rollup@4.49.0)': + '@rollup/pluginutils@5.4.0(rollup@4.61.0)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: - rollup: 4.49.0 - - '@rollup/rollup-android-arm-eabi@4.45.1': - optional: true + rollup: 4.61.0 - '@rollup/rollup-android-arm-eabi@4.49.0': + '@rollup/rollup-android-arm-eabi@4.61.0': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.61.0': optional: true - '@rollup/rollup-android-arm64@4.49.0': + '@rollup/rollup-darwin-arm64@4.61.0': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-x64@4.61.0': optional: true - '@rollup/rollup-darwin-arm64@4.49.0': + '@rollup/rollup-freebsd-arm64@4.61.0': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.61.0': optional: true - '@rollup/rollup-darwin-x64@4.49.0': + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.61.0': optional: true - '@rollup/rollup-freebsd-arm64@4.49.0': + '@rollup/rollup-linux-arm64-gnu@4.61.0': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.61.0': optional: true - '@rollup/rollup-freebsd-x64@4.49.0': + '@rollup/rollup-linux-loong64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-loong64-musl@4.61.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.49.0': + '@rollup/rollup-linux-ppc64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-ppc64-musl@4.61.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.49.0': + '@rollup/rollup-linux-riscv64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.61.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.49.0': + '@rollup/rollup-linux-s390x-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.49.0': + '@rollup/rollup-linux-x64-musl@4.61.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-openbsd-x64@4.61.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.49.0': + '@rollup/rollup-openharmony-arm64@4.61.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.61.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.49.0': + '@rollup/rollup-win32-ia32-msvc@4.61.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-win32-x64-gnu@4.61.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.49.0': + '@rollup/rollup-win32-x64-msvc@4.61.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': - optional: true + '@scarf/scarf@1.4.0': {} - '@rollup/rollup-linux-riscv64-musl@4.49.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.45.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.49.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.45.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.49.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.45.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.49.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.45.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.49.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.45.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.49.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.45.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.49.0': - optional: true - - '@rtsao/scc@1.1.0': {} - - '@rushstack/eslint-patch@1.12.0': {} - - '@scarf/scarf@1.4.0': {} + '@sec-ant/readable-stream@0.4.1': {} '@sentry-internal/tracing@7.120.4': dependencies: @@ -8444,79 +7420,83 @@ snapshots: dependencies: '@sentry/types': 7.120.4 - '@sindresorhus/is@5.6.0': {} + '@sindresorhus/is@7.2.0': {} - '@stylistic/eslint-plugin@5.2.3(eslint@9.34.0(jiti@2.6.1))': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@typescript-eslint/types': 8.41.0 - eslint: 9.34.0(jiti@2.6.1) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.3 + '@sindresorhus/merge-streams@4.0.0': {} + + '@standard-schema/spec@1.1.0': {} - '@swc/cli@0.7.8(@swc/core@1.13.5(@swc/helpers@0.5.17))': + '@swc/cli@0.8.1(@swc/core@1.15.40(@swc/helpers@0.5.23))': dependencies: - '@swc/core': 1.13.5(@swc/helpers@0.5.17) + '@swc/core': 1.15.40(@swc/helpers@0.5.23) '@swc/counter': 0.1.3 - '@xhmikosr/bin-wrapper': 13.2.0 + '@xhmikosr/bin-wrapper': 14.2.5 commander: 8.3.0 - minimatch: 9.0.5 + minimatch: 9.0.9 piscina: 4.9.2 - semver: 7.7.2 + semver: 7.8.1 slash: 3.0.0 source-map: 0.7.6 - tinyglobby: 0.2.14 + tinyglobby: 0.2.17 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@swc/core-darwin-arm64@1.13.5': + '@swc/core-darwin-arm64@1.15.40': + optional: true + + '@swc/core-darwin-x64@1.15.40': optional: true - '@swc/core-darwin-x64@1.13.5': + '@swc/core-linux-arm-gnueabihf@1.15.40': optional: true - '@swc/core-linux-arm-gnueabihf@1.13.5': + '@swc/core-linux-arm64-gnu@1.15.40': optional: true - '@swc/core-linux-arm64-gnu@1.13.5': + '@swc/core-linux-arm64-musl@1.15.40': optional: true - '@swc/core-linux-arm64-musl@1.13.5': + '@swc/core-linux-ppc64-gnu@1.15.40': optional: true - '@swc/core-linux-x64-gnu@1.13.5': + '@swc/core-linux-s390x-gnu@1.15.40': optional: true - '@swc/core-linux-x64-musl@1.13.5': + '@swc/core-linux-x64-gnu@1.15.40': optional: true - '@swc/core-win32-arm64-msvc@1.13.5': + '@swc/core-linux-x64-musl@1.15.40': optional: true - '@swc/core-win32-ia32-msvc@1.13.5': + '@swc/core-win32-arm64-msvc@1.15.40': optional: true - '@swc/core-win32-x64-msvc@1.13.5': + '@swc/core-win32-ia32-msvc@1.15.40': optional: true - '@swc/core@1.13.5(@swc/helpers@0.5.17)': + '@swc/core-win32-x64-msvc@1.15.40': + optional: true + + '@swc/core@1.15.40(@swc/helpers@0.5.23)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.24 + '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.13.5 - '@swc/core-darwin-x64': 1.13.5 - '@swc/core-linux-arm-gnueabihf': 1.13.5 - '@swc/core-linux-arm64-gnu': 1.13.5 - '@swc/core-linux-arm64-musl': 1.13.5 - '@swc/core-linux-x64-gnu': 1.13.5 - '@swc/core-linux-x64-musl': 1.13.5 - '@swc/core-win32-arm64-msvc': 1.13.5 - '@swc/core-win32-ia32-msvc': 1.13.5 - '@swc/core-win32-x64-msvc': 1.13.5 - '@swc/helpers': 0.5.17 + '@swc/core-darwin-arm64': 1.15.40 + '@swc/core-darwin-x64': 1.15.40 + '@swc/core-linux-arm-gnueabihf': 1.15.40 + '@swc/core-linux-arm64-gnu': 1.15.40 + '@swc/core-linux-arm64-musl': 1.15.40 + '@swc/core-linux-ppc64-gnu': 1.15.40 + '@swc/core-linux-s390x-gnu': 1.15.40 + '@swc/core-linux-x64-gnu': 1.15.40 + '@swc/core-linux-x64-musl': 1.15.40 + '@swc/core-win32-arm64-msvc': 1.15.40 + '@swc/core-win32-ia32-msvc': 1.15.40 + '@swc/core-win32-x64-msvc': 1.15.40 + '@swc/helpers': 0.5.23 '@swc/counter@0.1.3': {} @@ -8524,86 +7504,82 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.17': + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 - '@swc/types@0.1.24': + '@swc/types@0.1.26': dependencies: '@swc/counter': 0.1.3 - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - - '@tailwindcss/node@4.1.17': + '@tailwindcss/node@4.3.0': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 - jiti: 2.6.1 - lightningcss: 1.30.2 + enhanced-resolve: 5.22.1 + jiti: 2.7.0 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.17 + tailwindcss: 4.3.0 - '@tailwindcss/oxide-android-arm64@4.1.17': + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.17': + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.17': + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.17': + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.17': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.17': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true - '@tailwindcss/oxide@4.1.17': + '@tailwindcss/oxide@4.3.0': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.17 - '@tailwindcss/oxide-darwin-arm64': 4.1.17 - '@tailwindcss/oxide-darwin-x64': 4.1.17 - '@tailwindcss/oxide-freebsd-x64': 4.1.17 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 - '@tailwindcss/oxide-linux-x64-musl': 4.1.17 - '@tailwindcss/oxide-wasm32-wasi': 4.1.17 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 - - '@tailwindcss/postcss@4.1.17': + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/postcss@4.3.0': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.17 - '@tailwindcss/oxide': 4.1.17 - postcss: 8.5.6 - tailwindcss: 4.1.17 + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + postcss: 8.5.15 + tailwindcss: 4.3.0 '@tanstack/query-core@5.90.12': {} @@ -8614,17 +7590,42 @@ snapshots: '@tokenizer/inflate@0.2.7': dependencies: - debug: 4.4.1 + debug: 4.4.3 fflate: 0.8.2 token-types: 6.1.1 transitivePeerDependencies: - supports-color + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + '@tokenizer/token@0.3.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tybys/wasm-util@0.10.0': + '@turbo/darwin-64@2.9.16': + optional: true + + '@turbo/darwin-arm64@2.9.16': + optional: true + + '@turbo/linux-64@2.9.16': + optional: true + + '@turbo/linux-arm64@2.9.16': + optional: true + + '@turbo/windows-64@2.9.16': + optional: true + + '@turbo/windows-arm64@2.9.16': + optional: true + + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true @@ -8638,23 +7639,16 @@ snapshots: semver: 7.7.2 tslib: 2.8.1 - '@types/chai@5.2.2': + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 - - '@types/conventional-commits-parser@5.0.1': - dependencies: - '@types/node': 24.3.0 + assertion-error: 2.0.1 '@types/deep-eql@4.0.2': {} - '@types/eslint__js@9.14.0': - dependencies: - '@eslint/js': 9.34.0 - - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} - '@types/http-cache-semantics@4.0.4': {} + '@types/http-cache-semantics@4.2.0': {} '@types/i18next-fs-backend@1.2.0': dependencies: @@ -8667,41 +7661,39 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/luxon@3.7.1': {} '@types/mute-stream@0.0.4': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@types/node-rsa@1.1.4': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 - '@types/node@22.18.0': + '@types/node@22.19.19': dependencies: undici-types: 6.21.0 - '@types/node@24.3.0': + '@types/node@25.9.1': dependencies: - undici-types: 7.10.0 + undici-types: 7.24.6 - '@types/react-dom@19.2.3(@types/react@19.2.7)': + '@types/react-dom@19.2.3(@types/react@19.2.16)': dependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - '@types/react@19.2.7': + '@types/react@19.2.16': dependencies: csstype: 3.2.3 '@types/readable-stream@4.0.21': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@types/through@0.0.33': dependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 '@types/validator@13.15.2': {} @@ -8713,50 +7705,12 @@ snapshots: '@types/wrap-ansi@3.0.0': {} - '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - eslint: 9.34.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1 - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.37.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.37.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@6.0.3) '@typescript-eslint/types': 8.37.0 - debug: 4.4.1 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - debug: 4.4.1 - typescript: 5.9.2 + debug: 4.4.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8765,86 +7719,36 @@ snapshots: '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 - '@typescript-eslint/scope-manager@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - - '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - - '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - - '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - debug: 4.4.1 - eslint: 9.34.0(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + typescript: 6.0.3 '@typescript-eslint/types@8.37.0': {} - '@typescript-eslint/types@8.41.0': {} - - '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.37.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.37.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.37.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@6.0.3) '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 - debug: 4.4.1 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': + '@typescript-eslint/utils@8.37.0(eslint@9.34.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.37.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@6.0.3) + eslint: 9.34.0(jiti@2.7.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8853,69 +7757,36 @@ snapshots: '@typescript-eslint/types': 8.37.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - eslint-visitor-keys: 4.2.1 - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260601.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true + '@typescript/native-preview@7.0.0-dev.20260601.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260601.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260601.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260601.1 '@vercel/analytics@1.6.1(next@16.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: @@ -8927,77 +7798,71 @@ snapshots: next: 16.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': + '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1 + '@vitest/utils': 4.1.8 + ast-v8-to-istanbul: 1.0.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - supports-color + istanbul-reports: 3.2.0 + magicast: 0.5.3 + obug: 2.1.1 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) - '@vitest/expect@3.2.4': + '@vitest/expect@4.1.8': dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - tinyrainbow: 2.0.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitest/mocker@4.1.8(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.1.8': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.0 - '@vitest/runner@3.2.4': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 + '@vitest/spy@4.1.8': {} - '@vitest/ui@3.2.4(vitest@3.2.4)': + '@vitest/ui@4.1.8(vitest@4.1.8)': dependencies: - '@vitest/utils': 3.2.4 - fflate: 0.8.2 - flatted: 3.3.3 + '@vitest/utils': 4.1.8 + fflate: 0.8.3 + flatted: 3.4.2 pathe: 2.0.3 - sirv: 3.0.1 - tinyglobby: 0.2.14 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2) + sirv: 3.0.2 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) - '@vitest/utils@3.2.4': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 '@xboxreplay/errors@0.1.0': {} @@ -9008,93 +7873,99 @@ snapshots: transitivePeerDependencies: - debug - '@xhmikosr/archive-type@7.1.0': + '@xhmikosr/archive-type@8.0.1': dependencies: - file-type: 20.5.0 + file-type: 21.3.4 transitivePeerDependencies: - supports-color - '@xhmikosr/bin-check@7.1.0': + '@xhmikosr/bin-check@8.2.1': dependencies: - execa: 5.1.1 - isexe: 2.0.0 + execa: 9.6.1 + isexe: 4.0.0 - '@xhmikosr/bin-wrapper@13.2.0': + '@xhmikosr/bin-wrapper@14.2.5': dependencies: - '@xhmikosr/bin-check': 7.1.0 - '@xhmikosr/downloader': 15.2.0 - '@xhmikosr/os-filter-obj': 3.0.0 - bin-version-check: 5.1.0 + '@xhmikosr/bin-check': 8.2.1 + '@xhmikosr/downloader': 16.1.3 + '@xhmikosr/os-filter-obj': 4.1.0 + binary-version-check: 6.1.0 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-tar@8.1.0': + '@xhmikosr/decompress-tar@9.0.1': dependencies: - file-type: 20.5.0 - is-stream: 2.0.1 + file-type: 21.3.4 + is-stream: 4.0.1 tar-stream: 3.1.7 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-tarbz2@8.1.0': + '@xhmikosr/decompress-tarbz2@9.0.1': dependencies: - '@xhmikosr/decompress-tar': 8.1.0 - file-type: 20.5.0 - is-stream: 2.0.1 + '@xhmikosr/decompress-tar': 9.0.1 + file-type: 21.3.4 + is-stream: 4.0.1 seek-bzip: 2.0.0 unbzip2-stream: 1.4.3 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-targz@8.1.0': + '@xhmikosr/decompress-targz@9.0.1': dependencies: - '@xhmikosr/decompress-tar': 8.1.0 - file-type: 20.5.0 - is-stream: 2.0.1 + '@xhmikosr/decompress-tar': 9.0.1 + file-type: 21.3.4 + is-stream: 4.0.1 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/decompress-unzip@7.1.0': + '@xhmikosr/decompress-unzip@8.1.1': dependencies: - file-type: 20.5.0 - get-stream: 6.0.1 - yauzl: 3.2.0 + file-type: 21.3.4 + get-stream: 9.0.1 + yauzl: 3.3.2 transitivePeerDependencies: - supports-color - '@xhmikosr/decompress@10.2.0': + '@xhmikosr/decompress@11.1.3': dependencies: - '@xhmikosr/decompress-tar': 8.1.0 - '@xhmikosr/decompress-tarbz2': 8.1.0 - '@xhmikosr/decompress-targz': 8.1.0 - '@xhmikosr/decompress-unzip': 7.1.0 + '@xhmikosr/decompress-tar': 9.0.1 + '@xhmikosr/decompress-tarbz2': 9.0.1 + '@xhmikosr/decompress-targz': 9.0.1 + '@xhmikosr/decompress-unzip': 8.1.1 graceful-fs: 4.2.11 strip-dirs: 3.0.0 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/downloader@15.2.0': + '@xhmikosr/downloader@16.1.3': dependencies: - '@xhmikosr/archive-type': 7.1.0 - '@xhmikosr/decompress': 10.2.0 - content-disposition: 0.5.4 - defaults: 2.0.2 + '@xhmikosr/archive-type': 8.0.1 + '@xhmikosr/decompress': 11.1.3 + content-disposition: 2.0.1 ext-name: 5.0.0 - file-type: 20.5.0 - filenamify: 6.0.0 - get-stream: 6.0.1 - got: 13.0.0 + file-type: 21.3.4 + filenamify: 7.0.1 + get-stream: 9.0.1 + got: 14.6.6 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@xhmikosr/os-filter-obj@3.0.0': - dependencies: - arch: 3.0.0 - - JSONStream@1.3.5: + '@xhmikosr/os-filter-obj@4.1.0': dependencies: - jsonparse: 1.3.1 - through: 2.3.8 + system-architecture: 1.0.0 abort-controller@3.0.0: dependencies: @@ -9102,11 +7973,11 @@ snapshots: abstract-logging@2.0.1: {} - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} aes-js@3.1.2: {} @@ -9123,6 +7994,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -9146,10 +8024,6 @@ snapshots: ansi-regex@6.2.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -9161,9 +8035,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 - - arch@3.0.0: {} + picomatch: 2.3.2 argparse@2.0.1: {} @@ -9171,94 +8043,19 @@ snapshots: dependencies: tslib: 2.8.1 - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-ify@1.0.0: {} - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - asn1@0.2.3: {} assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - ast-types@0.13.4: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@1.0.3: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 - js-tokens: 9.0.1 - - async-function@1.0.0: {} + js-tokens: 10.0.0 async@2.6.4: dependencies: @@ -9268,21 +8065,13 @@ snapshots: asynckit@0.4.0: {} - at-least-node@1.0.0: {} - atomic-sleep@1.0.0: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - avvio@9.1.0: dependencies: '@fastify/error': 4.2.0 fastq: 1.19.1 - axe-core@4.10.3: {} - axios@0.21.4(debug@4.4.1): dependencies: follow-redirects: 1.15.11(debug@4.4.1) @@ -9291,20 +8080,17 @@ snapshots: axios@1.11.0: dependencies: - follow-redirects: 1.15.11(debug@4.4.1) + follow-redirects: 1.15.11 form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axobject-query@4.1.0: {} - - b4a@1.6.7: {} + b4a@1.8.1: {} balanced-match@1.0.2: {} - bare-events@2.6.1: - optional: true + bare-events@2.8.3: {} base64-js@1.5.1: {} @@ -9312,30 +8098,24 @@ snapshots: before-after-hook@4.0.0: {} - bin-version-check@5.1.0: - dependencies: - bin-version: 6.0.0 - semver: 7.7.2 - semver-truncate: 3.0.0 + binary-extensions@2.3.0: {} - bin-version@6.0.0: + binary-version-check@6.1.0: dependencies: - execa: 5.1.1 - find-versions: 5.1.0 - - binary-extensions@2.3.0: {} + binary-version: 7.1.0 + semver: 7.8.1 + semver-truncate: 3.0.0 - bl@4.1.0: + binary-version@7.1.0: dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + execa: 8.0.1 + find-versions: 6.0.0 blessed@0.1.81: {} bodec@0.1.0: {} - brace-expansion@1.1.12: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -9344,21 +8124,16 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.3: + brace-expansion@2.1.1: dependencies: - fill-range: 7.1.1 + balanced-match: 1.0.2 - browserslist@4.25.3: + braces@3.0.3: dependencies: - caniuse-lite: 1.0.30001737 - electron-to-chromium: 1.5.209 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.3) + fill-range: 7.1.1 bson@6.10.4: {} - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} buffer-equal@1.0.1: {} @@ -9375,60 +8150,30 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@5.0.0: {} - - cac@6.7.14: {} + byte-counter@0.1.0: {} cacheable-lookup@7.0.0: {} - cacheable-request@10.2.14: + cacheable-request@13.0.19: dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 + '@types/http-cache-semantics': 4.2.0 + get-stream: 9.0.1 http-cache-semantics: 4.2.0 - keyv: 4.5.4 + keyv: 5.6.0 mimic-response: 4.0.0 - normalize-url: 8.0.2 - responselike: 3.0.0 - - cachedir@2.3.0: {} + normalize-url: 8.1.1 + responselike: 4.0.2 call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@3.1.0: {} - caniuse-lite@1.0.30001737: {} - caniuse-lite@1.0.30001759: {} - chai@5.2.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.1 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + chai@6.2.2: {} chalk@3.0.0: dependencies: @@ -9442,16 +8187,12 @@ snapshots: chalk@5.6.0: {} - change-case@5.4.4: {} - chardet@0.7.0: {} - chardet@2.1.0: {} + chardet@2.1.1: {} charm@0.1.2: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -9464,8 +8205,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - ci-info@4.3.0: {} - class-transformer@0.5.1: {} class-validator@0.14.2: @@ -9474,22 +8213,10 @@ snapshots: libphonenumber-js: 1.12.10 validator: 13.15.15 - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} - cli-tableau@2.0.1: dependencies: chalk: 3.0.0 - cli-width@3.0.0: {} - cli-width@4.1.0: {} client-only@0.0.1: {} @@ -9498,26 +8225,12 @@ snapshots: dependencies: typanion: 3.14.0 - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} - cluster-key-slot@1.1.2: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} colorette@2.0.20: {} @@ -9534,31 +8247,6 @@ snapshots: commander@8.3.0: {} - commitizen@4.3.1(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@24.3.0)(typescript@5.9.2) - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - '@types/node' - - typescript - - compare-func@2.0.0: - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - concat-map@0.0.1: {} consola@3.4.2: {} @@ -9567,45 +8255,16 @@ snapshots: dependencies: safe-buffer: 5.2.1 - conventional-changelog-angular@7.0.0: - dependencies: - compare-func: 2.0.0 + content-disposition@2.0.1: {} - conventional-changelog-conventionalcommits@7.0.2: - dependencies: - compare-func: 2.0.0 + content-type@2.0.0: {} - conventional-commit-types@3.0.0: {} + convert-hrtime@5.0.0: {} - conventional-commits-parser@5.0.0: - dependencies: - JSONStream: 1.3.5 - is-text-path: 2.0.0 - meow: 12.1.1 - split2: 4.2.0 + convert-source-map@2.0.0: {} cookie@1.0.2: {} - core-js-compat@3.45.1: - dependencies: - browserslist: 4.25.3 - - cosmiconfig-typescript-loader@6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): - dependencies: - '@types/node': 24.3.0 - cosmiconfig: 9.0.0(typescript@5.9.2) - jiti: 2.5.1 - typescript: 5.9.2 - - cosmiconfig@9.0.0(typescript@5.9.2): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.9.2 - croner@4.1.97: {} croner@8.1.2: {} @@ -9620,44 +8279,8 @@ snapshots: culvert@0.1.2: {} - cz-conventional-changelog@3.3.0(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - chalk: 2.4.2 - commitizen: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) - conventional-commit-types: 3.0.0 - lodash.map: 4.6.0 - longest: 2.0.1 - word-wrap: 1.2.5 - optionalDependencies: - '@commitlint/load': 19.8.1(@types/node@24.3.0)(typescript@5.9.2) - transitivePeerDependencies: - - '@types/node' - - typescript - - damerau-levenshtein@1.0.8: {} - - dargs@8.1.0: {} - data-uri-to-buffer@6.0.2: {} - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - date-fns@4.1.0: {} dayjs@1.11.15: {} @@ -9676,35 +8299,15 @@ snapshots: dependencies: ms: 2.1.3 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - dedent@0.7.0: {} - - deep-eql@5.0.2: {} - - deep-is@0.1.4: {} - - defaults@1.0.4: + debug@4.4.3: dependencies: - clone: 1.0.4 - - defaults@2.0.2: {} - - defer-to-connect@2.0.1: {} + ms: 2.1.3 - define-data-property@1.1.4: + decompress-response@10.0.0: dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 + mimic-response: 4.0.0 - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 + deep-is@0.1.4: {} degenerator@5.0.1: dependencies: @@ -9720,10 +8323,6 @@ snapshots: dequal@2.0.3: {} - detect-file@1.0.0: {} - - detect-indent@6.1.0: {} - detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -9732,14 +8331,6 @@ snapshots: discord-api-types@0.38.22: {} - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9752,7 +8343,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - electron-to-chromium@1.5.209: {} + emnapi@1.10.0: {} emoji-regex@8.0.0: {} @@ -9760,330 +8351,79 @@ snapshots: endian-toggle@0.0.0: {} - enhanced-resolve@5.18.3: + enhanced-resolve@5.22.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - env-paths@2.2.1: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - es-toolkit@1.39.10: {} - - esbuild@0.25.6: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-next@15.5.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): - dependencies: - '@next/eslint-plugin-next': 15.5.2 - '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.34.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.34.0(jiti@2.6.1)) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.6.1)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.1 - eslint: 9.34.0(jiti@2.6.1) - get-tsconfig: 4.10.1 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.14 - unrs-resolver: 1.11.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.34.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0(jiti@2.6.1)) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color + dependencies: + es-errors: 1.3.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.34.0(jiti@2.6.1)): + es-set-tostringtag@2.1.0: dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 9.34.0(jiti@2.6.1) + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - eslint-plugin-license-header@0.8.0: - dependencies: - requireindex: 1.2.0 + es-toolkit@1.47.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.6.1)): - dependencies: - eslint: 9.34.0(jiti@2.6.1) + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} - eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.6.1)): + escodegen@2.1.0: dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 9.34.0(jiti@2.6.1) + esprima: 4.0.1 estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-plugin-unicorn@60.0.0(eslint@9.34.0(jiti@2.6.1)): - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@eslint/plugin-kit': 0.3.5 - change-case: 5.4.4 - ci-info: 4.3.0 - clean-regexp: 1.0.0 - core-js-compat: 3.45.1 - eslint: 9.34.0(jiti@2.6.1) - esquery: 1.6.0 - find-up-simple: 1.0.1 - globals: 16.3.0 - indent-string: 5.0.0 - is-builtin-module: 5.0.0 - jsesc: 3.1.0 - pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.12.0 - semver: 7.7.2 - strip-indent: 4.0.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)): + eslint-plugin-license-header@0.9.0(eslint@9.34.0(jiti@2.7.0)): dependencies: - eslint: 9.34.0(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.7.0) + requireindex: 1.2.0 eslint-scope@8.4.0: dependencies: @@ -10094,30 +8434,30 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.34.0(jiti@2.6.1): + eslint@9.34.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.34.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.1 + '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 - ajv: 6.12.6 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -10128,23 +8468,23 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -10158,7 +8498,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -10168,25 +8508,42 @@ snapshots: eventemitter2@6.4.9: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.3 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} - execa@5.1.1: + execa@8.0.1: dependencies: cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 - expand-tilde@2.0.2: + execa@9.6.1: dependencies: - homedir-polyfill: 1.0.3 + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 - expect-type@1.2.2: {} + expect-type@1.3.0: {} ext-list@2.2.2: dependencies: @@ -10209,22 +8566,12 @@ snapshots: transitivePeerDependencies: - debug - fast-content-type-parse@3.0.0: {} - fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10256,8 +8603,18 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.0: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fastify-plugin@5.0.1: {} fastify@5.4.0: @@ -10302,21 +8659,23 @@ snapshots: fclone@1.0.11: {} - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 fflate@0.8.2: {} - figures@3.2.0: + fflate@0.8.3: {} + + figures@6.1.0: dependencies: - escape-string-regexp: 1.0.5 + is-unicode-supported: 2.1.0 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - file-type@20.5.0: + file-type@21.0.0: dependencies: '@tokenizer/inflate': 0.2.7 strtok3: 10.3.4 @@ -10325,20 +8684,20 @@ snapshots: transitivePeerDependencies: - supports-color - file-type@21.0.0: + file-type@21.3.4: dependencies: - '@tokenizer/inflate': 0.2.7 - strtok3: 10.3.4 - token-types: 6.1.1 + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color - filename-reserved-regex@3.0.0: {} + filename-reserved-regex@4.0.0: {} - filenamify@6.0.0: + filenamify@7.0.1: dependencies: - filename-reserved-regex: 3.0.0 + filename-reserved-regex: 4.0.0 fill-range@7.1.1: dependencies: @@ -10350,43 +8709,24 @@ snapshots: fast-querystring: 1.1.2 safe-regex2: 5.0.0 - find-node-modules@2.1.3: - dependencies: - findup-sync: 4.0.0 - merge: 2.1.1 - - find-root@1.1.0: {} - - find-up-simple@1.0.1: {} - find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - - find-versions@5.1.0: + find-versions@6.0.0: dependencies: semver-regex: 4.0.5 - - findup-sync@4.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 + super-regex: 1.1.0 flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.4.2: {} + + follow-redirects@1.15.11: {} follow-redirects@1.15.11(debug@4.3.7): optionalDependencies: @@ -10396,16 +8736,12 @@ snapshots: optionalDependencies: debug: 4.4.1 - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data-encoder@2.1.4: {} + form-data-encoder@4.1.0: {} form-data@4.0.4: dependencies: @@ -10424,35 +8760,15 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} + function-timeout@1.0.2: {} fuse.js@7.1.0: {} - get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10473,23 +8789,18 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@6.0.1: {} - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-stream@8.0.1: {} - get-tsconfig@4.10.1: + get-stream@9.0.1: dependencies: - resolve-pkg-maps: 1.0.0 + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 get-uri@6.0.5: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10497,12 +8808,6 @@ snapshots: optionalDependencies: js-git: 0.7.8 - git-raw-commits@4.0.0: - dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 - git-sha1@0.1.2: {} glob-parent@5.1.2: @@ -10513,15 +8818,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@11.0.3: dependencies: foreground-child: 3.3.1 @@ -10531,62 +8827,27 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - global-directory@4.0.1: - dependencies: - ini: 4.1.1 - - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - globals@14.0.0: {} - globals@16.3.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - gopd@1.2.0: {} - got@13.0.0: + got@14.6.6: dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 + '@sindresorhus/is': 7.2.0 + byte-counter: 0.1.0 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 + cacheable-request: 13.0.19 + decompress-response: 10.0.0 + form-data-encoder: 4.1.0 http2-wrapper: 2.2.1 + keyv: 5.6.0 lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 + p-cancelable: 4.0.1 + responselike: 4.0.2 + type-fest: 4.41.0 graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -10596,20 +8857,8 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - has-bigints@1.1.0: {} - - has-flag@3.0.0: {} - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -10620,10 +8869,6 @@ snapshots: dependencies: function-bind: 1.1.2 - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - html-escaper@2.0.2: {} http-cache-semantics@4.2.0: {} @@ -10639,7 +8884,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10655,7 +8900,9 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} + human-signals@5.0.0: {} + + human-signals@8.0.1: {} i18next-fs-backend@2.6.0: {} @@ -10667,7 +8914,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -10675,8 +8922,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - immediate@3.0.6: {} import-fresh@3.3.1: @@ -10684,23 +8929,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} - imurmurhash@0.1.4: {} - indent-string@5.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@1.3.8: {} - ini@4.1.1: {} - inquirer@10.2.2: dependencies: '@inquirer/core': 9.2.1 @@ -10712,34 +8946,10 @@ snapshots: run-async: 3.0.0 rxjs: 7.8.2 - inquirer@8.2.5: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - inspect-with-kind@1.0.5: dependencies: kind-of: 6.0.3 - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - ioredis@5.7.0: dependencies: '@ioredis/commands': 1.3.1 @@ -10758,153 +8968,40 @@ snapshots: ipaddr.js@2.2.0: {} - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-builtin-module@5.0.0: - dependencies: - builtin-modules: 5.0.0 - - is-bun-module@2.0.0: - dependencies: - semver: 7.7.2 - - is-callable@1.2.7: {} - is-class@0.0.9: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-obj@2.0.0: {} - is-plain-obj@1.1.0: {} - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-stream@2.0.1: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-text-path@2.0.0: - dependencies: - text-extensions: 2.4.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-unicode-supported@0.1.0: {} - - is-utf8@0.2.1: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 + is-plain-obj@4.1.0: {} - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + is-stream@3.0.0: {} - is-windows@1.0.2: {} + is-stream@4.0.1: {} - isarray@2.0.5: {} + is-unicode-supported@2.1.0: {} isexe@2.0.0: {} + isexe@4.0.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -10913,43 +9010,18 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 iterare@1.2.1: {} - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 - jiti@2.5.1: {} - - jiti@2.6.1: {} + jiti@2.7.0: {} js-git@0.7.8: dependencies: @@ -10958,22 +9030,22 @@ snapshots: git-sha1: 0.1.2 pako: 0.2.9 - js-tokens@4.0.0: {} - - js-tokens@9.0.1: {} + js-tokens@10.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsesc@3.0.2: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 - jsesc@3.1.0: {} + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-ref-resolver@2.0.1: dependencies: dequal: 2.0.3 @@ -10987,17 +9059,7 @@ snapshots: json-stringify-safe@5.0.1: optional: true - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonparse@1.3.1: {} + json-with-bigint@3.5.8: {} jsonwebtoken@9.0.2: dependencies: @@ -11012,13 +9074,6 @@ snapshots: ms: 2.1.3 semver: 7.7.2 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 @@ -11036,13 +9091,11 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: + keyv@5.6.0: dependencies: - language-subtag-registry: 0.3.23 + '@keyv/serialize': 1.1.1 + + kind-of@6.0.3: {} levn@0.4.1: dependencies: @@ -11061,56 +9114,54 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 - - lines-and-columns@1.2.4: {} + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 load-esm@1.0.2: {} @@ -11122,12 +9173,6 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash.camelcase@4.3.0: {} - lodash.defaults@4.2.0: {} lodash.includes@4.3.0: {} @@ -11144,47 +9189,18 @@ snapshots: lodash.isstring@4.0.1: {} - lodash.kebabcase@4.1.1: {} - - lodash.map@4.6.0: {} - lodash.merge@4.6.2: {} - lodash.mergewith@4.6.2: {} - lodash.once@4.1.1: {} lodash.reduce@4.6.0: {} - lodash.snakecase@4.1.1: {} - - lodash.startcase@4.4.0: {} - - lodash.uniq@4.5.0: {} - - lodash.upperfirst@4.3.1: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loglevel@1.9.2: {} - - longest@2.0.1: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 + lodash@4.17.21: {} - loupe@3.1.4: {} + loglevel@1.9.2: {} lowercase-keys@3.0.0: {} - lru-cache@10.4.3: {} - lru-cache@11.1.0: {} lru-cache@6.0.0: @@ -11197,40 +9213,38 @@ snapshots: macaddress@0.5.3: {} - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.3: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.8.1 math-intrinsics@1.1.0: {} memory-pager@1.5.0: {} - meow@12.1.1: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} - merge@2.1.1: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -11242,14 +9256,10 @@ snapshots: mime@3.0.0: {} - mimic-fn@2.1.0: {} - - mimic-response@3.1.0: {} + mimic-fn@4.0.0: {} mimic-response@4.0.0: {} - min-indent@1.0.1: {} - minecraft-data@3.93.0: {} minecraft-folder-path@1.2.0: {} @@ -11283,15 +9293,17 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@3.1.2: + minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.15 minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 - minimist@1.2.7: {} + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 minimist@1.2.8: {} @@ -11369,11 +9381,11 @@ snapshots: mute-stream@1.0.0: {} - mute-stream@2.0.0: {} + mute-stream@3.0.0: {} nanoid@3.3.11: {} - napi-postinstall@0.3.3: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -11423,71 +9435,30 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-releases@2.0.19: {} - node-rsa@0.4.2: dependencies: asn1: 0.2.3 normalize-path@3.0.0: {} - normalize-url@8.0.2: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + normalize-url@8.1.1: {} - object.fromentries@2.0.8: + npm-run-path@5.3.0: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + path-key: 4.0.0 - object.groupby@1.0.3: + npm-run-path@6.0.0: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 + path-key: 4.0.0 + unicorn-magic: 0.3.0 - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + obug@2.1.1: {} on-exit-leak-free@2.1.2: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: + onetime@6.0.0: dependencies: - mimic-fn: 2.1.0 + mimic-fn: 4.0.0 optionator@0.9.4: dependencies: @@ -11498,49 +9469,75 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - own-keys@1.0.1: + oxfmt@0.53.0: dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-cancelable@3.0.0: {} + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.53.0 + '@oxfmt/binding-android-arm64': 0.53.0 + '@oxfmt/binding-darwin-arm64': 0.53.0 + '@oxfmt/binding-darwin-x64': 0.53.0 + '@oxfmt/binding-freebsd-x64': 0.53.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.53.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.53.0 + '@oxfmt/binding-linux-arm64-gnu': 0.53.0 + '@oxfmt/binding-linux-arm64-musl': 0.53.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.53.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.53.0 + '@oxfmt/binding-linux-riscv64-musl': 0.53.0 + '@oxfmt/binding-linux-s390x-gnu': 0.53.0 + '@oxfmt/binding-linux-x64-gnu': 0.53.0 + '@oxfmt/binding-linux-x64-musl': 0.53.0 + '@oxfmt/binding-openharmony-arm64': 0.53.0 + '@oxfmt/binding-win32-arm64-msvc': 0.53.0 + '@oxfmt/binding-win32-ia32-msvc': 0.53.0 + '@oxfmt/binding-win32-x64-msvc': 0.53.0 + + oxlint@1.68.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.68.0 + '@oxlint/binding-android-arm64': 1.68.0 + '@oxlint/binding-darwin-arm64': 1.68.0 + '@oxlint/binding-darwin-x64': 1.68.0 + '@oxlint/binding-freebsd-x64': 1.68.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.68.0 + '@oxlint/binding-linux-arm-musleabihf': 1.68.0 + '@oxlint/binding-linux-arm64-gnu': 1.68.0 + '@oxlint/binding-linux-arm64-musl': 1.68.0 + '@oxlint/binding-linux-ppc64-gnu': 1.68.0 + '@oxlint/binding-linux-riscv64-gnu': 1.68.0 + '@oxlint/binding-linux-riscv64-musl': 1.68.0 + '@oxlint/binding-linux-s390x-gnu': 1.68.0 + '@oxlint/binding-linux-x64-gnu': 1.68.0 + '@oxlint/binding-linux-x64-musl': 1.68.0 + '@oxlint/binding-openharmony-arm64': 1.68.0 + '@oxlint/binding-win32-arm64-msvc': 1.68.0 + '@oxlint/binding-win32-ia32-msvc': 1.68.0 + '@oxlint/binding-win32-x64-msvc': 1.68.0 + + p-cancelable@4.0.1: {} + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.1 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 + p-timeout@6.1.4: {} pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -11564,29 +9561,15 @@ snapshots: parenthesis@3.1.8: {} - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-passwd@1.0.0: {} + parse-ms@4.0.0: {} path-exists@4.0.0: {} - path-exists@5.0.0: {} - - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-parse@1.0.7: {} + path-key@4.0.0: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 + path-parse@1.0.7: {} path-scurry@2.0.0: dependencies: @@ -11597,15 +9580,13 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pend@1.2.0: {} picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pidusage@2.0.21: dependencies: @@ -11640,8 +9621,6 @@ snapshots: optionalDependencies: '@napi-rs/nice': 1.1.1 - pluralize@8.0.0: {} - pm2-axon-rpc@0.7.1: dependencies: debug: 4.4.1 @@ -11715,22 +9694,24 @@ snapshots: - supports-color - utf-8-validate - possible-typed-array-names@1.1.0: {} - postcss@8.4.31: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.6: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + prismarine-auth@2.7.0: dependencies: '@azure/msal-node': 2.16.2 @@ -11794,12 +9775,6 @@ snapshots: dependencies: read: 1.0.7 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - protodef-validator@1.4.0: dependencies: ajv: 6.12.6 @@ -11813,7 +9788,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -11845,34 +9820,32 @@ snapshots: react: 19.2.1 scheduler: 0.27.0 - react-is@16.13.1: {} - - react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.1): + react-remove-scroll-bar@2.3.8(@types/react@19.2.16)(react@19.2.1): dependencies: react: 19.2.1 - react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - react-remove-scroll@2.7.1(@types/react@19.2.7)(react@19.2.1): + react-remove-scroll@2.7.1(@types/react@19.2.16)(react@19.2.1): dependencies: react: 19.2.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.1) - react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.16)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.1) - use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.1) + use-callback-ref: 1.3.3(@types/react@19.2.16)(react@19.2.1) + use-sidecar: 1.1.3(@types/react@19.2.16)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.1): + react-style-singleton@2.2.3(@types/react@19.2.16)(react@19.2.1): dependencies: get-nonce: 1.0.1 react: 19.2.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 react@19.2.1: {} @@ -11880,12 +9853,6 @@ snapshots: dependencies: mute-stream: 0.0.8 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 @@ -11896,7 +9863,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 real-require@0.2.0: {} @@ -11908,34 +9875,6 @@ snapshots: reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp-tree@0.1.27: {} - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - require-directory@2.1.1: {} - require-from-string@2.0.2: {} require-in-the-middle@5.2.0: @@ -11950,38 +9889,18 @@ snapshots: resolve-alpn@1.2.1: {} - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - - resolve-pkg-maps@1.0.0: {} - resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - responselike@3.0.0: + responselike@4.0.2: dependencies: lowercase-keys: 3.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - ret@0.1.15: {} ret@0.5.0: {} @@ -11990,60 +9909,36 @@ snapshots: rfdc@1.4.1: {} - rollup@4.45.1: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 - fsevents: 2.3.3 - - rollup@4.49.0: + rollup@4.61.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.49.0 - '@rollup/rollup-android-arm64': 4.49.0 - '@rollup/rollup-darwin-arm64': 4.49.0 - '@rollup/rollup-darwin-x64': 4.49.0 - '@rollup/rollup-freebsd-arm64': 4.49.0 - '@rollup/rollup-freebsd-x64': 4.49.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.49.0 - '@rollup/rollup-linux-arm-musleabihf': 4.49.0 - '@rollup/rollup-linux-arm64-gnu': 4.49.0 - '@rollup/rollup-linux-arm64-musl': 4.49.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.49.0 - '@rollup/rollup-linux-ppc64-gnu': 4.49.0 - '@rollup/rollup-linux-riscv64-gnu': 4.49.0 - '@rollup/rollup-linux-riscv64-musl': 4.49.0 - '@rollup/rollup-linux-s390x-gnu': 4.49.0 - '@rollup/rollup-linux-x64-gnu': 4.49.0 - '@rollup/rollup-linux-x64-musl': 4.49.0 - '@rollup/rollup-win32-arm64-msvc': 4.49.0 - '@rollup/rollup-win32-ia32-msvc': 4.49.0 - '@rollup/rollup-win32-x64-msvc': 4.49.0 + '@rollup/rollup-android-arm-eabi': 4.61.0 + '@rollup/rollup-android-arm64': 4.61.0 + '@rollup/rollup-darwin-arm64': 4.61.0 + '@rollup/rollup-darwin-x64': 4.61.0 + '@rollup/rollup-freebsd-arm64': 4.61.0 + '@rollup/rollup-freebsd-x64': 4.61.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.0 + '@rollup/rollup-linux-arm-musleabihf': 4.61.0 + '@rollup/rollup-linux-arm64-gnu': 4.61.0 + '@rollup/rollup-linux-arm64-musl': 4.61.0 + '@rollup/rollup-linux-loong64-gnu': 4.61.0 + '@rollup/rollup-linux-loong64-musl': 4.61.0 + '@rollup/rollup-linux-ppc64-gnu': 4.61.0 + '@rollup/rollup-linux-ppc64-musl': 4.61.0 + '@rollup/rollup-linux-riscv64-gnu': 4.61.0 + '@rollup/rollup-linux-riscv64-musl': 4.61.0 + '@rollup/rollup-linux-s390x-gnu': 4.61.0 + '@rollup/rollup-linux-x64-gnu': 4.61.0 + '@rollup/rollup-linux-x64-musl': 4.61.0 + '@rollup/rollup-openbsd-x64': 4.61.0 + '@rollup/rollup-openharmony-arm64': 4.61.0 + '@rollup/rollup-win32-arm64-msvc': 4.61.0 + '@rollup/rollup-win32-ia32-msvc': 4.61.0 + '@rollup/rollup-win32-x64-gnu': 4.61.0 + '@rollup/rollup-win32-x64-msvc': 4.61.0 fsevents: 2.3.3 - optional: true - - run-async@2.4.1: {} run-async@3.0.0: {} @@ -12057,27 +9952,8 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - safe-regex2@5.0.0: dependencies: ret: 0.5.0 @@ -12100,9 +9976,7 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.2 - - semver@6.3.1: {} + semver: 7.8.1 semver@7.5.4: dependencies: @@ -12113,29 +9987,9 @@ snapshots: semver@7.7.3: optional: true - set-cookie-parser@2.7.1: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + semver@7.8.1: {} - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + set-cookie-parser@2.7.1: {} setprototypeof@1.2.0: {} @@ -12179,34 +10033,6 @@ snapshots: shimmer@1.2.1: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - sift@17.1.3: {} siginfo@2.0.0: {} @@ -12215,7 +10041,7 @@ snapshots: signal-exit@4.1.0: {} - sirv@3.0.1: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 @@ -12224,7 +10050,7 @@ snapshots: skia-canvas@3.0.8: dependencies: detect-libc: 2.1.2 - follow-redirects: 1.15.11(debug@4.4.1) + follow-redirects: 1.15.11 https-proxy-agent: 7.0.6 string-split-by: 1.0.0 transitivePeerDependencies: @@ -12238,7 +10064,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -12279,8 +10105,6 @@ snapshots: sprintf-js@1.1.2: {} - stable-hash@0.0.5: {} - stackback@0.0.2: {} stackblur-canvas@2.7.0: {} @@ -12289,19 +10113,16 @@ snapshots: statuses@2.0.1: {} - std-env@3.9.0: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 + std-env@4.1.0: {} - streamx@2.22.1: + streamx@2.26.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.1 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-split-by@1.0.0: dependencies: @@ -12319,56 +10140,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -12381,28 +10152,22 @@ snapshots: dependencies: ansi-regex: 6.2.0 - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - strip-dirs@3.0.0: dependencies: inspect-with-kind: 1.0.5 is-plain-obj: 1.1.0 - strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 + strip-final-newline@4.0.0: {} strip-json-comments@3.1.1: {} - strip-literal@3.0.0: + strtok3@10.3.4: dependencies: - js-tokens: 9.0.1 + '@tokenizer/token': 0.3.0 - strtok3@10.3.4: + strtok3@10.3.5: dependencies: '@tokenizer/token': 0.3.0 @@ -12411,9 +10176,11 @@ snapshots: client-only: 0.0.1 react: 19.2.1 - supports-color@5.5.0: + super-regex@1.1.0: dependencies: - has-flag: 3.0.0 + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 supports-color@7.2.0: dependencies: @@ -12425,32 +10192,31 @@ snapshots: dependencies: '@scarf/scarf': 1.4.0 + system-architecture@1.0.0: {} + systeminformation@5.27.8: optional: true - tailwind-merge@3.4.0: {} + tailwind-merge@3.6.0: {} - tailwindcss@4.1.17: {} + tailwindcss@4.3.0: {} - tapable@2.3.0: {} + tapable@2.3.3: {} tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.8.1 fast-fifo: 1.3.2 - streamx: 2.22.1 - - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 + streamx: 2.26.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - text-decoder@1.2.3: + text-decoder@1.2.7: dependencies: - b4a: 1.6.7 - - text-extensions@2.4.0: {} + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a thread-stream@3.1.0: dependencies: @@ -12458,24 +10224,24 @@ snapshots: through@2.3.8: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-discord@https://codeload.github.com/timotejroiko/tiny-discord/tar.gz/f6d020085ea88e33ebaf6ce323930deffe74fb0d: {} tinybench@2.9.0: {} - tinyexec@0.3.2: {} - - tinyexec@1.0.1: {} + tinyexec@1.2.4: {} - tinyglobby@0.2.14: + tinyglobby@0.2.17: dependencies: - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinypool@1.1.1: {} + tinypool@2.1.0: {} - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} + tinyrainbow@3.1.0: {} tmp@0.0.33: dependencies: @@ -12499,6 +10265,12 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + totalist@3.0.1: {} tr46@0.0.3: {} @@ -12507,47 +10279,22 @@ snapshots: dependencies: punycode: 2.3.1 - ts-api-utils@2.1.0(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - - tsconfig-paths@3.15.0: + ts-api-utils@2.1.0(typescript@6.0.3): dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 + typescript: 6.0.3 tslib@1.9.3: {} tslib@2.8.1: {} - turbo-darwin-64@2.5.6: - optional: true - - turbo-darwin-arm64@2.5.6: - optional: true - - turbo-linux-64@2.5.6: - optional: true - - turbo-linux-arm64@2.5.6: - optional: true - - turbo-windows-64@2.5.6: - optional: true - - turbo-windows-arm64@2.5.6: - optional: true - - turbo@2.5.6: + turbo@2.9.16: optionalDependencies: - turbo-darwin-64: 2.5.6 - turbo-darwin-arm64: 2.5.6 - turbo-linux-64: 2.5.6 - turbo-linux-arm64: 2.5.6 - turbo-windows-64: 2.5.6 - turbo-windows-arm64: 2.5.6 + '@turbo/darwin-64': 2.9.16 + '@turbo/darwin-arm64': 2.9.16 + '@turbo/linux-64': 2.9.16 + '@turbo/linux-arm64': 2.9.16 + '@turbo/windows-64': 2.9.16 + '@turbo/windows-arm64': 2.9.16 tv4@1.3.0: {} @@ -12564,53 +10311,11 @@ snapshots: type-fest@0.21.3: {} - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 + type-fest@4.41.0: {} typedi@0.10.0: {} - typescript-eslint@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): - dependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.6.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - typescript@5.9.2: {} + typescript@6.0.3: {} uglify-js@3.19.3: optional: true @@ -12621,13 +10326,6 @@ snapshots: uint8array-extras@1.5.0: {} - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 @@ -12635,71 +10333,36 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.10.0: {} + undici-types@7.24.6: {} - unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} universal-user-agent@7.0.3: {} - universalify@2.0.1: {} - - unplugin@2.3.8: + unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.3 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - - update-browserslist-db@1.1.3(browserslist@4.25.3): - dependencies: - browserslist: 4.25.3 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.1): + use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.1): dependencies: react: 19.2.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.16 - use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.1): + use-sidecar@1.1.3(@types/react@19.2.16)(react@19.2.1): dependencies: detect-node-es: 1.1.0 react: 19.2.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.7 - - util-deprecate@1.0.2: {} + '@types/react': 19.2.16 uuid-1345@1.0.2: dependencies: @@ -12709,82 +10372,48 @@ snapshots: validator@13.15.15: {} - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2): + vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0): dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2): - dependencies: - esbuild: 0.25.6 - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.45.1 - tinyglobby: 0.2.14 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.0 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 25.9.1 fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - - vitest@3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2)) - '@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.1 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.17 + jiti: 2.7.0 + lightningcss: 1.32.0 + + vitest@4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)): + dependencies: + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.0.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.2) + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 7.0.4(@types/node@25.9.1)(jiti@2.7.0)(lightningcss@1.32.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.0 - '@vitest/ui': 3.2.4(vitest@3.2.4) + '@types/node': 25.9.1 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@vitest/ui': 4.1.8(vitest@4.1.8) transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml vizion@2.2.1: dependencies: @@ -12793,9 +10422,7 @@ snapshots: ini: 1.3.8 js-git: 0.7.8 - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 + web-worker@1.5.0: {} webidl-conversions@3.0.1: {} @@ -12813,51 +10440,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -12889,29 +10471,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - ws@7.5.10: {} - y18n@5.0.8: {} - yallist@4.0.0: {} - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yauzl@3.2.0: + yauzl@3.3.2: dependencies: - buffer-crc32: 0.2.13 pend: 1.2.0 yggdrasil@1.7.0: @@ -12923,8 +10488,8 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} - yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.2: {} + zod@4.1.5: {} diff --git a/tsconfig.base.json b/tsconfig.base.json index 13e625fde..b8bec6417 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -11,16 +11,12 @@ "skipDefaultLibCheck": true, "skipLibCheck": true, "resolveJsonModule": true, - "downlevelIteration": true, "strictPropertyInitialization": false, "allowSyntheticDefaultImports": true, + "noImplicitReturns": true, "target": "esnext", "strict": true, - "types": [ - "vitest/importMeta" - ] + "types": ["vitest/importMeta"] }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file + "exclude": ["node_modules"] +} diff --git a/turbo.json b/turbo.json index bfbe61580..cf52f50df 100644 --- a/turbo.json +++ b/turbo.json @@ -1,54 +1,36 @@ { - "$schema": "https://turborepo.org/schema.json", - "globalDependencies": [ - "pnpm.lock", - "tsconfig.json", - ".swcrc", - "eslint.config.js" - ], - "ui": "tui", - "tasks": { - "build": { - "env": [ - "API_URL", - "API_KEY" - ], - "outputs": [ - "dist/**", - ".next/**", - "pkg/**" - ], - "dependsOn": [ - "^build" - ] - }, - "test:types": { - "outputs": [], - "dependsOn": [ - "^test:types" - ] - }, - "test": { - "outputs": [], - "dependsOn": [ - "build", - "^test" - ] - }, - "test:coverage": { - "outputs": [ - "coverage" - ], - "dependsOn": [ - "build", - "^test:coverage" - ] - }, - "lint": { - "outputs": [], - "dependsOn": [ - "^lint" - ] - } - } -} \ No newline at end of file + "$schema": "https://turborepo.org/schema.json", + "globalDependencies": ["pnpm.lock", "tsconfig.json", ".swcrc"], + "ui": "tui", + "tasks": { + "build": { + "env": ["API_URL", "API_KEY"], + "outputs": ["dist/**", ".next/**", "pkg/**"], + "dependsOn": ["^build"] + }, + "typecheck": { + "outputs": [], + "dependsOn": ["^typecheck"] + }, + "test": { + "outputs": [], + "dependsOn": ["build", "^test"] + }, + "test:coverage": { + "outputs": ["coverage"], + "dependsOn": ["build", "^test:coverage"] + }, + "lint": { + "outputs": [], + "dependsOn": [] + }, + "lint:ci": { + "outputs": [], + "dependsOn": [] + }, + "fmt": { + "outputs": [], + "dependsOn": [] + } + } +} diff --git a/vite.swc.ts b/vite.swc.ts index 41157741a..c1742417a 100644 --- a/vite.swc.ts +++ b/vite.swc.ts @@ -25,6 +25,8 @@ const resolveFile = (resolved: string, index = false) => { const file = index ? join(resolved, `index${ext}`) : `${resolved}${ext}`; if (existsSync(file)) return file; } + + return undefined; }; export const resolveId = async (importee: string, importer?: string) => { @@ -42,6 +44,8 @@ export const resolveId = async (importee: string, importer?: string) => { return resolved; } + + return undefined; }; export const swc = createUnplugin(({ minify, ...options }: SwcOptions = {}) => { diff --git a/apps/support-bot/eslint.config.js b/vitest.config.ts similarity index 57% rename from apps/support-bot/eslint.config.js rename to vitest.config.ts index 3325f85ed..3347734fb 100644 --- a/apps/support-bot/eslint.config.js +++ b/vitest.config.ts @@ -6,6 +6,10 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { defineConfig } from "../../eslint.config.js"; +import { defineConfig } from "vitest/config"; -export default defineConfig({ tsconfigDirName: import.meta.dirname }); +export default defineConfig({ + test: { + projects: ["./apps/*/vitest.config.ts", "./packages/*/vitest.config.ts"], + }, +}); diff --git a/vitest.workspace.ts b/vitest.workspace.ts deleted file mode 100644 index 68050b02c..000000000 --- a/vitest.workspace.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { defineWorkspace } from "vitest/config"; - -export default defineWorkspace([ - "./apps/*/vitest.config.ts", - "./packages/*/vitest.config.ts", -]); From 9fa9449196f8dc1b268fe186e7be182b5f8cde26 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:44:09 -0400 Subject: [PATCH 05/29] chore(deps): update actions/cache digest to 27d5ce7 (#821) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5fd3cfa11..6f3f72de7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: - name: Turbo cache id: turbo-cache - uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: .turbo key: turbo-${{ github.job }}-${{ github.ref_name }}-${{ github.sha }} From 388bd6ca9dfb4dc78c679fd541b17e823c39fc67 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:44:26 -0400 Subject: [PATCH 06/29] chore(deps): update actions/checkout digest to de0fac2 (#823) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6f3f72de7..cc8b9a9fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Setup pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cce68dd2b..5f1c46b50 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: environment: production steps: - name: Checkout repository - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: token: ${{ secrets.REPO_PAT }} submodules: recursive From 5cc14dc19e311348a4d09c886c2c2dc667357c8c Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Tue, 2 Jun 2026 20:01:29 -0400 Subject: [PATCH 07/29] chore(lint): enable stricter no unused variable rules (#873) * chore(lint): enable stricter no unused variable rules * chore: update ci * chore: update ci * chore: update ci * chore: remove explicit cache dir for turborepo in package json --- .github/workflows/ci.yml | 4 ++++ .oxlintrc.jsonc | 4 ++++ apps/api/src/index.ts | 3 +-- apps/discord-bot/src/commands/arcade/modes/dropper.tsx | 6 +++--- .../src/commands/challenges/challenges.profile.tsx | 5 +++-- .../discord-bot/src/commands/quests/quests.profile.tsx | 2 +- apps/discord-bot/src/index.ts | 3 +-- apps/site/app/players/[slug]/general/bingo/bingo.tsx | 4 ++-- package.json | 10 +++++----- packages/util/src/config.ts | 3 +-- 10 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc8b9a9fc..c1a664b6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,10 +16,14 @@ jobs: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_SCM_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || 'origin/main' }} TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + filter: blob:none - name: Setup pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc index 99b35f251..dfbc9d08c 100644 --- a/.oxlintrc.jsonc +++ b/.oxlintrc.jsonc @@ -85,6 +85,10 @@ "no-prototype-builtins": "error", "no-useless-return": "error", "no-warning-comments": "warn", + "no-unused-vars": [ + "error", + { "fix": { "imports": "safe-fix", "variables": "safe-fix" } }, + ], "eqeqeq": "error", "class-methods-use-this": "warn", "symbol-description": "error", diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index bce208af1..648d33c1a 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -18,8 +18,7 @@ import { SentryInterceptor } from "./sentry/index.js"; import { Severity, setGlobalOptions } from "@typegoose/typegoose"; import { ValidationPipe } from "@nestjs/common"; import { config } from "@statsify/util"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join } from "node:path"; import { mkdir } from "node:fs/promises"; const directory = import.meta.dirname; diff --git a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx index 0ef43ddd5..4e06ca84b 100644 --- a/apps/discord-bot/src/commands/arcade/modes/dropper.tsx +++ b/apps/discord-bot/src/commands/arcade/modes/dropper.tsx @@ -54,9 +54,9 @@ const DROPPER_MAPS = scanMetadata(DropperMaps) ] as [keyof DropperMaps, string]) .sort(([a], [b]) => a.localeCompare(b)); -const HARD_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([_, name]) => name.startsWith("ยงc")), 4); -const MEDIUM_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([_, name]) => name.startsWith("ยงe")), 4); -const EASY_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([_, name]) => name.startsWith("ยงa")), 4); +const HARD_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([, name]) => name.startsWith("ยงc")), 4); +const MEDIUM_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([, name]) => name.startsWith("ยงe")), 4); +const EASY_DROPPER_MAP_GROUPS = arrayGroup(DROPPER_MAPS.filter(([, name]) => name.startsWith("ยงa")), 4); interface DropperMapsTableProps { dropper: Dropper; diff --git a/apps/discord-bot/src/commands/challenges/challenges.profile.tsx b/apps/discord-bot/src/commands/challenges/challenges.profile.tsx index 711c10286..656a906f1 100644 --- a/apps/discord-bot/src/commands/challenges/challenges.profile.tsx +++ b/apps/discord-bot/src/commands/challenges/challenges.profile.tsx @@ -56,7 +56,8 @@ interface NormalTableProps { } const NormalTable = ({ challenges, t, gameIcons }: NormalTableProps) => { - const { total: _, ...challengesByGame } = challenges; + const { total, ...challengesByGame } = challenges; + void total; const entries: [GameId, any][] = Object.entries(challengesByGame) .sort((a, b) => (b[1]?.total ?? 0) - (a[1]?.total ?? 0)) @@ -106,7 +107,7 @@ const GameTable = ({ gameChallenges, mode, t }: GameTableProps) => { .filter(([k]) => k !== "total") .sort((a, b) => b[1] - a[1]) .map(([challenge, completions]) => { - const [_, field] = metadata.find(([k]) => k === challenge)!; + const [, field] = metadata.find(([k]) => k === challenge)!; const realName = field.leaderboard?.name ?? prettify(challenge); return [realName, t(completions)]; diff --git a/apps/discord-bot/src/commands/quests/quests.profile.tsx b/apps/discord-bot/src/commands/quests/quests.profile.tsx index 961f59484..bd41d8a3c 100644 --- a/apps/discord-bot/src/commands/quests/quests.profile.tsx +++ b/apps/discord-bot/src/commands/quests/quests.profile.tsx @@ -91,7 +91,7 @@ const NormalTable = ({ quests, t, gameIcons, colorPalette, time }: NormalTablePr const entries: GameEntry[] = questEntries // Require more than just a total field - .filter(([_, q]) => Object.keys(q).length > 1) + .filter(([, q]) => Object.keys(q).length > 1) .map(([k, v]) => [k, v, Object.keys(v).length - 1] as const) .sort((a, b) => ratio(b[1]?.total ?? 0, b[2]) - ratio(a[1]?.total ?? 0, a[2])) .map(([k, v, total]) => { diff --git a/apps/discord-bot/src/index.ts b/apps/discord-bot/src/index.ts index 49f54df9f..7bfbafbb6 100644 --- a/apps/discord-bot/src/index.ts +++ b/apps/discord-bot/src/index.ts @@ -15,8 +15,7 @@ import { InteractionServer, RestClient, WebsocketShard } from "tiny-discord"; import { Logger } from "@statsify/logger"; import { VerifyCommand } from "#commands/verify.command"; import { config } from "@statsify/util"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { join } from "node:path"; const directory = import.meta.dirname; diff --git a/apps/site/app/players/[slug]/general/bingo/bingo.tsx b/apps/site/app/players/[slug]/general/bingo/bingo.tsx index f8dc9bc9c..f9f663b99 100644 --- a/apps/site/app/players/[slug]/general/bingo/bingo.tsx +++ b/apps/site/app/players/[slug]/general/bingo/bingo.tsx @@ -84,8 +84,8 @@ function completetionColor(completion: number) { function CategoryOverview({ category, icon }: { category: Category; icon: StaticImport }) { const player = usePlayer(); - const [_, setCategory] = useUrlState("category", CategorySchema, "casual"); - const [__, setDifficulty] = useUrlState("difficulty", DifficultySchema, "easy"); + const [, setCategory] = useUrlState("category", CategorySchema, "casual"); + const [, setDifficulty] = useUrlState("difficulty", DifficultySchema, "easy"); const easyBingo = player.stats.general.bingo.easy[category]; const hardBingo = player.stats.general.bingo.hard[category]; diff --git a/package.json b/package.json index 2184e656b..11b347740 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,15 @@ "url": "git+https://github.com/Statsify/statsify.git" }, "scripts": { - "build": "turbo run build --filter=!site --cache-dir='.turbo'", + "build": "turbo run build --filter=!site", "build:watch": "turbo watch build --filter=!site", - "typecheck": "turbo run typecheck --cache-dir='.turbo'", + "typecheck": "turbo run typecheck", "test": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", - "lint": "turbo run lint --cache-dir='.turbo'", - "lint:ci": "turbo run lint:ci --cache-dir='.turbo'", - "fmt": "turbo run fmt --cache-dir='.turbo'", + "lint": "turbo run lint", + "lint:ci": "turbo run lint:ci", + "fmt": "turbo run fmt", "api": "pnpm --filter api", "discord-bot": "pnpm --filter discord-bot", "support-bot": "pnpm --filter support-bot", diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index c2bf731f8..dd5a4b284 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -6,9 +6,8 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { dirname, join } from "node:path"; +import { join } from "node:path"; import { existsSync } from "node:fs"; -import { fileURLToPath } from "node:url"; import type { DeepFlatten } from "./flatten.js"; const directory = import.meta.dirname; From 95d3b94fb4dcb776dbb03da60b7d4e72bd230a9d Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Tue, 2 Jun 2026 20:51:06 -0400 Subject: [PATCH 08/29] fix: use file urls for dynamic imports (#874) * fix: use file urls for dynamic imports * chore: update ci tests --- .github/workflows/ci.yml | 4 ++-- packages/discord/src/command/command.loader.ts | 12 +++++++----- packages/discord/src/event/event.loader.ts | 9 +++++---- packages/util/src/config.ts | 13 ++++++++----- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1a664b6b..1fdcad16a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - TURBO_SCM_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || 'origin/main' }} + TURBO_SCM_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository @@ -58,4 +58,4 @@ jobs: run: pnpm build --affected - name: Test - run: pnpm test:coverage + run: pnpm test:coverage --changed=$TURBO_SCM_BASE diff --git a/packages/discord/src/command/command.loader.ts b/packages/discord/src/command/command.loader.ts index 3648a9c56..ab06a5671 100644 --- a/packages/discord/src/command/command.loader.ts +++ b/packages/discord/src/command/command.loader.ts @@ -10,13 +10,15 @@ import { Container } from "typedi"; import { Logger } from "@statsify/logger"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; +import { join } from "node:path"; import type { CommandResolvable } from "./command.resolvable.js"; import { scanCommands } from "./command.builder.js"; +import { pathToFileURL } from "node:url"; const logger = new Logger("CommandLoader"); export async function loadCommands(dir: string) { - const files = await getCommandFiles(dir); + const files = await getCommandFileUrls(dir); const commands = await Promise.all(files.map(importCommand)); return new Map( @@ -54,19 +56,19 @@ async function importCommand(file: string) { }); } -async function getCommandFiles(dir: string): Promise { +async function getCommandFileUrls(dir: string): Promise { const toLoad: string[] = []; const files = await readdir(dir); await Promise.all( files.map(async (file) => { - const path = `${dir}/${file}`; + const path = join(dir, file); if (statSync(path).isDirectory()) { - toLoad.push(...(await getCommandFiles(path))); + toLoad.push(...(await getCommandFileUrls(path))); } else if (file.endsWith(".command.js")) { - toLoad.push(path); + toLoad.push(pathToFileURL(path).href); } }), ); diff --git a/packages/discord/src/event/event.loader.ts b/packages/discord/src/event/event.loader.ts index 40f752559..d765d3b86 100644 --- a/packages/discord/src/event/event.loader.ts +++ b/packages/discord/src/event/event.loader.ts @@ -13,11 +13,12 @@ import { Logger } from "@statsify/logger"; import { WebsocketShard } from "tiny-discord"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; +import { pathToFileURL } from "node:url"; const logger = new Logger("EventLoader"); export async function loadEvents(websocket: WebsocketShard, dir: string) { - const files = await getEventFiles(dir); + const files = await getEventFileUrls(dir); const events = await Promise.all(files.map(importEvent)); const eventsMap = new Map>(events.flat().map((event) => [event.event, event])); @@ -48,7 +49,7 @@ async function importEvent( .filter(Boolean) as AbstractEventListener[]; } -async function getEventFiles(dir: string): Promise { +async function getEventFileUrls(dir: string): Promise { const toLoad: string[] = []; const files = await readdir(dir); @@ -58,9 +59,9 @@ async function getEventFiles(dir: string): Promise { const path = `${dir}/${file}`; if (statSync(path).isDirectory()) { - toLoad.push(...(await getEventFiles(path))); + toLoad.push(...(await getEventFileUrls(path))); } else if (file.endsWith(".event.js")) { - toLoad.push(path); + toLoad.push(pathToFileURL(file).href); } }), ); diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index dd5a4b284..b3c71297e 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -9,6 +9,7 @@ import { join } from "node:path"; import { existsSync } from "node:fs"; import type { DeepFlatten } from "./flatten.js"; +import { pathToFileURL } from "node:url"; const directory = import.meta.dirname; @@ -280,13 +281,15 @@ async function loadConfig(): Promise<{ default: Config }> { }; } - if (existsSync(join(directory, "../../../config.json"))) { - return import(join(directory, "../../../config.json")); - } else if (existsSync(join(directory, "../../../config.js"))) { - return import(join(directory, "../../../config.js")); + for (const file of ["config.json", "config.js"]) { + const path = join(directory, "../../../", file); + + if (existsSync(path)) { + return import(pathToFileURL(path).href); + } } - throw new Error("No config file detected!"); + throw new Error("No config file detected!"); } let cfg: Config; From 7e07ac32559d1da87b4bc5d2245f8f0370abac13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:00:12 -0400 Subject: [PATCH 09/29] chore(config): migrate renovate config (#872) * chore(config): migrate config renovate.json * chore: let all dependencies be updatable --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: jacobk999 --- renovate.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/renovate.json b/renovate.json index 078379310..2ce0da8c1 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,10 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "helpers:pinGitHubActionDigests", "group:allNonMajor"], + "extends": [ + "config:recommended", + "helpers:pinGitHubActionDigests", + "group:allNonMajor" + ], "labels": ["dependencies"], "schedule": ["before 12pm on Sunday"], "npm": { @@ -12,10 +16,6 @@ "automerge": true, "commitMessagePrefix": "chore(deps):" }, - { - "matchPackagePatterns": ["chalk", "@swc/cli", "@swc/core", "@swc/jest"], - "enabled": false - }, { "matchDepTypes": ["engines"], "enabled": false From 110fd104d87dd816035b1c0fe10e58a29488e1aa Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 2 Jun 2026 19:08:15 -0600 Subject: [PATCH 10/29] chore: add .DS_Store to .gitignore (#833) * chore: add .DS_Store to gitignore * chore: ci run build on all packages * chore: ci run build on all packages --------- Co-authored-by: jacobk999 --- .github/workflows/ci.yml | 2 +- .gitignore | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fdcad16a..e78a738b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: run: pnpm typecheck --affected - name: Build - run: pnpm build --affected + run: pnpm build - name: Test run: pnpm test:coverage --changed=$TURBO_SCM_BASE diff --git a/.gitignore b/.gitignore index 589536b4e..d9bad3af3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ out *.tar.gz *.7z *.rar +.DS_Store +**/.DS_Store .swc .next . From 45f6caead62e076a659c074230d14b97dadbe627 Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 5 Jun 2026 17:25:43 -0600 Subject: [PATCH 11/29] feat(copsandcrims): add shots fired stats (#829) Co-authored-by: jacobk999 --- .../src/commands/copsandcrims/copsandcrims.profile.tsx | 1 + packages/schemas/src/player/gamemodes/copsandcrims/mode.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/apps/discord-bot/src/commands/copsandcrims/copsandcrims.profile.tsx b/apps/discord-bot/src/commands/copsandcrims/copsandcrims.profile.tsx index c49932ceb..2dc1e0cf7 100644 --- a/apps/discord-bot/src/commands/copsandcrims/copsandcrims.profile.tsx +++ b/apps/discord-bot/src/commands/copsandcrims/copsandcrims.profile.tsx @@ -34,6 +34,7 @@ export const CopsAndCrimsProfile = ({ [t("stats.knifeKills"), t(copsandcrims.overall.knifeKills), "ยง7"], [t("stats.headshotKills"), t(copsandcrims.overall.headshotKills), "ยง4"], [t("stats.grenadeKills"), t(copsandcrims.overall.grenadeKills), "ยง2"], + [t("stats.shotsFired"), t(copsandcrims.overall.shotsFired), "ยง6"], ]; let table: JSX.Element; diff --git a/packages/schemas/src/player/gamemodes/copsandcrims/mode.ts b/packages/schemas/src/player/gamemodes/copsandcrims/mode.ts index fc577349d..e6b0adc88 100644 --- a/packages/schemas/src/player/gamemodes/copsandcrims/mode.ts +++ b/packages/schemas/src/player/gamemodes/copsandcrims/mode.ts @@ -126,6 +126,9 @@ export class CopsAndCrimsOverall { @Field() public grenadeKills: number; + @Field() + public shotsFired: number; + public constructor(data: APIData, defusal: Defusal, deathmatch: Deathmatch, gunGame: GunGame) { this.wins = add(defusal.wins, deathmatch.wins, gunGame.wins); this.kills = add(defusal.kills, deathmatch.kills, gunGame.kills); @@ -135,5 +138,6 @@ export class CopsAndCrimsOverall { this.knifeKills = data.knife_kills; this.headshotKills = data.headshot_kills; this.grenadeKills = data.grenade_kills; + this.shotsFired = data.shots_fired; } } From 4021c0f4c766f7da1683963109e37ea105abd0a3 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 6 Jun 2026 08:33:31 -0600 Subject: [PATCH 12/29] refactor(discord-bot): load duels command mode icons once (#847) Co-authored-by: jacobk999 --- .../src/commands/duels/duels.command.tsx | 44 ++++++++++++++----- .../leaderboards/base.leaderboard-command.tsx | 4 +- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/apps/discord-bot/src/commands/duels/duels.command.tsx b/apps/discord-bot/src/commands/duels/duels.command.tsx index c18183e31..3a18cdaa2 100644 --- a/apps/discord-bot/src/commands/duels/duels.command.tsx +++ b/apps/discord-bot/src/commands/duels/duels.command.tsx @@ -6,7 +6,12 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { ApiModeFromGameModes, DUELS_MODES, DuelsModes, GameModeWithSubModes } from "@statsify/schemas"; +import { + ApiModeFromGameModes, + DUELS_MODES, + DuelsModes, + GameModeWithSubModes, +} from "@statsify/schemas"; import { BaseHypixelCommand, BaseProfileProps, @@ -26,19 +31,36 @@ interface PreProfileData { modeIcons: DuelsModeIcons; } +let modeIcons: DuelsModeIcons | undefined; + +const getModeIcons = async (): Promise => { + if (modeIcons) return modeIcons; + + const paths = await readdir(getAssetPath("duels")); + const modIconEntries = await Promise.all( + paths.map(async (mode) => [ + mode.replace(".png", ""), + await loadImage(getAssetPath(`duels/${mode}`)), + ]), + ); + + const icons = Object.fromEntries(modIconEntries); + modeIcons = icons; + + return icons; +}; + @Command({ description: (t) => t("commands.duels") }) -export class DuelsCommand extends BaseHypixelCommand { +export class DuelsCommand extends BaseHypixelCommand< + DuelsModes, + PreProfileData +> { public constructor() { super(DUELS_MODES); } public async getPreProfileData(): Promise { - const modeIconPaths = await readdir(getAssetPath("duels")); - const modeIcons = await Promise.all( - modeIconPaths.map(async (mode) => [mode.replace(".png", ""), await loadImage(getAssetPath(`duels/${mode}`))]) - ); - - return { modeIcons: Object.fromEntries(modeIcons) }; + return { modeIcons: await getModeIcons() }; } public getModeEmojis(modes: GameModeWithSubModes[]): ModeEmoji[] { @@ -47,12 +69,14 @@ export class DuelsCommand extends BaseHypixelCommand public getProfile( base: BaseProfileProps, - { mode, data }: ProfileData + { mode, data }: ProfileData, ): JSX.Element { return ; } } -export function getDuelsModeEmojis(modes: GameModeWithSubModes[]): ModeEmoji[] { +export function getDuelsModeEmojis( + modes: GameModeWithSubModes[], +): ModeEmoji[] { return modes.map((m) => (t) => t(`emojis:duels.${m.api}`)); } diff --git a/apps/discord-bot/src/commands/leaderboards/base.leaderboard-command.tsx b/apps/discord-bot/src/commands/leaderboards/base.leaderboard-command.tsx index 7c32580d2..a2d2e1868 100644 --- a/apps/discord-bot/src/commands/leaderboards/base.leaderboard-command.tsx +++ b/apps/discord-bot/src/commands/leaderboards/base.leaderboard-command.tsx @@ -241,7 +241,7 @@ export class BaseLeaderboardCommand { cache.clear(); }, 300_000); - currentPage = page || currentPage; + currentPage = page ?? currentPage; return { ...message, components: [row] }; } @@ -271,7 +271,7 @@ export class BaseLeaderboardCommand { getLeaderboardDataIcon ); - if (params.type === LeaderboardQuery.PAGE && page) cache.set(page, message); + if (params.type === LeaderboardQuery.PAGE && page !== null) cache.set(page, message); return [message, page]; } From bfb1dc3b0671d28508fe4820a3f68ea393c018a0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 22:37:13 -0400 Subject: [PATCH 13/29] chore(deps): update actions/labeler digest to f27b608 (#880) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/pr_labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_labeler.yml b/.github/workflows/pr_labeler.yml index 8e97054fe..55106a62c 100644 --- a/.github/workflows/pr_labeler.yml +++ b/.github/workflows/pr_labeler.yml @@ -9,7 +9,7 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6 + - uses: actions/labeler@f27b608878404679385c85cfa523b85ccb86e213 # v6 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: .github/pr_labeler.yml \ No newline at end of file From 81723f283280b455ec8cdf627f075498aec2342f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 22:37:31 -0400 Subject: [PATCH 14/29] chore(deps): update pnpm/action-setup digest to b906aff (#881) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e78a738b6..0eb2b8782 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: filter: blob:none - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 + uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 - name: Install node.js v24 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 From cb6922ccf24e9d79ae6a73cc237f4748c85415d1 Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:37:28 -0400 Subject: [PATCH 15/29] feat: add bedwars dreamfest levelling and challenges (#887) --- .../bedwars/bedwars-challenges.command.tsx | 30 - .../bedwars/bedwars-challenges.profile.tsx | 48 +- .../src/commands/bedwars/bedwars.command.tsx | 7 +- .../src/commands/bedwars/bedwars.profile.tsx | 44 +- .../deprecated/bedwars-challenges.command.tsx | 27 + .../commands/historical/session.command.tsx | 8 +- assets/private | 2 +- .../src/player/gamemodes/bedwars/index.ts | 95 ++- .../src/player/gamemodes/bedwars/mode.ts | 108 ++- .../src/player/gamemodes/bedwars/util.ts | 641 +++++++++++------- 10 files changed, 660 insertions(+), 350 deletions(-) delete mode 100644 apps/discord-bot/src/commands/bedwars/bedwars-challenges.command.tsx create mode 100644 apps/discord-bot/src/commands/deprecated/bedwars-challenges.command.tsx diff --git a/apps/discord-bot/src/commands/bedwars/bedwars-challenges.command.tsx b/apps/discord-bot/src/commands/bedwars/bedwars-challenges.command.tsx deleted file mode 100644 index b7323b175..000000000 --- a/apps/discord-bot/src/commands/bedwars/bedwars-challenges.command.tsx +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Statsify - * - * This source code is licensed under the GNU GPL v3 license found in the - * LICENSE file in the root directory of this source tree. - * https://github.com/Statsify/statsify/blob/main/LICENSE - */ - -import { BEDWARS_MODES, BedWarsModes, GameModeWithSubModes, Player } from "@statsify/schemas"; -import { BaseHypixelCommand, BaseProfileProps } from "#commands/base.hypixel-command"; -import { BedWarsChallengesProfile } from "./bedwars-challenges.profile.js"; -import { Command } from "@statsify/discord"; - -@Command({ description: (t) => t("commands.bedwars-challenges") }) -export class BedWarsChallengesCommand extends BaseHypixelCommand { - public constructor() { - super(BEDWARS_MODES); - } - - public filterModes( - player: Player, - modes: GameModeWithSubModes[] - ): GameModeWithSubModes[] { - return [modes[0]]; - } - - public getProfile(base: BaseProfileProps): JSX.Element { - return ; - } -} diff --git a/apps/discord-bot/src/commands/bedwars/bedwars-challenges.profile.tsx b/apps/discord-bot/src/commands/bedwars/bedwars-challenges.profile.tsx index 3a40ac3bd..1dd33ba05 100644 --- a/apps/discord-bot/src/commands/bedwars/bedwars-challenges.profile.tsx +++ b/apps/discord-bot/src/commands/bedwars/bedwars-challenges.profile.tsx @@ -7,10 +7,24 @@ */ import { Container, Footer, Header, SidebarItem, Table } from "#components"; -import { FormattedGame } from "@statsify/schemas"; +import { + BedWarsModeChallenges, + type FieldMetadata, + FormattedGame, + getLeaderboardFields, +} from "@statsify/schemas"; import { arrayGroup, prettify } from "@statsify/util"; import type { BaseProfileProps } from "#commands/base.hypixel-command"; +const challengeFields = getLeaderboardFields(BedWarsModeChallenges).filter( + ([field]) => field !== "totalChallenges" && field !== "uniqueChallenges", +) as [ + Exclude, + FieldMetadata, +][]; + +const rows = arrayGroup(challengeFields, 3); + export const BedWarsChallengesProfile = ({ skin, player, @@ -28,11 +42,6 @@ export const BedWarsChallengesProfile = ({ ["Unique Completions", t(challenges.uniqueChallenges as number), "ยงe"], ]; - delete challenges.uniqueChallenges; - delete challenges.totalChallenges; - - const rows = arrayGroup(Object.entries(challenges), 3); - return (
{rows.map((row) => ( - {row.map(([name, completions]) => ( - - ยงl{completions > 0 ? "ยงa" : "ยงc"}{prettify(name).replace("Ultimate U H C", "Ultimate UHC")} -
- {completions > 0 ? "ยงa" : "ยงc"}{t(completions)} - - ))} + {row.map(([field, metadata]) => { + const completions = challenges[field]; + + return ( + + + ยงl{completions > 0 ? "ยงa" : "ยงc"} + {metadata.leaderboard.fieldName ?? prettify(field)} + +
+ + {completions > 0 ? "ยงa" : "ยงc"} + {t(completions)} + + + ); + })} ))} diff --git a/apps/discord-bot/src/commands/bedwars/bedwars.command.tsx b/apps/discord-bot/src/commands/bedwars/bedwars.command.tsx index e404439ae..b1801a5e7 100644 --- a/apps/discord-bot/src/commands/bedwars/bedwars.command.tsx +++ b/apps/discord-bot/src/commands/bedwars/bedwars.command.tsx @@ -14,6 +14,7 @@ import { } from "#commands/base.hypixel-command"; import { BedWarsProfile } from "./bedwars.profile.js"; import { Command } from "@statsify/discord"; +import { BedWarsChallengesProfile } from "./bedwars-challenges.profile.js"; @Command({ description: (t) => t("commands.bedwars") }) export class BedWarsCommand extends BaseHypixelCommand { @@ -23,8 +24,12 @@ export class BedWarsCommand extends BaseHypixelCommand { public getProfile( base: BaseProfileProps, - { mode }: ProfileData + { mode }: ProfileData, ): JSX.Element { + if (mode.api === "challenges") { + return ; + } + return ; } } diff --git a/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx b/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx index 452699499..123e7feb6 100644 --- a/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx +++ b/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx @@ -19,7 +19,7 @@ import { import type { BaseProfileProps } from "#commands/base.hypixel-command"; export interface BedWarsProfileProps extends BaseProfileProps { - mode: GameMode; + mode: Exclude, { api: "challenges" }>; } export const BedWarsProfile = ({ @@ -44,12 +44,18 @@ export const BedWarsProfile = ({ [t("stats.emeralds"), t(stats.itemsCollected.emerald), "ยง2"], ]; - if (bedwars.slumber.wallet) sidebar.push( - [t("stats.slumberTickets"), `${t(bedwars.slumber.tickets)}ยง7/${t(bedwars.slumber.wallet)}`, "ยงb"], - [t("stats.totalSlumberTickets"), t(bedwars.slumber.totalTickets), "ยงd"] - ); + if (bedwars.slumber.wallet) + sidebar.push( + [ + t("stats.slumberTickets"), + `${t(bedwars.slumber.tickets)}ยง7/${t(bedwars.slumber.wallet)}`, + "ยงb", + ], + [t("stats.totalSlumberTickets"), t(bedwars.slumber.totalTickets), "ยงd"], + ); - if (time === "LIVE" && stats.winstreak) sidebar.push([t("stats.winstreak"), t(stats.winstreak), "ยงa"]); + if (time === "LIVE" && stats.winstreak) + sidebar.push([t("stats.winstreak"), t(stats.winstreak), "ยงa"]); return ( @@ -65,7 +71,7 @@ export const BedWarsProfile = ({ t, label: t("stats.progression.exp"), progression: bedwars.progression, - currentLevel: bedwars.levelFormatted, + currentLevel: bedwars.nextLevelFormatted, nextLevel: bedwars.nextLevelFormatted, })}`} time={time} @@ -73,7 +79,11 @@ export const BedWarsProfile = ({ - + @@ -90,8 +100,16 @@ export const BedWarsProfile = ({ - - + + @@ -100,7 +118,11 @@ export const BedWarsProfile = ({ value={t(stats.bedsBroken)} color="ยงa" /> - + + t("deprecated.command-description", { newCommandName: "/bedwars" }), +}) +export class BedWarsChallengesCommand { + public run(): IMessage { + return { + content: (t) => + t("deprecated.merged-dropdown", { + oldCommandName: "`/bedwarschallenges`", + newCommand: "", + newCommandName: `${t("emojis:games.BEDWARS")} **BedWars**`, + mode: "**Challenges**", + }), + }; + } +} diff --git a/apps/discord-bot/src/commands/historical/session.command.tsx b/apps/discord-bot/src/commands/historical/session.command.tsx index 9d69cbd76..50d20c67b 100644 --- a/apps/discord-bot/src/commands/historical/session.command.tsx +++ b/apps/discord-bot/src/commands/historical/session.command.tsx @@ -10,14 +10,15 @@ import { ARCADE_MODES, ARENA_BRAWL_MODES, type ApiModeFromGameModes, - ApiSubModeForMode, + type ApiSubModeForMode, BEDWARS_MODES, BLITZSG_MODES, BUILD_BATTLE_MODES, + type BedWarsModes, COPS_AND_CRIMS_MODES, DUELS_MODES, GENERAL_MODES, - GameMode, + type GameMode, type GameModeWithSubModes, GameModes, MEGAWALLS_MODES, @@ -124,7 +125,8 @@ export class SessionCommand { return this.run({ context, modes: BEDWARS_MODES, - getProfile: (base, mode) => , + getProfile: (base, mode) => , { api:"challenges" }>} />, + filterModes: (_, modes) => modes.filter((mode) => mode.api !== "challenges") }); } diff --git a/assets/private b/assets/private index 38a97e46e..7bd3861f9 160000 --- a/assets/private +++ b/assets/private @@ -1 +1 @@ -Subproject commit 38a97e46ee32b939b0f617bfd66a8833c7c6e619 +Subproject commit 7bd3861f93050e270dff5666aac33dd4081aa22f diff --git a/packages/schemas/src/player/gamemodes/bedwars/index.ts b/packages/schemas/src/player/gamemodes/bedwars/index.ts index f501a998a..cde467c3a 100644 --- a/packages/schemas/src/player/gamemodes/bedwars/index.ts +++ b/packages/schemas/src/player/gamemodes/bedwars/index.ts @@ -6,14 +6,28 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { BedWarsMode, ChallengesBedWars, DreamsBedWarsMode } from "./mode.js"; +import { + BedWarsMode, + BedWarsModeChallenges, + DreamsBedWarsMode, +} from "./mode.js"; import { type ExtractGameModes, GameModes } from "#game"; import { Field } from "#metadata"; import { Progression } from "#progression"; import { Slumber } from "./slumber.js"; import { deepSub } from "@statsify/math"; -import { getExpReq, getFormattedLevel, getLevel } from "./util.js"; -import type { APIData } from "@statsify/util"; +import { + BRACKET_MAP, + getExpReq, + getIntendedFormattedLevel, + getLevel, + getPrestigeCosmetic, + PRESTIGE_SCHEMES, + PRESTIGE_STARS, + SCHEME_MAP, + STAR_MAP, +} from "./util.js"; +import { findScore, type APIData } from "@statsify/util"; export const BEDWARS_MODES = new GameModes([ { api: "overall" }, @@ -32,6 +46,7 @@ export const BEDWARS_MODES = new GameModes([ { api: "underworld" }, { api: "voidless" }, { api: "oneBlock", hypixel: "BEDWARS_EIGHT_ONE_ONEBLOCK" }, + { api: "challenges" }, { hypixel: "BEDWARS_EIGHT_TWO_ARMED", formatted: "Armed Doubles" }, { hypixel: "BEDWARS_FOUR_FOUR_ARMED", formatted: "Armed Fours" }, @@ -56,11 +71,21 @@ export class BedWars { @Field({ historical: { enabled: false } }) public tokens: number; + @Field() + public selectedScheme: string; + + @Field() + public selectedStar: string; + + @Field() + public selectedBrackets: string; + @Field({ leaderboard: { fieldName: "Level", hidden: true, - formatter: (exp: number) => getFormattedLevel(Math.floor(getLevel(exp))), + formatter: (exp: number) => + getIntendedFormattedLevel(Math.floor(getLevel(exp))), additionalFields: [ "this.overall.wins", "this.overall.finalKills", @@ -82,13 +107,16 @@ export class BedWars { }) public level: number; - @Field() + @Field({ store: { default: getIntendedFormattedLevel(0) } }) public levelFormatted: string; @Field() public progression: Progression; - @Field() + @Field({ store: { default: getIntendedFormattedLevel(0) } }) + public naturalLevelFormatted: string; + + @Field({ store: { default: getIntendedFormattedLevel(1) } }) public nextLevelFormatted: string; @Field() @@ -140,7 +168,7 @@ export class BedWars { public oneBlock: BedWarsMode; @Field() - public challenges: ChallengesBedWars; + public challenges: BedWarsModeChallenges; @Field({ leaderboard: { fieldName: "" } }) public slumber: Slumber; @@ -148,10 +176,57 @@ export class BedWars { public constructor(data: APIData = {}) { this.tokens = data.coins; + this.selectedScheme = data.active_prestige_scheme; + this.selectedStar = data.active_star; + this.selectedBrackets = data.active_prestige_bracket; + this.exp = data.Experience || 0; this.level = getLevel(this.exp); - this.levelFormatted = getFormattedLevel(Math.floor(this.level)); - this.nextLevelFormatted = getFormattedLevel(Math.floor(this.level) + 1); + + const flooredLevel = Math.floor(this.level); + + const scheme = getPrestigeCosmetic({ + packages: data.packages, + favorites: data.favorites, + cosmetic: this.selectedScheme, + getDefault: () => findScore(PRESTIGE_SCHEMES, flooredLevel).scheme, + map: SCHEME_MAP, + prefix: "prestige_scheme", + }); + + const star = getPrestigeCosmetic({ + packages: data.packages, + favorites: data.favorites, + cosmetic: this.selectedStar, + getDefault: () => findScore(PRESTIGE_STARS, flooredLevel).star, + map: STAR_MAP, + prefix: "star", + }); + + const brackets = getPrestigeCosmetic({ + packages: data.packages, + favorites: data.favorites, + cosmetic: this.selectedBrackets, + getDefault: () => "none", + map: BRACKET_MAP, + prefix: "prestige_bracket", + }); + + this.levelFormatted = scheme({ + level: Math.floor(this.level), + star, + brackets, + bold: false, + underline: false, + strikethrough: false, + }); + + this.naturalLevelFormatted = getIntendedFormattedLevel( + Math.floor(this.level), + ); + this.nextLevelFormatted = getIntendedFormattedLevel( + Math.floor(this.level) + 1, + ); let exp = this.exp; @@ -184,7 +259,7 @@ export class BedWars { this.core.winstreak = this.overall.winstreak; - this.challenges = new ChallengesBedWars(data); + this.challenges = new BedWarsModeChallenges(data); this.slumber = new Slumber(data.slumber); } } diff --git a/packages/schemas/src/player/gamemodes/bedwars/mode.ts b/packages/schemas/src/player/gamemodes/bedwars/mode.ts index f7268394c..67a6fde56 100644 --- a/packages/schemas/src/player/gamemodes/bedwars/mode.ts +++ b/packages/schemas/src/player/gamemodes/bedwars/mode.ts @@ -108,7 +108,7 @@ export class DreamsBedWarsMode extends BedWarsMode { public static new(data: APIData, mode: string) { const stats = deepAdd( new BedWarsMode(data, `eight_two_${mode}`), - new BedWarsMode(data, `four_four_${mode}`) + new BedWarsMode(data, `four_four_${mode}`), ); BedWarsMode.applyRatios(stats); @@ -117,7 +117,7 @@ export class DreamsBedWarsMode extends BedWarsMode { } } -export class ChallengesBedWars { +export class BedWarsModeChallenges { @Field({ leaderboard: { enabled: false } }) public uniqueChallenges?: number; @@ -163,7 +163,7 @@ export class ChallengesBedWars { @Field() public miningFatigue: number; - @Field() + @Field({ leaderboard: { fieldName: "Ultimate UHC" } }) public ultimateUHC: number; @Field() @@ -211,42 +211,82 @@ export class ChallengesBedWars { @Field() public protectThePresident: number; - @Field() + @Field({ leaderboard: { fieldName: "Can't Touch This" } }) public cantTouchThis: number; + @Field() + public woolWarrior: number; + + @Field() + public anchor: number; + + @Field() + public noDreaming: number; + + @Field() + public quickMaths: number; + + @Field() + public blockrepellentBeds: number; + + @Field() + public midnight: number; + + @Field({ leaderboard: { fieldName: "Beds & Bloodlust" } }) + public bedsAndBloodlust: number; + + @Field({ leaderboard: { fieldName: "Beg & Barter" } }) + public begAndBarter: number; + + @Field({ leaderboard: { fieldName: "Halved & Doubled" } }) + public halvedAndDoubled: number; + public constructor(data: APIData) { this.uniqueChallenges = data.bw_unique_challenges_completed; this.totalChallenges = data.total_challenges_completed; - this.renegade = data.bw_challenge_no_team_upgrades; // Renegade, #1 - this.warmonger = data.bw_challenge_no_utilities; // Warmonger, #2 - this.selfish = data.bw_challenge_selfish; // Selfish, #3 - this.minimumWage = data.bw_challenge_slow_generator; // Minimum Wage, #4 - this.assassin = data.bw_challenge_assassin; // Assassin, #5 - this.regularShopper = data.bw_challenge_reset_armor; // Regular Shopper, #6 - this.invisibleShop = data.bw_challenge_invisible_shop; // Invisible Shop, #7 - this.collector = data.bw_challenge_collector; // Collector, #8 - this.woodworker = data.bw_challenge_woodworker; // Woodworker, #9 - this.bridgingForDummies = data.bw_challenge_sponge; // Bridging for Dummies, #10 - this.toxicRain = data.bw_challenge_toxic_rain; // Toxic Rain, #11 - this.defuser = data.bw_challenge_defuser; // Defuser, #12 - this.miningFatigue = data.bw_challenge_mining_fatigue; // Mining Fatigue, #13 - this.ultimateUHC = data.bw_challenge_no_healing; // Ultimate UHC, #14 - this.sleightOfHand = data.bw_challenge_hotbar; // Sleight of Hand, #15 - this.weightedItems = data.bw_challenge_weighted_items; // Weighted Items, #16 - this.socialDistancing = data.bw_challenge_knockback_stick_only; // Social Distancing, #17 - this.swordless = data.bw_challenge_no_swords; // Swordless, #18 - this.marksman = data.bw_challenge_archer_only; // Marksman, #19 - this.patriot = data.bw_challenge_patriot; // Patriot, #20 - this.stamina = data.bw_challenge_stamina; // Stamina, #21 - this.oldMan = data.bw_challenge_no_sprint; // Old man, #22 - this.cappedResources = data.bw_challenge_capped_resources; // Capped resources, #23 - this.redLightGreenLight = data.bw_challenge_stop_light; // Red Light, Green Light, #24 - this.slowReflexes = data.bw_challenge_delayed_hitting; // Slow Reflexes, #25 - this.pacifist = data.bw_challenge_no_hitting; // Pacifist, #26 - this.masterAssassin = data.bw_challenge_master_assassin; // Master Assassin, #27 - this.standingTall = data.bw_challenge_no_shift; // Standing Tall, #28 - this.protectThePresident = data.bw_challenge_protect_the_president; // Protect the President, #29 - this.cantTouchThis = data.bw_challenge_cant_touch_this; // Can't touch this, #30 + this.renegade = data.bw_challenge_no_team_upgrades; + this.warmonger = data.bw_challenge_no_utilities; + this.selfish = data.bw_challenge_selfish; + this.minimumWage = data.bw_challenge_slow_generator; + this.assassin = data.bw_challenge_assassin; + this.regularShopper = data.bw_challenge_reset_armor; + this.invisibleShop = data.bw_challenge_invisible_shop; + this.collector = data.bw_challenge_collector; + this.woodworker = data.bw_challenge_woodworker; + this.bridgingForDummies = data.bw_challenge_sponge; + this.toxicRain = data.bw_challenge_toxic_rain; + this.defuser = data.bw_challenge_defuser; + this.miningFatigue = data.bw_challenge_mining_fatigue; + this.ultimateUHC = data.bw_challenge_no_healing; + this.sleightOfHand = data.bw_challenge_hotbar; + this.weightedItems = data.bw_challenge_weighted_items; + this.socialDistancing = data.bw_challenge_knockback_stick_only; + this.swordless = data.bw_challenge_no_swords; + this.marksman = data.bw_challenge_archer_only; + this.patriot = data.bw_challenge_patriot; + this.stamina = data.bw_challenge_stamina; + this.oldMan = data.bw_challenge_no_sprint; + this.cappedResources = data.bw_challenge_capped_resources; + this.redLightGreenLight = data.bw_challenge_stop_light; + this.slowReflexes = data.bw_challenge_delayed_hitting; + this.pacifist = data.bw_challenge_no_hitting; + this.masterAssassin = data.bw_challenge_master_assassin; + this.standingTall = data.bw_challenge_no_shift; + this.protectThePresident = data.bw_challenge_protect_the_president; + this.cantTouchThis = data.bw_challenge_cant_touch_this; + + // Challenges from Dreamfest update + this.woolWarrior = data.bw_challenge_wool_warrior; + this.anchor = data.bw_challenge_anchor; + this.noDreaming = data.bw_challenge_no_dreaming; + this.quickMaths = data.bw_challenge_quick_maths; + this.blockrepellentBeds = data.bw_challenge_block_repellent_beds; + + // TODO(jacobk999): these fields are unconfirmed + this.midnight = data.bw_challenge_midnight; + this.bedsAndBloodlust = data.bw_challenge_beds_and_bloodlust; + this.begAndBarter = data.bw_challenge_beg_and_barter; + this.halvedAndDoubled = data.bw_challenge_halved_and_doubled; } } diff --git a/packages/schemas/src/player/gamemodes/bedwars/util.ts b/packages/schemas/src/player/gamemodes/bedwars/util.ts index f96e42e41..2c220b9c4 100644 --- a/packages/schemas/src/player/gamemodes/bedwars/util.ts +++ b/packages/schemas/src/player/gamemodes/bedwars/util.ts @@ -37,253 +37,400 @@ export const getLevel = (exp = 0): number => { return level + remainingExp / getExpReq(level + 1); }; -const PRESTIGE_COLORS: { req: number; fn: (n: number) => string }[] = [ - { req: 0, fn: (n) => `ยง7[${n}โœซ]` }, - { req: 100, fn: (n) => `ยงf[${n}โœซ]` }, - { req: 200, fn: (n) => `ยง6[${n}โœซ]` }, - { req: 300, fn: (n) => `ยงb[${n}โœซ]` }, - { req: 400, fn: (n) => `ยง2[${n}โœซ]` }, - { req: 500, fn: (n) => `ยง3[${n}โœซ]` }, - { req: 600, fn: (n) => `ยง4[${n}โœซ]` }, - { req: 700, fn: (n) => `ยงd[${n}โœซ]` }, - { req: 800, fn: (n) => `ยง9[${n}โœซ]` }, - { req: 900, fn: (n) => `ยง5[${n}โœซ]` }, - { - req: 1000, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงc[ยง6${nums[0]}ยงe${nums[1]}ยงa${nums[2]}ยงb${nums[3]}ยงdโœซยง5]`; - }, - }, - { req: 1100, fn: (n) => `ยง7[ยงf${n}ยง7โœช]` }, - { req: 1200, fn: (n) => `ยง7[ยงe${n}ยง6โœชยง7]` }, - { req: 1300, fn: (n) => `ยง7[ยงb${n}ยง3โœชยง7]` }, - { req: 1400, fn: (n) => `ยง7[ยงa${n}ยง2โœชยง7]` }, - { req: 1500, fn: (n) => `ยง7[ยง3${n}ยง9โœชยง7]` }, - { req: 1600, fn: (n) => `ยง7[ยงc${n}ยง4โœชยง7]` }, - { req: 1700, fn: (n) => `ยง7[ยงd${n}ยง5โœชยง7]` }, - { req: 1800, fn: (n) => `ยง7[ยง9${n}ยง1โœชยง7]` }, - { req: 1900, fn: (n) => `ยง7[ยง5${n}ยง8โœชยง7]` }, - { - req: 2000, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง8[ยง7${nums[0]}ยงf${nums[1]}${nums[2]}ยง7${nums[3]}โœชยง8]`; - }, - }, - { - req: 2100, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงf[${nums[0]}ยงe${nums[1]}${nums[2]}ยง6${nums[3]}ยงlโšยงrยง6]`; - }, - }, - { - req: 2200, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง6[${nums[0]}ยงf${nums[1]}${nums[2]}ยงb${nums[3]}ยง3ยงlโšยงrยง3]`; - }, - }, - { - req: 2300, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง5[${nums[0]}ยงd${nums[1]}${nums[2]}ยง6${nums[3]}ยงeยงlโšยงrยงe]`; - }, - }, - { - req: 2400, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงb[${nums[0]}ยงf${nums[1]}${nums[2]}ยง7${nums[3]}ยงlโšยงrยง8]`; - }, - }, - { - req: 2500, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงf[${nums[0]}ยงa${nums[1]}${nums[2]}ยง2${nums[3]}ยงlโšยงrยง2]`; - }, - }, - { - req: 2600, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง4[${nums[0]}ยงc${nums[1]}${nums[2]}ยงd${nums[3]}ยงlโšยงrยงd]`; - }, - }, - { - req: 2700, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงe[${nums[0]}ยงf${nums[1]}${nums[2]}ยง8${nums[3]}ยงlโšยงrยง8]`; - }, - }, - { - req: 2800, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงa[${nums[0]}ยง2${nums[1]}${nums[2]}ยง6${nums[3]}ยงlโšยงrยงe]`; - }, - }, - { - req: 2900, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงb[${nums[0]}ยง3${nums[1]}${nums[2]}ยง9${nums[3]}ยงlโšยงrยง1]`; - }, - }, - { - req: 3000, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงe[${nums[0]}ยง6${nums[1]}${nums[2]}ยงc${nums[3]}ยงlโšยงrยง4]`; - }, - }, - { - req: 3100, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง9[${nums[0]}ยง3${nums[1]}${nums[2]}ยง6${nums[3]}ยงlโœฅยงrยงe]`; - }, - }, - { - req: 3200, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงc[ยง4${nums[0]}ยง7${nums[1]}${nums[2]}ยง4${nums[3]}ยงcยงlโœฅยงrยงc]`; - }, - }, - { - req: 3300, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง9[${nums[0]}${nums[1]}ยงd${nums[2]}ยงc${nums[3]}ยงlโœฅยงrยง4]`; - }, - }, - { - req: 3400, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง2[ยงa${nums[0]}ยงd${nums[1]}${nums[2]}ยง5${nums[3]}ยงlโœฅยงrยง2]`; - }, - }, - { - req: 3500, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงc[${nums[0]}ยง4${nums[1]}${nums[2]}ยง2${nums[3]}ยงaยงlโœฅยงrยงa]`; - }, - }, - { - req: 3600, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงa[${nums[0]}${nums[1]}ยงb${nums[2]}ยง9${nums[3]}ยงlโœฅยงrยง1]`; - }, - }, - { - req: 3700, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง4[${nums[0]}ยงc${nums[1]}${nums[2]}ยงb${nums[3]}ยง3ยงlโœฅยงrยง3]`; - }, - }, - { - req: 3800, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง1[${nums[0]}ยง9${nums[1]}ยง5${nums[2]}${nums[3]}ยงdยงlโœฅยงrยง1]`; - }, - }, - { - req: 3900, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงc[${nums[0]}ยงa${nums[1]}${nums[2]}ยง3${nums[3]}ยง9ยงlโœฅยงrยง9]`; - }, - }, - { - req: 4000, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง5[${nums[0]}ยงc${nums[1]}${nums[2]}ยง6${nums[3]}ยงlโœฅยงrยงe]`; - }, - }, - { - req: 4100, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงe[${nums[0]}ยง6${nums[1]}ยงc${nums[2]}ยงd${nums[3]}ยงlโœฅยงrยง5]`; - }, - }, - { - req: 4200, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง1[ยง9${nums[0]}ยง3${nums[1]}ยงb${nums[2]}ยงf${nums[3]}ยง7ยงlโœฅยงrยง7]`; - }, - }, - { - req: 4300, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง0[ยง5${nums[0]}ยง8${nums[1]}${nums[2]}ยง5${nums[3]}ยงlโœฅยงrยง0]`; - }, - }, - { - req: 4400, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง2[${nums[0]}ยงa${nums[1]}ยงe${nums[2]}ยง6${nums[3]}ยง5ยงlโœฅยงrยงd]`; - }, - }, - { - req: 4500, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงf[${nums[0]}ยงb${nums[1]}${nums[2]}ยง2${nums[3]}ยงlโœฅยงrยง2]`; - }, - }, - { - req: 4600, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง2[ยงb${nums[0]}ยงe${nums[1]}${nums[2]}ยง6${nums[3]}ยงdยงlโœฅยงrยง5]`; - }, - }, - { - req: 4700, - fn: (n) => { - const nums = [...n.toString()]; - return `ยงf[ยง4${nums[0]}ยงc${nums[1]}${nums[2]}ยง9${nums[3]}ยง1ยงlโœฅยงrยง9]`; - }, - }, - { - req: 4800, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง5[${nums[0]}ยงc${nums[1]}ยง6${nums[2]}ยงe${nums[3]}ยงbยงlโœฅยงrยง3]`; - }, - }, - { - req: 4900, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง2[ยงa${nums[0]}ยงf${nums[1]}${nums[2]}ยงa${nums[3]}ยงlโœฅยงrยง2]`; - }, - }, - { - req: 5000, - fn: (n) => { - const nums = [...n.toString()]; - return `ยง4[${nums[0]}ยง5${nums[1]}ยง9${nums[2]}${nums[3]}ยง1ยงlโœฅยงrยง0]`; - }, - }, +type Brackets = [left: string, right: string]; + +type SchemeOptions = { + level: number; + star: string; + brackets: Brackets; + bold: boolean; + underline: boolean; + strikethrough: boolean; +}; + +type Scheme = (options: SchemeOptions) => string; + +/** + * Formats color schemes when at most the bracket, digit, and emblem color differ + */ +function createUniformScheme( + bracketColor: string, + digitColor = bracketColor, + starColor = digitColor, +): Scheme { + return ({ level, bold, underline, strikethrough, star }) => { + const boldFormat = bold ? "ยงl" : ""; + const underlineFormat = underline ? "ยงn" : ""; + const strikethroughFormat = strikethrough ? "ยงm" : ""; + + return `${bracketColor}${underlineFormat}${strikethroughFormat}[ยงr${boldFormat}${digitColor}${underlineFormat}${level}${starColor}${underlineFormat}${star}ยงr${bracketColor}${underlineFormat}${strikethroughFormat}]ยงr`; + }; +} + +/** + * Creates a list of level "parts" which contain groups characters in a formatted level + * Handles adding bold, underline and strikethrough formatting to the level + */ +function createLevelParts({ + level, + bold, + underline, + strikethrough, + star, + brackets, +}: SchemeOptions) { + const boldFormat = bold ? "ยงl" : ""; + const underlineFormat = underline ? "ยงn" : ""; + const strikethroughFormat = strikethrough ? "ยงm" : ""; + + return [ + `${underlineFormat}${strikethroughFormat}${brackets[0]}ยงr${boldFormat}${underlineFormat}`, + ...`${level}`, + `${star}ยงr`, + `${underlineFormat}${strikethroughFormat}${brackets[1]}ยงr`, + ]; +} + +function createCycleScheme(...colors: string[]): Scheme { + return (options) => + createLevelParts(options) + .map((part, index) => `${colors[index % colors.length]}${part}`) + .join(""); +} + +function createPrefixScheme(prefix: string[], remainingColor: string): Scheme { + return (options) => + createLevelParts(options) + .map((part, index) => { + if (index >= prefix.length) { + return `${remainingColor}${part}`; + } + + return `${prefix[index]}${part}`; + }) + .join(""); +} + +function createSuffixScheme(remainingColor: string, suffix: string[]): Scheme { + return (options) => + createLevelParts(options) + .map((part, index, parts) => { + const relativeIndex = parts.length - index; + + if (relativeIndex >= suffix.length) { + return `${remainingColor}${part}`; + } + + return `${suffix[relativeIndex]}${part}`; + }) + .join(""); +} + +export const SCHEME_MAP = { + none: createUniformScheme("ยง7"), + iron: createUniformScheme("ยงf"), + gold: createUniformScheme("ยง6"), + diamond: createUniformScheme("ยงb"), + emerald: createUniformScheme("ยง2"), + sapphire: createUniformScheme("ยง3"), + ruby: createUniformScheme("ยง4"), + crystal: createUniformScheme("ยงd"), + opal: createUniformScheme("ยง9"), + amethyst: createUniformScheme("ยง5"), + rainbow: createCycleScheme("ยงc", "ยง6", "ยงe", "ยงa", "ยงb", "ยงd", "ยง5"), + iron_prime: createUniformScheme("ยง7", "ยงf", "ยง7"), + gold_prime: createUniformScheme("ยง7", "ยงe", "ยง6"), + diamond_prime: createUniformScheme("ยง7", "ยงb", "ยง3"), + emerald_prime: createUniformScheme("ยง7", "ยงa", "ยง2"), + sapphire_prime: createUniformScheme("ยง7", "ยง3", "ยง9"), + ruby_prime: createUniformScheme("ยง7", "ยงc", "ยง4"), + crystal_prime: createUniformScheme("ยง7", "ยงd", "ยง5"), + opal_prime: createUniformScheme("ยง7", "ยง9", "ยง1"), + amethyst_prime: createUniformScheme("ยง7", "ยง5", "ยง8"), + mirror: createCycleScheme("ยง8", "ยง7", "ยงf", "ยงf", "ยง7", "ยง7"), + light: createCycleScheme("ยง7", "ยง7", "ยงe", "ยงe", "ยง6", "ยง6", "ยง6"), + dawn: createCycleScheme("ยง6", "ยง6", "ยงf", "ยงf", "ยงb", "ยง3", "ยง3"), + dusk: createCycleScheme("ยง5", "ยง5", "ยงd", "ยงd", "ยง6", "ยงe", "ยงe"), + air: createCycleScheme("ยงb", "ยงb", "ยงf", "ยงf", "ยง7", "ยง7", "ยง8", "ยง8"), + wind: createCycleScheme("ยง7", "ยง7", "ยงa", "ยงa", "ยง2", "ยง2", "ยง2", "ยง2"), + nebula: createCycleScheme("ยง4", "ยง4", "ยงc", "ยงc", "ยงd", "ยงd", "ยง5", "ยง5"), + thunder: createCycleScheme("ยงe", "ยงe", "ยงf", "ยงf", "ยง8", "ยง8", "ยง8"), + earth: createCycleScheme("ยงa", "ยงa", "ยง2", "ยง2", "ยง6", "ยง6", "ยงe", "ยงe"), + water: createCycleScheme("ยงb", "ยงb", "ยง3", "ยง3", "ยง9", "ยง9", "ยง1", "ยง1"), + fire: createCycleScheme("ยงe", "ยงe", "ยง6", "ยง6", "ยงc", "ยงc", "ยง4", "ยง4"), + sunrise: createCycleScheme("ยง9", "ยง9", "ยง3", "ยง3", "ยง6", "ยง6", "ยงe"), + eclipse: createCycleScheme("ยงc", "ยง4", "ยง7", "ยง7", "ยง4", "ยงc", "ยงc"), + gamma: createCycleScheme("ยง9", "ยง9", "ยง9", "ยงd", "ยงc", "ยงc", "ยง4"), + majestic: createCycleScheme("ยง2", "ยงa", "ยงd", "ยงd", "ยง5", "ยง5"), + andesine: createCycleScheme("ยงc", "ยงc", "ยง4", "ยง4", "ยง2", "ยงa", "ยงa"), + marine: createCycleScheme("ยงa", "ยงa", "ยงa", "ยงb", "ยง9", "ยง9", "ยง1"), + element: createCycleScheme("ยง4", "ยง4", "ยงc", "ยงc", "ยงb", "ยง3", "ยง3"), + galaxy: createCycleScheme("ยง1", "ยง1", "ยง9", "ยง5", "ยง5", "ยงd", "ยง1"), + atomic: createCycleScheme("ยงc", "ยงc", "ยงa", "ยงa", "ยง3", "ยง9", "ยง9"), + sunset: createCycleScheme("ยง5", "ยง5", "ยงc", "ยงc", "ยง6", "ยง6", "ยงe"), + time: createCycleScheme("ยงe", "ยงe", "ยง6", "ยงc", "ยงd", "ยงd", "ยง5"), + winter: createCycleScheme("ยง1", "ยง9", "ยง3", "ยงb", "ยงf", "ยง7", "ยง7"), + obsidian: createCycleScheme("ยง0", "ยง5", "ยง8", "ยง8", "ยง5", "ยง5"), + spring: createCycleScheme("ยง2", "ยง2", "ยงa", "ยงe", "ยง6", "ยง5", "ยงd"), + ice: createCycleScheme("ยงf", "ยงf", "ยงb", "ยงb", "ยง3", "ยง3", "ยง3"), + summer: createCycleScheme("ยง3", "ยงb", "ยงe", "ยง6", "ยง6", "ยงd", "ยง5"), + spinel: createCycleScheme("ยงf", "ยง4", "ยงc", "ยงc", "ยง9", "ยง1", "ยง9"), + autumn: createCycleScheme("ยง5", "ยง5", "ยงc", "ยง6", "ยง6", "ยงb", "ยง3"), + mystic: createCycleScheme("ยง2", "ยงa", "ยงf", "ยงf", "ยงf", "ยงa"), + eternal: createCycleScheme("ยง4", "ยง4", "ยง5", "ยง9", "ยง9", "ยง1", "ยง0"), + burnout: createCycleScheme("ยง4", "ยงc", "ยงc", "ยง6", "ยงe", "ยงf", "ยง4"), + cooldown: createCycleScheme("ยง1", "ยง9", "ยง3", "ยงb", "ยงf", "ยงe", "ยง1"), + obliteration: createCycleScheme("ยง5", "ยงd", "ยงe", "ยงf", "ยงe", "ยงd"), + ender: createCycleScheme("ยง3", "ยงa", "ยง2", "ยง8", "ยง2", "ยงa", "ยง3"), + brust: createCycleScheme("ยง2", "ยงa", "ยงe", "ยงf", "ยงb", "ยงd", "ยง5"), + comical: createCycleScheme("ยง4", "ยงc", "ยงe", "ยงf", "ยงe", "ยงc"), + lusterlost: createCycleScheme("ยง4", "ยง6", "ยง2", "ยง3", "ยง9", "ยง5", "ยง8"), + maelstrom: createCycleScheme("ยง5", "ยงc", "ยง6", "ยงf", "ยงb", "ยง3", "ยง9"), + time_undone: createCycleScheme("ยง7", "ยง0", "ยง8", "ยง7", "ยงf", "ยงf"), + umbrella: createCycleScheme("ยงc", "ยงf", "ยงf", "ยงf", "ยงf"), + luminous: createCycleScheme("ยง6", "ยงe", "ยงf", "ยงf", "ยงf", "ยงb", "ยง3"), + tortilla: createCycleScheme("ยงe", "ยงf", "ยงe", "ยง6", "ยง6", "ยงf", "ยงe"), + corn: createUniformScheme("ยงa", "ยงe", "ยงa"), + bittersweet: createCycleScheme("ยงb", "ยงb", "ยงc", "ยงc", "ยงc", "ยงa", "ยงa"), + sweetsour: createCycleScheme("ยง3", "ยง3", "ยงa", "ยงa", "ยงf", "ยงa", "ยง3"), + pop: createUniformScheme("ยง9", "ยงd", "ยงb"), + bubblegum: createUniformScheme("ยง5", "ยงd", "ยงf"), + contrast: createCycleScheme("ยง0", "ยง6", "ยง6", "ยงe", "ยงe", "ยงf", "ยงf"), + blended: createCycleScheme("ยงa", "ยงa", "ยงa", "ยงa", "ยง2", "ยง2", "ยง8"), + allay: createUniformScheme("ยง3", "ยงb", "ยงf"), + blaze: createCycleScheme("ยง4", "ยงc", "ยง6", "ยงe", "ยงc", "ยง6", "ยงe", "ยง4"), + creeper: createCycleScheme("ยง2", "ยงa", "ยงf", "ยง2", "ยงa", "ยงf", "ยง8"), + drowned: createCycleScheme("ยง2", "ยง3", "ยง3", "ยงb", "ยงb", "ยงa", "ยง2"), + enderman: createUniformScheme("ยง8", "ยง8", "ยงd"), + frog: createCycleScheme("ยง6", "ยง6", "ยง2", "ยง2", "ยงf", "ยงf", "ยงf"), + ghast: createCycleScheme("ยงf", "ยงf", "ยงf", "ยง7", "ยง7", "ยงc", "ยง8"), + hoglin: createUniformScheme("ยงd", "ยงc", "ยง6"), + iron_golem: createCycleScheme("ยง8", "ยง7", "ยงf", "ยงf", "ยงf", "ยงe", "ยง8"), + jerry: createCycleScheme("ยง6", "ยงf", "ยง2", "ยง6", "ยง2", "ยงf"), + kringle: createCycleScheme("ยง2", "ยงa", "ยงa", "ยงa", "ยงc", "ยง4", "ยง2"), + liquid: createCycleScheme("ยง8", "ยง7", "ยงf", "ยงb", "ยง3", "ยง9", "ยง1"), + mint: createUniformScheme("ยงf", "ยงf", "ยงa"), + neglected: createCycleScheme("ยง8", "ยง8", "ยง4", "ยง4", "ยงc", "ยงc", "ยง8"), + onion: createCycleScheme("ยงf", "ยงd", "ยงd", "ยงd", "ยงa", "ยงa", "ยงf"), + poser: createUniformScheme("ยง3", "ยง6", "ยงe"), + quartz: createUniformScheme("ยงd", "ยงf", "ยงe"), + rich: createUniformScheme("ยง8", "ยง6"), + sanguine: createCycleScheme("ยง4", "ยง4", "ยง4", "ยงc", "ยงc", "ยงf", "ยงf"), + titanic: createCycleScheme("ยง9", "ยงb", "ยงb", "ยงb", "ยง3", "ยง3", "ยง9"), + unorthodox: createSuffixScheme("ยงd", ["ยง5", "ยง8"]), + volcanic: createCycleScheme("ยง0", "ยงc", "ยง6", "ยง6", "ยงc", "ยงc", "ยง4"), + weeping_cherry: createUniformScheme("ยง2", "ยงd", "ยงa"), + x_ray: createUniformScheme("ยงf", "ยง8", "ยงf"), + yearn: createPrefixScheme(["ยงe", "ยง6", "ยง4"], "ยง8"), + zebra: createCycleScheme("ยง0", "ยง0", "ยง8", "ยง8", "ยง7", "ยง7", "ยงf", "ยงf"), + caution: createCycleScheme("ยงe", "ยงe", "ยงe", "ยง0", "ยง0", "ยงe", "ยง0"), + indescribable: createCycleScheme("ยงd", "ยงd", "ยงd", "ยงe", "ยงe", "ยงb", "ยงe"), + forgotten: createUniformScheme("ยง0", "ยง8"), + fuse: createCycleScheme("ยง8", "ยง7", "ยงf", "ยงf", "ยงf", "ยงe", "ยงf"), + prestigious: createCycleScheme("ยง9", "ยงb", "ยงf", "ยงf", "ยงf", "ยงc", "ยง4"), +} satisfies Record; + +export const STAR_MAP = { + black_open: "โœซ", + white_circled: "โœช", + white_outlined: "โš", + four_clubs: "โœฅ", + black_outlined: "โœญ", + four_pointed: "โœฆ", + pinwheel: "โœต", + hollow: "โœฐ", + nautical: "โœฏ", +} satisfies Record; + +export const BRACKET_MAP = { + none: ["[", "]"], + curly_brace: ["{", "}"], + parenthesis: ["(", ")"], + angled: ["<", ">"], + double_angle_quotation_mark: ["ยซ", "ยป"], +} satisfies Record; + +export const PRESTIGE_SCHEMES: { + req: number; + scheme: keyof typeof SCHEME_MAP; +}[] = [ + { req: 0, scheme: "none" }, + { req: 100, scheme: "iron" }, + { req: 200, scheme: "gold" }, + { req: 300, scheme: "diamond" }, + { req: 400, scheme: "emerald" }, + { req: 500, scheme: "sapphire" }, + { req: 600, scheme: "ruby" }, + { req: 700, scheme: "crystal" }, + { req: 800, scheme: "opal" }, + { req: 900, scheme: "amethyst" }, + { req: 1000, scheme: "rainbow" }, + { req: 1100, scheme: "iron_prime" }, + { req: 1200, scheme: "gold_prime" }, + { req: 1300, scheme: "diamond_prime" }, + { req: 1400, scheme: "emerald_prime" }, + { req: 1500, scheme: "sapphire_prime" }, + { req: 1600, scheme: "ruby_prime" }, + { req: 1700, scheme: "crystal_prime" }, + { req: 1800, scheme: "opal_prime" }, + { req: 1900, scheme: "amethyst_prime" }, + { req: 2000, scheme: "mirror" }, + { req: 2100, scheme: "light" }, + { req: 2200, scheme: "dawn" }, + { req: 2300, scheme: "dusk" }, + { req: 2400, scheme: "air" }, + { req: 2500, scheme: "wind" }, + { req: 2600, scheme: "nebula" }, + { req: 2700, scheme: "thunder" }, + { req: 2800, scheme: "earth" }, + { req: 2900, scheme: "water" }, + { req: 3000, scheme: "fire" }, + { req: 3100, scheme: "sunrise" }, + { req: 3200, scheme: "eclipse" }, + { req: 3300, scheme: "gamma" }, + { req: 3400, scheme: "majestic" }, + { req: 3500, scheme: "andesine" }, + { req: 3600, scheme: "marine" }, + { req: 3700, scheme: "element" }, + { req: 3800, scheme: "galaxy" }, + { req: 3900, scheme: "atomic" }, + { req: 4000, scheme: "sunset" }, + { req: 4100, scheme: "time" }, + { req: 4200, scheme: "winter" }, + { req: 4300, scheme: "obsidian" }, + { req: 4400, scheme: "spring" }, + { req: 4500, scheme: "ice" }, + { req: 4600, scheme: "summer" }, + { req: 4700, scheme: "spinel" }, + { req: 4800, scheme: "autumn" }, + { req: 4900, scheme: "mystic" }, + { req: 5000, scheme: "eternal" }, + { req: 5100, scheme: "burnout" }, + { req: 5200, scheme: "cooldown" }, + { req: 5300, scheme: "obliteration" }, + { req: 5400, scheme: "ender" }, + { req: 5500, scheme: "brust" }, + { req: 5600, scheme: "comical" }, + { req: 5700, scheme: "lusterlost" }, + { req: 5800, scheme: "maelstrom" }, + { req: 5900, scheme: "time_undone" }, + { req: 6000, scheme: "umbrella" }, + { req: 6100, scheme: "luminous" }, + { req: 6200, scheme: "tortilla" }, + { req: 6300, scheme: "corn" }, + { req: 6400, scheme: "bittersweet" }, + { req: 6500, scheme: "sweetsour" }, + { req: 6600, scheme: "pop" }, + { req: 6700, scheme: "bubblegum" }, + { req: 6800, scheme: "contrast" }, + { req: 6900, scheme: "blended" }, + { req: 7000, scheme: "allay" }, + { req: 7100, scheme: "blaze" }, + { req: 7200, scheme: "creeper" }, + { req: 7300, scheme: "drowned" }, + { req: 7400, scheme: "enderman" }, + { req: 7500, scheme: "frog" }, + { req: 7600, scheme: "ghast" }, + { req: 7700, scheme: "hoglin" }, + { req: 7800, scheme: "iron_golem" }, + { req: 7900, scheme: "jerry" }, + { req: 8000, scheme: "kringle" }, + { req: 8100, scheme: "liquid" }, + { req: 8200, scheme: "mint" }, + { req: 8300, scheme: "neglected" }, + { req: 8400, scheme: "onion" }, + { req: 8500, scheme: "poser" }, + { req: 8600, scheme: "quartz" }, + { req: 8700, scheme: "rich" }, + { req: 8800, scheme: "sanguine" }, + { req: 8900, scheme: "titanic" }, + { req: 9000, scheme: "unorthodox" }, + { req: 9100, scheme: "volcanic" }, + { req: 9200, scheme: "weeping_cherry" }, + { req: 9300, scheme: "x_ray" }, + { req: 9400, scheme: "yearn" }, + { req: 9500, scheme: "zebra" }, + { req: 9600, scheme: "caution" }, + { req: 9700, scheme: "indescribable" }, + { req: 9800, scheme: "forgotten" }, + { req: 9900, scheme: "fuse" }, + { req: 10_000, scheme: "prestigious" }, +]; + +export const PRESTIGE_STARS: { req: number; star: keyof typeof STAR_MAP }[] = [ + { req: 0, star: "black_open" }, + { req: 1000, star: "white_circled" }, + { req: 2000, star: "white_outlined" }, + { req: 3000, star: "four_clubs" }, + { req: 4000, star: "black_outlined" }, ]; -export const getFormattedLevel = (star: number): string => { - star = Math.floor(star); - return findScore(PRESTIGE_COLORS, star).fn(star); +export const getIntendedFormattedLevel = (level: number): string => { + const { scheme: schemeKey } = findScore(PRESTIGE_SCHEMES, level); + const { star: starKey } = findScore(PRESTIGE_STARS, level); + + const scheme = SCHEME_MAP[schemeKey]; + const star = STAR_MAP[starKey]; + + return scheme({ + level, + star, + brackets: BRACKET_MAP.none, + bold: false, + underline: false, + strikethrough: false, + }); +}; + +export const getPrestigeCosmetic = >({ + cosmetic, + packages, + favorites, + prefix, + map, + getDefault, +}: { + cosmetic?: string; + packages?: string[]; + prefix: string; + favorites?: Record; + map: M; + getDefault: () => keyof M; +}): M[keyof M] => { + const pickRandom = (items: (keyof M)[]) => { + if (items.length === 0) return map[getDefault()]; + return map[items[Math.floor(Math.random() * items.length)]]; + }; + + const filterValid = (items: string[]) => + items.filter((item) => item in map).map((item) => item as keyof M); + + if (cosmetic === "random_cosmetic") { + const items = filterValid( + (packages ?? []) + .filter((pkg) => pkg.startsWith(prefix)) + // remove the prefix and the following underscore + .map((pkg) => pkg.slice(prefix.length + 1)), + ); + + return pickRandom(items); + } + + if (cosmetic === "random_favorite_cosmetic") { + const items = filterValid(favorites?.[prefix] ?? []); + return pickRandom(items); + } + + // remove the prefix and the following underscore + const cosmeticWithoutPrefix = cosmetic?.slice(prefix.length + 1); + + if (cosmeticWithoutPrefix && cosmeticWithoutPrefix in map) { + return map[cosmeticWithoutPrefix]; + } + + if (cosmeticWithoutPrefix) { + console.warn(`Missing BedWars cosmetic: ${cosmetic}`); + } + + return map[getDefault()]; }; From bd5104b991ebc7d7b5b91935e73d052124c48c28 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:42:49 -0400 Subject: [PATCH 16/29] chore(deps): update actions/checkout digest to df4cb1c (#879) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0eb2b8782..ba9e9aac2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: TURBO_TELEMETRY_DISABLED: 1 steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: fetch-depth: 0 filter: blob:none diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5f1c46b50..c91ec0960 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: environment: production steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: token: ${{ secrets.REPO_PAT }} submodules: recursive From 88ddaaec71346520ef018bc3d01d7b99f95a9406 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 8 Jun 2026 16:09:36 -0600 Subject: [PATCH 17/29] fix(rendering): ignore unsupported font glyphs (#837) Co-authored-by: jacobk999 --- packages/rendering/src/font/font-renderer.ts | 60 ++++++++------------ packages/rendering/vitest.config.ts | 2 +- 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/packages/rendering/src/font/font-renderer.ts b/packages/rendering/src/font/font-renderer.ts index ab54eacb4..1dab011b4 100644 --- a/packages/rendering/src/font/font-renderer.ts +++ b/packages/rendering/src/font/font-renderer.ts @@ -8,11 +8,7 @@ import _positions from "../../positions.json" with { type: "json" }; import _sizes from "../../sizes.json" with { type: "json" }; -import type { - Canvas, - CanvasRenderingContext2D, - ImageData, -} from "skia-canvas"; +import type { Canvas, CanvasRenderingContext2D, ImageData } from "skia-canvas"; import { type TextNode, type Token, tokens } from "./tokens.js"; import { createCanvas } from "../canvas.js"; import { join } from "node:path"; @@ -34,24 +30,24 @@ interface Sizes { } export class FontRenderer { - private images: Map; - private canvases: WeakMap; - private scales: WeakMap; + private images: Map; public constructor(private gradient: boolean) { this.images = new Map(); - this.canvases = new WeakMap(); - this.scales = new WeakMap(); } public async loadImages(fontPath: string) { const files = await readdir(fontPath); - const pictures = await Promise.all(files.filter((file) => file.endsWith(".png")).map(async (file) => { - const image = await loadImage(join(fontPath, file)); - const id = file.replace("unicode_page_", "").replace(".png", ""); - return [id, image] as const; - })); + const pictures = await Promise.all( + files + .filter((file) => file.endsWith(".png")) + .map(async (file) => { + const image = await loadImage(join(fontPath, file)); + const id = file.replace("unicode_page_", "").replace(".png", ""); + return [id, image] as const; + }), + ); for (const [id, image] of pictures) { const canvas = createCanvas(image.width, image.height); @@ -61,10 +57,7 @@ export class FontRenderer { ctx.drawImage(image, 0, 0); - this.canvases.set(ctx, canvas); - this.scales.set(ctx, image.width / 256); - - this.images.set(id, ctx); + this.images.set(id, canvas); } } @@ -191,27 +184,16 @@ export class FontRenderer { return unicode.toUpperCase() in sizes.ascii; } + private getTextureScale(canvas: Canvas) { + return canvas.width / 256; + } + private getCharacterImage(unicode: string, isAscii: boolean) { return isAscii ? this.images.get("ascii") : this.images.get(`${unicode[0]}${unicode[1]}`); } - private getTextureScale(image: CanvasRenderingContext2D) { - return this.scales.get(image) ?? image.canvas.width / 256; - } - - private getImageData( - image: CanvasRenderingContext2D, - x: number, - y: number, - width: number, - height: number - ) { - const ctx = this.canvases.get(image)?.getContext("2d") ?? image; - return ctx.getImageData(x, y, width, height); - } - private getCharacterIndexLocation(unicode: string, isAscii: boolean) { if (isAscii) { const y = positions.findIndex((row) => row.includes(unicode)); @@ -243,8 +225,10 @@ export class FontRenderer { const characterSize = sizes[isAscii ? "ascii" : "unicode"][unicode.toUpperCase()]; - const startOffset = characterSize?.start ?? 0; - const width = characterSize?.width ?? 0; + if (!characterSize?.width) return null; + + const startOffset = characterSize.start ?? 0; + const width = characterSize.width; return { x: (startOffset + x * 16) * scale, @@ -326,7 +310,9 @@ export class FontRenderer { size, } = metadata; - const imageData = this.getImageData(image, charX, charY, width, height); + const imageData = image + .getContext("2d") + .getImageData(charX, charY, width, height); ctx.filter = this.gradient ? "brightness(15%)" : "brightness(25%)"; diff --git a/packages/rendering/vitest.config.ts b/packages/rendering/vitest.config.ts index b0cea40f6..19e5e20ae 100644 --- a/packages/rendering/vitest.config.ts +++ b/packages/rendering/vitest.config.ts @@ -8,4 +8,4 @@ import { config } from "../../vitest.shared.js"; -export default await config("./.swcrc"); +export default await config("./.swcrc"); \ No newline at end of file From b729496bf100cda33d22f6eefc1ed6de9e037618 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 8 Jun 2026 16:38:38 -0600 Subject: [PATCH 18/29] fix(skywars): add missing prestige schemes (#840) --- .../src/player/gamemodes/skywars/util.ts | 335 +++++++++--------- 1 file changed, 169 insertions(+), 166 deletions(-) diff --git a/packages/schemas/src/player/gamemodes/skywars/util.ts b/packages/schemas/src/player/gamemodes/skywars/util.ts index 7f122ce23..d40e00f6f 100644 --- a/packages/schemas/src/player/gamemodes/skywars/util.ts +++ b/packages/schemas/src/player/gamemodes/skywars/util.ts @@ -130,172 +130,175 @@ const EMBLEM_MAP = { type Scheme = (level: number, bold: boolean, underline: boolean, strikethrough: boolean, emblem?: string,) => string; const SCHEME_MAP = { - "stone_prestige": createUniformScheme("ยง7"), - "iron_prestige": createUniformScheme("ยงf"), - "gold_prestige": createUniformScheme("ยง6"), - "diamond_prestige": createUniformScheme("ยงb"), - "ruby_prestige": createUniformScheme("ยงc"), - "crystal_prestige": createUniformScheme("ยงd"), - "amethyst_prestige": createUniformScheme("ยง5"), - "opal_prestige": createUniformScheme("ยง9"), - "topaz_prestige": createUniformScheme("ยงe"), - "jade_prestige": createUniformScheme("ยงa"), - "mythic_i_prestige": createMultiDigitColorScheme(["ยงc", "ยง6", "ยงe", "ยงa", "ยงb", "ยงd"]), - "bloody_prestige": createUniformScheme("ยง4", "ยงc"), - "cobalt_prestige": createUniformScheme("ยง1"), - "content_prestige": createUniformScheme("ยงc", "ยงf"), - "crimson_prestige": createUniformScheme("ยง4"), - "firefly_prestige": createUniformScheme("ยง6", "ยงe"), - "emerald_prestige": createUniformScheme("ยง2"), - "abyss_prestige": createUniformScheme("ยง1", "ยง9"), - "sapphire_prestige": createUniformScheme("ยง3"), - "emergency_prestige": createUniformScheme("ยง4", "ยงe"), - "mythic_ii_prestige": createMultiDigitColorScheme(["ยง6", "ยงe", "ยงa", "ยงb", "ยงd", "ยงc"]), - "mulberry_prestige": createUniformScheme("ยง5", "ยงd"), - "slate_prestige": createUniformScheme("ยง8"), - "blood_god_prestige": createUniformScheme("ยงd", "ยงb"), - "midnight_prestige": createUniformScheme("ยง0"), - "sun_prestige": createMultiDigitColorScheme(["ยงc", "ยง6", "ยงe", "ยงe", "ยง6", "ยงc"]), - "bulb_prestige": createMultiDigitColorScheme(["ยง0", "ยงe", "ยง6", "ยง6", "ยงe", "ยง0"]), - "twilight_prestige": createUniformScheme("ยง1", "ยง3"), - "natural_prestige": createMultiDigitColorScheme(["ยงa", "ยง2", "ยงa", "ยงe", "ยงa", "ยง2"]), - "icile_prestige": createUniformScheme("ยง9", "ยงb"), - "mythic_iii_prestige": createMultiDigitColorScheme(["ยงe", "ยงa", "ยงb", "ยงd", "ยงc", "ยง6"]), - "graphite_prestige": createUniformScheme("ยง8", "ยง7"), - "punk_prestige": createUniformScheme("ยงd", "ยงa"), - "meltdown_prestige": createUniformScheme("ยงe", "ยงc"), - "iridescent_prestige": createMultiDigitColorScheme(["ยงb", "ยงa", "ยงb", "ยงd", "ยงa", "ยงa"]), - "marigold_prestige": createMultiDigitColorScheme(["ยงf", "ยงf", "ยงe", "ยงe", "ยง6", "ยง6"]), - "beach_prestige": createMultiDigitColorScheme(["ยง9", "ยง3", "ยงb", "ยงf", "ยงe", "ยงe"]), - "spark_prestige": createMultiDigitColorScheme(["ยงe", "ยงe", "ยงf", "ยงf", "ยง8", "ยง8"]), - "target_prestige": createMultiDigitColorScheme(["ยงc", "ยงf", "ยงc", "ยงc", "ยงf", "ยงc"]), - "limelight_prestige": createUniformScheme("ยง2", "ยงa"), - "mythic_iv_prestige": createMultiDigitColorScheme(["ยงa", "ยงb", "ยงd", "ยงc", "ยง6", "ยงe"]), - "cerulean_prestige": createUniformScheme("ยง3", "ยงb"), - "magical_prestige": createMultiDigitColorScheme(["ยง0", "ยง5", "ยง8", "ยง8", "ยง5", "ยง0"]), - "luminous_prestige": createMultiDigitColorScheme(["ยง6", "ยง6", "ยงf", "ยงf", "ยงb", "ยง3"]), - "synthesis_prestige": createMultiDigitColorScheme(["ยงa", "ยง2", "ยงa", "ยงe", "ยงf", "ยงf"]), - "burn_prestige": createMultiDigitColorScheme(["ยง4", "ยง4", "ยงc", "ยง6", "ยงe", "ยงf"]), - "dramatic_prestige": createMultiDigitColorScheme(["ยง9", "ยงb", "ยง3", "ยงd", "ยง5", "ยง4"]), - "radiant_prestige": createMultiDigitColorScheme(["ยง0", "ยง8", "ยง7", "ยงf", "ยง7", "ยง8"]), - "tidal_prestige": createMultiDigitColorScheme(["ยง1", "ยง1", "ยง9", "ยง3", "ยงb", "ยงf"]), - "firework_prestige": createMultiDigitColorScheme(["ยง9", "ยงb", "ยงf", "ยงf", "ยงc", "ยง4"]), - "mythic_v_prestige": createMultiDigitColorScheme(["ยงb", "ยงd", "ยงc", "ยง6", "ยงe", "ยงa"]), - - "ancient": createUniformScheme("ยง7", "ยง8"), - "the_new_default": createUniformScheme("ยง6", "ยง7", "ยง6"), - "the_new_new_default": createUniformScheme("ยงb", "ยง7", "ยงb"), - "launch": createUniformScheme("ยง6", "ยง6", "ยง8"), - "jersey": createUniformScheme("ยงf", "ยงf", "ยงc"), - "spotlight": createUniformScheme("ยง0", "ยงf"), - "earth": createUniformScheme("ยง4", "ยง4", "ยงa"), - "glint": createUniformScheme("ยงd", "ยงd", "ยงb"), - "strength": createUniformScheme("ยงc", "ยงd"), - "adrenaline": createUniformScheme("ยงc", "ยงa"), - "pumpkin": createUniformScheme("ยง4", "ยง6"), - "seashell": createUniformScheme("ยงe", "ยงe", "ยงc"), - "obsidian": createUniformScheme("ยง8", "ยง8", "ยง5"), - "support": createUniformScheme("ยงf", "ยงc"), - "mahogany": createUniformScheme("ยงe", "ยง6"), - "spell": createMultiDigitColorScheme(["ยงd", "ยงd", "ยงd", "ยงe", "ยงe", "ยงe"]), - "pillar": createUniformScheme("ยงf", "ยง6"), - "agile": createUniformScheme("ยงa", "ยงf"), - "bone": createUniformScheme("ยงf", "ยง7", "ยงf"), - "slimy": createUniformScheme("ยงa", "ยง2"), - "holiday": createUniformScheme("ยง4", "ยงa"), - "iconic": createUniformScheme("ยง0", "ยง0", "ยงf"), + stone_prestige: createUniformScheme("ยง7"), + iron_prestige: createUniformScheme("ยงf"), + gold_prestige: createUniformScheme("ยง6"), + diamond_prestige: createUniformScheme("ยงb"), + ruby_prestige: createUniformScheme("ยงc"), + crystal_prestige: createUniformScheme("ยงd"), + amethyst_prestige: createUniformScheme("ยง5"), + opal_prestige: createUniformScheme("ยง9"), + topaz_prestige: createUniformScheme("ยงe"), + jade_prestige: createUniformScheme("ยงa"), + mythic_i_prestige: createMultiDigitColorScheme(["ยงc", "ยง6", "ยงe", "ยงa", "ยงb", "ยงd"]), + bloody_prestige: createUniformScheme("ยง4", "ยงc"), + cobalt_prestige: createUniformScheme("ยง1"), + content_prestige: createUniformScheme("ยงc", "ยงf"), + crimson_prestige: createUniformScheme("ยง4"), + firefly_prestige: createUniformScheme("ยง6", "ยงe"), + emerald_prestige: createUniformScheme("ยง2"), + abyss_prestige: createUniformScheme("ยง1", "ยง9"), + sapphire_prestige: createUniformScheme("ยง3"), + emergency_prestige: createUniformScheme("ยง4", "ยงe"), + mythic_ii_prestige: createMultiDigitColorScheme(["ยง6", "ยงe", "ยงa", "ยงb", "ยงd", "ยงc"]), + mulberry_prestige: createUniformScheme("ยง5", "ยงd"), + slate_prestige: createUniformScheme("ยง8"), + blood_god_prestige: createUniformScheme("ยงd", "ยงb"), + midnight_prestige: createUniformScheme("ยง0"), + sun_prestige: createMultiDigitColorScheme(["ยงc", "ยง6", "ยงe", "ยงe", "ยง6", "ยงc"]), + bulb_prestige: createMultiDigitColorScheme(["ยง0", "ยงe", "ยง6", "ยง6", "ยงe", "ยง0"]), + twilight_prestige: createUniformScheme("ยง1", "ยง3"), + natural_prestige: createMultiDigitColorScheme(["ยงa", "ยง2", "ยงa", "ยงe", "ยงa", "ยง2"]), + icicle_prestige: createUniformScheme("ยง9", "ยงb"), + mythic_iii_prestige: createMultiDigitColorScheme(["ยงe", "ยงa", "ยงb", "ยงd", "ยงc", "ยง6"]), + graphite_prestige: createUniformScheme("ยง8", "ยง7"), + punk_prestige: createUniformScheme("ยงd", "ยงa"), + meltdown_prestige: createUniformScheme("ยงe", "ยงc"), + iridescent_prestige: createMultiDigitColorScheme(["ยงb", "ยงa", "ยงb", "ยงd", "ยงa", "ยงa"]), + marigold_prestige: createMultiDigitColorScheme(["ยงf", "ยงf", "ยงe", "ยงe", "ยง6", "ยง6"]), + beach_prestige: createMultiDigitColorScheme(["ยง9", "ยง3", "ยงb", "ยงf", "ยงe", "ยงe"]), + spark_prestige: createMultiDigitColorScheme(["ยงe", "ยงe", "ยงf", "ยงf", "ยง8", "ยง8"]), + target_prestige: createMultiDigitColorScheme(["ยงc", "ยงf", "ยงc", "ยงc", "ยงf", "ยงc"]), + limelight_prestige: createUniformScheme("ยง2", "ยงa"), + mythic_iv_prestige: createMultiDigitColorScheme(["ยงa", "ยงb", "ยงd", "ยงc", "ยง6", "ยงe"]), + cerulean_prestige: createUniformScheme("ยง3", "ยงb"), + magical_prestige: createMultiDigitColorScheme(["ยง0", "ยง5", "ยง8", "ยง8", "ยง5", "ยง0"]), + luminous_prestige: createMultiDigitColorScheme(["ยง6", "ยง6", "ยงf", "ยงf", "ยงb", "ยง3"]), + synthesis_prestige: createMultiDigitColorScheme(["ยงa", "ยง2", "ยงa", "ยงe", "ยงf", "ยงf"]), + burn_prestige: createMultiDigitColorScheme(["ยง4", "ยง4", "ยงc", "ยง6", "ยงe", "ยงf"]), + dramatic_prestige: createMultiDigitColorScheme(["ยง9", "ยงb", "ยง3", "ยงd", "ยง5", "ยง4"]), + radiant_prestige: createMultiDigitColorScheme(["ยง0", "ยง8", "ยง7", "ยงf", "ยง7", "ยง8"]), + tidal_prestige: createMultiDigitColorScheme(["ยง1", "ยง1", "ยง9", "ยง3", "ยงb", "ยงf"]), + firework_prestige: createMultiDigitColorScheme(["ยง9", "ยงb", "ยงf", "ยงf", "ยงc", "ยง4"]), + mythic_v_prestige: createMultiDigitColorScheme(["ยงb", "ยงd", "ยงc", "ยง6", "ยงe", "ยงa"]), + + ancient: createUniformScheme("ยง7", "ยง8"), + the_new_default: createUniformScheme("ยง6", "ยง7", "ยง6"), + the_new_new_default: createUniformScheme("ยงb", "ยง7", "ยงb"), + launch: createUniformScheme("ยง6", "ยง6", "ยง8"), + jersey: createUniformScheme("ยงf", "ยงf", "ยงc"), + spotlight: createUniformScheme("ยง0", "ยงf"), + earth: createUniformScheme("ยง4", "ยง4", "ยงa"), + glint: createUniformScheme("ยงd", "ยงd", "ยงb"), + strength: createUniformScheme("ยงc", "ยงd"), + adrenaline: createUniformScheme("ยงc", "ยงa"), + pumpkin: createUniformScheme("ยง4", "ยง6"), + seashell: createUniformScheme("ยงe", "ยงe", "ยงc"), + obsidian: createUniformScheme("ยง8", "ยง8", "ยง5"), + support: createUniformScheme("ยงf", "ยงc"), + mahogany: createUniformScheme("ยงe", "ยง6"), + spell: createMultiDigitColorScheme(["ยงd", "ยงd", "ยงd", "ยงe", "ยงe", "ยงe"]), + pillar: createUniformScheme("ยงf", "ยง6"), + agile: createUniformScheme("ยงa", "ยงf"), + bone: createUniformScheme("ยงf", "ยง7", "ยงf"), + slimy: createUniformScheme("ยงa", "ยง2"), + holiday: createUniformScheme("ยง4", "ยงa"), + iconic: createUniformScheme("ยง0", "ยง0", "ยงf"), // TODO: Figure out name: Level-conic? - "level-conic?": createUniformScheme("ยง0", "ยงf", "ยง0"), - "safari": createMultiDigitColorScheme(["ยง2", "ยง2", "ยง2", "ยง6", "ยง6", "ยง6"]), - "gummy_worm": createMultiDigitColorScheme(["ยงc", "ยงc", "ยงc", "ยงb", "ยงb", "ยงb"]), - "timetravel": createMultiDigitColorScheme(["ยง7", "ยง0", "ยง0", "ยง7", "ยง7", "ยง7"]), - "horned": createUniformScheme("ยงc", "ยง8"), - "sandy": createMultiDigitColorScheme(["ยง6", "ยงe", "ยงf", "ยงe", "ยง6", "ยงe"]), - "brutus": createMultiDigitColorScheme(["ยง9", "ยง9", "ยง8", "ยง8", "ยงf", "ยงf"]), - "coinsmith": createMultiDigitColorScheme(["ยงe", "ยง8", "ยง8", "ยง8", "ยง6", "ยงe"]), - "soulsmith": createMultiDigitColorScheme(["ยง7", "ยงb", "ยงb", "ยงf", "ยงf", "ยงf"]), - "grand_slam": createUniformScheme("ยง2", "ยงa", "ยงf"), - "fleet": createMultiDigitColorScheme(["ยง0", "ยงc", "ยงe", "ยงa", "ยงa", "ยง0"]), - "vengeance": createUniformScheme("ยง0", "ยง8", "ยงe"), - "dry": createUniformScheme("ยงe", "ยงf", "ยง6"), - "prickly": createUniformScheme("ยงe", "ยงa", "ยงf"), - "cast_iron": createMultiDigitColorScheme(["ยง7", "ยง7", "ยง8", "ยง8", "ยง3", "ยง3"]), - "explosive": createMultiDigitColorScheme(["ยงc", "ยงc", "ยงe", "ยงe", "ยง6", "ยง6"]), - "verdant": createMultiDigitColorScheme(["ยง2", "ยงa", "ยงa", "ยงe", "ยง6", "ยงe"]), - "enchantment": createMultiDigitColorScheme(["ยงf", "ยงd", "ยง5", "ยง5", "ยงd", "ยงf"]), - "void": createUniformScheme("ยง8", "ยง5", "ยงd"), - "fragile": createUniformScheme("ยง0", "ยง3", "ยงa"), - "ender": createMultiDigitColorScheme(["ยง3", "ยง2", "ยง8", "ยง2", "ยงa", "ยง3"]), - "mite": createMultiDigitColorScheme(["ยง5", "ยงd", "ยงd", "ยง6", "ยงe", "ยงe"]), - "shulker": createUniformScheme("ยง5", "ยงe", "ยงf"), - "redstone": createUniformScheme("ยง0", "ยงc", "ยง4"), - "technical": createMultiDigitColorScheme(["ยงc", "ยงc", "ยง7", "ยง7", "ยง8", "ยง8"]), - "melon": createMultiDigitColorScheme(["ยงa", "ยง2", "ยงa", "ยง2", "ยงe", "ยงa"]), - "driftwood": createMultiDigitColorScheme(["ยง3", "ยง3", "ยงe", "ยงe", "ยง4", "ยง4"]), - "river": createUniformScheme("ยง2", "ยง9", "ยงa"), - "mangrove": createMultiDigitColorScheme(["ยง4", "ยง4", "ยงc", "ยงc", "ยง2", "ยง2"]), - "jeremiah": createUniformScheme("ยง3", "ยง6", "ยงe"), - "poppy": createMultiDigitColorScheme(["ยงc", "ยง4", "ยง0", "ยง0", "ยง4", "ยงc"]), - "creeper": createMultiDigitColorScheme(["ยงf", "ยงf", "ยงa", "ยงa", "ยง2", "ยง2"]), - "camo": createMultiDigitColorScheme(["ยง8", "ยง8", "ยง2", "ยง2", "ยงa", "ยงa"]), - "first_aid": createUniformScheme("ยง4", "ยงf", "ยงc"), - "penguin": createUniformScheme("ยง8", "ยง9", "ยงe"), - "nether": createMultiDigitColorScheme(["ยง7", "ยง7", "ยง3", "ยง3", "ยงc", "ยงc"]), - "wilderness": createMultiDigitColorScheme(["ยง2", "ยง2", "ยง3", "ยง3", "ยง6", "ยง6"]), - "one_stone": createMultiDigitColorScheme(["ยง7", "ยง7", "ยง2", "ยง2", "ยง8", "ยง8"]), - "circus": createMultiDigitColorScheme(["ยงc", "ยงc", "ยง6", "ยง6", "ยง2", "ยง2"]), - "veracious": createUniformScheme("ยง5", "ยงf", "ยง6"), - "valiant": createUniformScheme("ยงc", "ยงf", "ยงa"), - "venerable": createUniformScheme("ยง9", "ยงf", "ยงe"), - "portal": createMultiDigitColorScheme(["ยงa", "ยงa", "ยงd", "ยงd", "ยงc", "ยงc"]), - "sorcratic": createUniformScheme("ยง8", "ยงf", "ยงe"), - "parallel_dimension": createMultiDigitColorScheme(["ยง9", "ยง9", "ยง8", "ยง8", "ยงd", "ยงd"]), - "tomb": createMultiDigitColorScheme(["ยง6", "ยง9", "ยง6", "ยง9", "ยงe", "ยงe"]), - "irigation": createMultiDigitColorScheme(["ยงb", "ยงb", "ยงa", "ยง6", "ยงe", "ยงe"]), - "snout": createMultiDigitColorScheme(["ยง5", "ยง0", "ยงd", "ยงd", "ยง0", "ยง5"]), - "potato": createMultiDigitColorScheme(["ยงe", "ยงd", "ยงd", "ยงc", "ยงc", "ยง8"]), - "royal": createMultiDigitColorScheme(["ยง9", "ยง9", "ยง6", "ยง6", "ยงc", "ยงc"]), - "bubblegum": createMultiDigitColorScheme(["ยง5", "ยงd", "ยงd", "ยงf", "ยงf", "ยงd"]), - "insane": createUniformScheme("ยง7", "ยงf", "ยง6"), - "smoke": createMultiDigitColorScheme(["ยง0", "ยง0", "ยง8", "ยง8", "ยงf", "ยงf"]), - "scarlet": createMultiDigitColorScheme(["ยง8", "ยง8", "ยง4", "ยง4", "ยงc", "ยงc"]), - "afterburn": createMultiDigitColorScheme(["ยงb", "ยงb", "ยง6", "ยง8", "ยง8", "ยง7"]), - "normal": createUniformScheme("ยง8", "ยง7", "ยง6"), - "salmon": createMultiDigitColorScheme(["ยงc", "ยงc", "ยง3", "ยง3", "ยง2", "ยง2"]), - "lucky": createUniformScheme("ยง0", "ยง2", "ยง6"), - "likeable": createMultiDigitColorScheme(["ยง4", "ยง4", "ยงc", "ยงc", "ยงf", "ยงf"]), - "lunar": createMultiDigitColorScheme(["ยงf", "ยงf", "ยงf", "ยง7", "ยง8", "ยง8"]), - "hypixel": createUniformScheme("ยง4", "ยง6", "ยงe"), - "sky": createMultiDigitColorScheme(["ยงe", "ยงe", "ยงb", "ยงb", "ยงf", "ยงf"]), - "frosty": createUniformScheme("ยง8", "ยงf", "ยง7"), - "treasure": createMultiDigitColorScheme(["ยง6", "ยง6", "ยงf", "ยงf", "ยงe", "ยงe"]), - "gemstone": createMultiDigitColorScheme(["ยง4", "ยงc", "ยงf", "ยงf", "ยงc", "ยง4"]), - "dark_magic": createMultiDigitColorScheme(["ยง4", "ยง4", "ยง5", "ยง5", "ยงc", "ยงc"]), - "reflections": createMultiDigitColorScheme(["ยง1", "ยง0", "ยง0", "ยงd", "ยงd", "ยง5"]), - "brewery": createUniformScheme("ยง5", "ยงc", "ยงd$"), - "leo": createMultiDigitColorScheme(["ยงe", "ยงe", "ยงe", "ยง6", "ยง4", "ยง4"]), - "zebra": createMultiDigitColorScheme(["ยง7", "ยง8", "ยง7", "ยง8", "ยงf", "ยง8"]), - "emit": createMultiDigitColorScheme(["ยง5", "ยงd", "ยงf", "ยงf", "ยงd", "ยง5"]), - "smoldering": createUniformScheme("ยง0", "ยง4", "ยงc"), - "stormy": createMultiDigitColorScheme(["ยงe", "ยงe", "ยงf", "ยงf", "ยง7", "ยง7"]), - "borealis": createMultiDigitColorScheme(["ยงd", "ยงd", "ยงb", "ยงb", "ยงa", "ยงa"]), - "devil": createMultiDigitColorScheme(["ยง0", "ยง8", "ยง8", "ยง4", "ยง4", "ยงc"]), - "demigod": createMultiDigitColorScheme(["ยง8", "ยง6", "ยงe", "ยง7", "ยง8", "ยง8"], "curly"), - "laurel": createMultiDigitColorScheme(["ยง2", "ยง2", "ยง6", "ยง6", "ยงf", "ยงf"]), - "uplifting": createMultiDigitColorScheme(["ยง8", "ยง8", "ยง7", "ยง7", "ยงe", "ยงe"]), - "the_world_moves_on": createMultiDigitColorScheme(["ยง8", "ยง8", "ยง6", "ยง6", "ยงc", "ยงc"]), - "swine": createMultiDigitColorScheme(["ยง5", "ยง5", "ยงd", "ยงd", "ยงf", "ยงf"]), - "beagle": createUniformScheme("ยงf", "ยง7", "ยงf"), - "the_prestige_prestige": createMultiDigitColorScheme(["ยง7", "ยงf", "ยง6", "ยงb", "ยงc", "ยงd"]), - "opalsmith": createMultiDigitColorScheme(["ยง9", "ยง9", "ยงb", "ยง3", "ยงd", "ยง5"]), - "scurvy": createMultiDigitColorScheme(["ยง9", "ยง3", "ยงb", "ยงf", "ยงa", "ยง2"]), - "fools_mythic": createMultiDigitColorScheme(["ยง4", "ยงc", "ยง6", "ยง2", "ยง9", "ยง5"]), - "eponymous": createMultiDigitColorScheme(["ยง3", "ยง3", "ยง2", "ยงa", "ยงe", "ยง6"]), - "bandage": createMultiDigitColorScheme(["ยง0", "ยง8", "ยง7", "ยงf", "ยงc", "ยง4"]), - "clown": createMultiDigitColorScheme(["ยง2", "ยงc", "ยงf", "ยงf", "ยงc", "ยง4"]), - "tropical": createMultiDigitColorScheme(["ยงe", "ยง9", "ยง6", "ยง3", "ยงc", "ยง1"]), - "sugar_crash": createMultiDigitColorScheme(["ยงf", "ยงe", "ยงc", "ยงd", "ยงb", "ยงf"]), - "ultraviolence": createMultiDigitColorScheme(["ยง2", "ยงa", "ยงf", "ยงf", "ยงd", "ยง5"]), + level_conic: createUniformScheme("ยง0", "ยงf", "ยง0"), + safari: createMultiDigitColorScheme(["ยง2", "ยง2", "ยง2", "ยง6", "ยง6", "ยง6"]), + gummy_worm: createMultiDigitColorScheme(["ยงc", "ยงc", "ยงc", "ยงb", "ยงb", "ยงb"]), + timetravel: createMultiDigitColorScheme(["ยง7", "ยง0", "ยง0", "ยง7", "ยง7", "ยง7"]), + horned: createUniformScheme("ยงc", "ยง8"), + basic: createUniformScheme("ยง7", "ยงf"), + basic_plus: createUniformScheme("ยง7", "ยง6"), + basic_plus_plus: createUniformScheme("ยง7", "ยงb"), + sandy: createMultiDigitColorScheme(["ยง6", "ยงe", "ยงf", "ยงe", "ยง6", "ยงe"]), + brutus: createMultiDigitColorScheme(["ยง9", "ยง9", "ยง8", "ยง8", "ยงf", "ยงf"]), + coinsmith: createMultiDigitColorScheme(["ยงe", "ยง8", "ยง8", "ยง8", "ยง6", "ยงe"]), + soulsmith: createMultiDigitColorScheme(["ยง7", "ยงb", "ยงb", "ยงf", "ยงf", "ยงf"]), + grand_slam: createUniformScheme("ยง2", "ยงa", "ยงf"), + fleet: createMultiDigitColorScheme(["ยง0", "ยงc", "ยงe", "ยงa", "ยงa", "ยง0"]), + vengeance: createUniformScheme("ยง0", "ยง8", "ยงe"), + dry: createUniformScheme("ยงe", "ยงf", "ยง6"), + prickly: createUniformScheme("ยงe", "ยงa", "ยงf"), + cast_iron: createMultiDigitColorScheme(["ยง7", "ยง7", "ยง8", "ยง8", "ยง3", "ยง3"]), + explosive: createMultiDigitColorScheme(["ยงc", "ยงc", "ยงe", "ยงe", "ยง6", "ยง6"]), + verdant: createMultiDigitColorScheme(["ยง2", "ยงa", "ยงa", "ยงe", "ยง6", "ยงe"]), + enchantment: createMultiDigitColorScheme(["ยงf", "ยงd", "ยง5", "ยง5", "ยงd", "ยงf"]), + void: createUniformScheme("ยง8", "ยง5", "ยงd"), + fragile: createUniformScheme("ยง0", "ยง3", "ยงa"), + ender: createMultiDigitColorScheme(["ยง3", "ยง2", "ยง8", "ยง2", "ยงa", "ยง3"]), + mite: createMultiDigitColorScheme(["ยง5", "ยงd", "ยงd", "ยง6", "ยงe", "ยงe"]), + shulker: createUniformScheme("ยง5", "ยงe", "ยงf"), + redstone: createUniformScheme("ยง0", "ยงc", "ยง4"), + technical: createMultiDigitColorScheme(["ยงc", "ยงc", "ยง7", "ยง7", "ยง8", "ยง8"]), + melon: createMultiDigitColorScheme(["ยงa", "ยง2", "ยงa", "ยง2", "ยงe", "ยงa"]), + driftwood: createMultiDigitColorScheme(["ยง3", "ยง3", "ยงe", "ยงe", "ยง4", "ยง4"]), + river: createUniformScheme("ยง2", "ยง9", "ยงa"), + mangrove: createMultiDigitColorScheme(["ยง4", "ยง4", "ยงc", "ยงc", "ยง2", "ยง2"]), + jeremiah: createUniformScheme("ยง3", "ยง6", "ยงe"), + poppy: createMultiDigitColorScheme(["ยงc", "ยง4", "ยง0", "ยง0", "ยง4", "ยงc"]), + creeper: createMultiDigitColorScheme(["ยงf", "ยงf", "ยงa", "ยงa", "ยง2", "ยง2"]), + camo: createMultiDigitColorScheme(["ยง8", "ยง8", "ยง2", "ยง2", "ยงa", "ยงa"]), + first_aid: createUniformScheme("ยง4", "ยงf", "ยงc"), + penguin: createUniformScheme("ยง8", "ยง9", "ยงe"), + nether: createMultiDigitColorScheme(["ยง7", "ยง7", "ยง3", "ยง3", "ยงc", "ยงc"]), + wilderness: createMultiDigitColorScheme(["ยง2", "ยง2", "ยง3", "ยง3", "ยง6", "ยง6"]), + one_stone: createMultiDigitColorScheme(["ยง7", "ยง7", "ยง2", "ยง2", "ยง8", "ยง8"]), + circus: createMultiDigitColorScheme(["ยงc", "ยงc", "ยง6", "ยง6", "ยง2", "ยง2"]), + veracious: createUniformScheme("ยง5", "ยงf", "ยง6"), + valiant: createUniformScheme("ยงc", "ยงf", "ยงa"), + venerable: createUniformScheme("ยง9", "ยงf", "ยงe"), + portal: createMultiDigitColorScheme(["ยงa", "ยงa", "ยงd", "ยงd", "ยงc", "ยงc"]), + socratic: createUniformScheme("ยง8", "ยงf", "ยงe"), + parallel_dimension: createMultiDigitColorScheme(["ยง9", "ยง9", "ยง8", "ยง8", "ยงd", "ยงd"]), + tomb: createMultiDigitColorScheme(["ยง6", "ยง9", "ยง6", "ยง9", "ยงe", "ยงe"]), + irigation: createMultiDigitColorScheme(["ยงb", "ยงb", "ยงa", "ยง6", "ยงe", "ยงe"]), + snout: createMultiDigitColorScheme(["ยง5", "ยง0", "ยงd", "ยงd", "ยง0", "ยง5"]), + potato: createMultiDigitColorScheme(["ยงe", "ยงd", "ยงd", "ยงc", "ยงc", "ยง8"]), + royal: createMultiDigitColorScheme(["ยง9", "ยง9", "ยง6", "ยง6", "ยงc", "ยงc"]), + bubblegum: createMultiDigitColorScheme(["ยง5", "ยงd", "ยงd", "ยงf", "ยงf", "ยงd"]), + insane: createUniformScheme("ยง7", "ยงf", "ยง6"), + smoke: createMultiDigitColorScheme(["ยง0", "ยง0", "ยง8", "ยง8", "ยงf", "ยงf"]), + scarlet: createMultiDigitColorScheme(["ยง8", "ยง8", "ยง4", "ยง4", "ยงc", "ยงc"]), + afterburn: createMultiDigitColorScheme(["ยงb", "ยงb", "ยง6", "ยง8", "ยง8", "ยง7"]), + normal: createUniformScheme("ยง8", "ยง7", "ยง6"), + salmon: createMultiDigitColorScheme(["ยงc", "ยงc", "ยง3", "ยง3", "ยง2", "ยง2"]), + lucky: createUniformScheme("ยง0", "ยง2", "ยง6"), + likeable: createMultiDigitColorScheme(["ยง4", "ยง4", "ยงc", "ยงc", "ยงf", "ยงf"]), + lunar: createMultiDigitColorScheme(["ยงf", "ยงf", "ยงf", "ยง7", "ยง8", "ยง8"]), + hypixel: createUniformScheme("ยง4", "ยง6", "ยงe"), + sky: createMultiDigitColorScheme(["ยงe", "ยงe", "ยงb", "ยงb", "ยงf", "ยงf"]), + frosty: createUniformScheme("ยง8", "ยงf", "ยง7"), + treasure: createMultiDigitColorScheme(["ยง6", "ยง6", "ยงf", "ยงf", "ยงe", "ยงe"]), + gemstone: createMultiDigitColorScheme(["ยง4", "ยงc", "ยงf", "ยงf", "ยงc", "ยง4"]), + dark_magic: createMultiDigitColorScheme(["ยง4", "ยง4", "ยง5", "ยง5", "ยงc", "ยงc"]), + reflections: createMultiDigitColorScheme(["ยง1", "ยง0", "ยง0", "ยงd", "ยงd", "ยง5"]), + brewery: createUniformScheme("ยง5", "ยงc", "ยงd$"), + leo: createMultiDigitColorScheme(["ยงe", "ยงe", "ยงe", "ยง6", "ยง4", "ยง4"]), + zebra: createMultiDigitColorScheme(["ยง7", "ยง8", "ยง7", "ยง8", "ยงf", "ยง8"]), + emit: createMultiDigitColorScheme(["ยง5", "ยงd", "ยงf", "ยงf", "ยงd", "ยง5"]), + smoldering: createUniformScheme("ยง0", "ยง4", "ยงc"), + stormy: createMultiDigitColorScheme(["ยงe", "ยงe", "ยงf", "ยงf", "ยง7", "ยง7"]), + borealis: createMultiDigitColorScheme(["ยงd", "ยงd", "ยงb", "ยงb", "ยงa", "ยงa"]), + devil: createMultiDigitColorScheme(["ยง0", "ยง8", "ยง8", "ยง4", "ยง4", "ยงc"]), + demigod: createMultiDigitColorScheme(["ยง8", "ยง6", "ยงe", "ยง7", "ยง8", "ยง8"], "curly"), + laurel: createMultiDigitColorScheme(["ยง2", "ยง2", "ยง6", "ยง6", "ยงf", "ยงf"]), + uplifting: createMultiDigitColorScheme(["ยง8", "ยง8", "ยง7", "ยง7", "ยงe", "ยงe"]), + the_world_moves_on: createMultiDigitColorScheme(["ยง8", "ยง8", "ยง6", "ยง6", "ยงc", "ยงc"]), + swine: createMultiDigitColorScheme(["ยง5", "ยง5", "ยงd", "ยงd", "ยงf", "ยงf"]), + beagle: createUniformScheme("ยงf", "ยง7", "ยงf"), + the_prestige_prestige: createMultiDigitColorScheme(["ยง7", "ยงf", "ยง6", "ยงb", "ยงc", "ยงd"]), + opalsmith: createMultiDigitColorScheme(["ยง9", "ยง9", "ยงb", "ยง3", "ยงd", "ยง5"]), + scurvy: createMultiDigitColorScheme(["ยง9", "ยง3", "ยงb", "ยงf", "ยงa", "ยง2"]), + fools_mythic: createMultiDigitColorScheme(["ยง4", "ยงc", "ยง6", "ยง2", "ยง9", "ยง5"]), + eponymous: createMultiDigitColorScheme(["ยง3", "ยง3", "ยง2", "ยงa", "ยงe", "ยง6"]), + bandage: createMultiDigitColorScheme(["ยง0", "ยง8", "ยง7", "ยงf", "ยงc", "ยง4"]), + clown: createMultiDigitColorScheme(["ยง2", "ยงc", "ยงf", "ยงf", "ยงc", "ยง4"]), + tropical: createMultiDigitColorScheme(["ยงe", "ยง9", "ยง6", "ยง3", "ยงc", "ยง1"]), + sugar_crash: createMultiDigitColorScheme(["ยงf", "ยงe", "ยงc", "ยงd", "ยงb", "ยงf"]), + ultraviolence: createMultiDigitColorScheme(["ยง2", "ยงa", "ยงf", "ยงf", "ยงd", "ยง5"]), } satisfies Record; /** @@ -383,7 +386,7 @@ const PRESTIGE_SCHEMES: { req: number; scheme: keyof typeof SCHEME_MAP }[] = [ { req: 260, scheme: "bulb_prestige" }, { req: 270, scheme: "twilight_prestige" }, { req: 280, scheme: "natural_prestige" }, - { req: 290, scheme: "icile_prestige" }, + { req: 290, scheme: "icicle_prestige" }, { req: 300, scheme: "mythic_iii_prestige" }, { req: 310, scheme: "graphite_prestige" }, { req: 320, scheme: "punk_prestige" }, From 155f89818cee0568f50f1ce1fe26e20f2813f201 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 18:50:35 -0400 Subject: [PATCH 19/29] chore(deps): update pnpm/action-setup action to v6 (#885) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ba9e9aac2..f1ef6f63b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: filter: blob:none - name: Setup pnpm - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 + uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6 - name: Install node.js v24 uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 From 1c0b240fdc3fec5b9010b33d003ceaac868a3179 Mon Sep 17 00:00:00 2001 From: jacobk999 Date: Mon, 8 Jun 2026 20:10:46 -0400 Subject: [PATCH 20/29] chore: update lockfile --- pnpm-lock.yaml | 147 +++++++++++++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 59 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03e8e2a0f..9da523cdc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 0.53.0 oxlint: specifier: ^1.68.0 - version: 1.68.0 + version: 1.68.0(oxlint-tsgolint@0.23.0) pm2: specifier: ^6.0.8 version: 6.0.8 @@ -435,7 +435,7 @@ importers: version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) minecraft-protocol: specifier: ^1.61.0 - version: 1.61.0 + version: 1.66.2 mongoose: specifier: ^8.5.2 version: 8.18.0(socks@2.8.7) @@ -443,7 +443,7 @@ importers: assets/private: dependencies: skia-canvas: - specifier: 3.0.8 + specifier: ^3.0.8 version: 3.0.8 stackblur-canvas: specifier: ^2.7.0 @@ -2146,6 +2146,36 @@ packages: cpu: [x64] os: [win32] + '@oxlint-tsgolint/darwin-arm64@0.23.0': + resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.23.0': + resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.23.0': + resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.23.0': + resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.23.0': + resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.23.0': + resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==} + cpu: [x64] + os: [win32] + '@oxlint/binding-android-arm-eabi@1.68.0': resolution: {integrity: sha512-wEdsIspexXLLMCPAEOcCuFLMt6aE3AzTuA/nQKLPRnoJ+EQTturmGheDkhHuuVHx0GbutjQ3JKmEn+Gz6Ag28Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3171,11 +3201,9 @@ packages: '@vitest/utils@4.1.8': resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} - '@xboxreplay/errors@0.1.0': - resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} - - '@xboxreplay/xboxlive-auth@3.3.3': - resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} + '@xboxreplay/xboxlive-auth@5.1.0': + resolution: {integrity: sha512-UngHHsehZbiTjyyNmo8HvdoUDKMID1U9uVfrpFWUK/2UxPuVTKy5n+CzZQ3S488sW5vOhgh0lHqqynT8ouwgvw==} + engines: {node: '>=16.0.0'} '@xhmikosr/archive-type@8.0.1': resolution: {integrity: sha512-toXuiWChyfOpEiCPsIw6HGHaNji5LVkvB6EREL548vGWr+hGaehwxG4LzN20vm9aGFXwnA/Jty8yW2/SmV+1zQ==} @@ -3249,9 +3277,6 @@ packages: ajv: optional: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -3333,9 +3358,6 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} @@ -4547,8 +4569,8 @@ packages: minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - minecraft-protocol@1.61.0: - resolution: {integrity: sha512-LZgcsdC88HZtuEYve7YENYvO6Xhe80Mf1rYLgz1frkMWAHWSSXfrplWoNKkKYcdVGM4Azc99NvbFjZdSDu4yKg==} + minecraft-protocol@1.66.2: + resolution: {integrity: sha512-keY1IY1E2AeurcekCfcXrg0TDbykGVFiMe1E4wR8QkNtQRieNwfr2xaF3g3vT9ChkwzvENqp3jxgmtFCKSUKPg==} engines: {node: '>=22'} minimatch@10.0.3: @@ -4778,6 +4800,10 @@ packages: vite-plus: optional: true + oxlint-tsgolint@0.23.0: + resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==} + hasBin: true + oxlint@1.68.0: resolution: {integrity: sha512-dXcbq+xsmLrMy6T8d0euf3IYUfLmjHIE11pOxiUSi5LHkFZaYPv568R6sEjcavVpUxoaQe66UBuK4HEi74NxpA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4936,8 +4962,8 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - prismarine-auth@2.7.0: - resolution: {integrity: sha512-L8wTF6sdtnN6hViPNy+Nx39a8iQBwR5iO92AWCiym5cSXp/92pmnuwnTdcmNDWyqq6zY4hbibVGYhgLA1Ox8sQ==} + prismarine-auth@3.1.1: + resolution: {integrity: sha512-NuNrMGZdoigFKsvi1ZZgAEvNYNuE5qe6lo/tw+bqeNbkhpjHC0u1JNxLEujnfqduXI18e19PvUtWNMDl/gH7yw==} prismarine-biome@1.3.0: resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} @@ -6998,6 +7024,24 @@ snapshots: '@oxfmt/binding-win32-x64-msvc@0.53.0': optional: true + '@oxlint-tsgolint/darwin-arm64@0.23.0': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.23.0': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.23.0': + optional: true + + '@oxlint-tsgolint/linux-x64@0.23.0': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.23.0': + optional: true + + '@oxlint-tsgolint/win32-x64@0.23.0': + optional: true + '@oxlint/binding-android-arm-eabi@1.68.0': optional: true @@ -7864,14 +7908,7 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@xboxreplay/errors@0.1.0': {} - - '@xboxreplay/xboxlive-auth@3.3.3(debug@4.4.1)': - dependencies: - '@xboxreplay/errors': 0.1.0 - axios: 0.21.4(debug@4.4.1) - transitivePeerDependencies: - - debug + '@xboxreplay/xboxlive-auth@5.1.0': {} '@xhmikosr/archive-type@8.0.1': dependencies: @@ -7987,13 +8024,6 @@ snapshots: optionalDependencies: ajv: 8.17.1 - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 @@ -8072,15 +8102,9 @@ snapshots: '@fastify/error': 4.2.0 fastq: 1.19.1 - axios@0.21.4(debug@4.4.1): - dependencies: - follow-redirects: 1.15.11(debug@4.4.1) - transitivePeerDependencies: - - debug - axios@1.11.0: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.15.11(debug@4.3.7) form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -8726,16 +8750,10 @@ snapshots: flatted@3.4.2: {} - follow-redirects@1.15.11: {} - follow-redirects@1.15.11(debug@4.3.7): optionalDependencies: debug: 4.3.7 - follow-redirects@1.15.11(debug@4.4.1): - optionalDependencies: - debug: 4.4.1 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -8896,7 +8914,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9072,7 +9090,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.2 + semver: 7.8.1 jwa@1.4.2: dependencies: @@ -9264,20 +9282,20 @@ snapshots: minecraft-folder-path@1.2.0: {} - minecraft-protocol@1.61.0: + minecraft-protocol@1.66.2: dependencies: '@types/node-rsa': 1.1.4 '@types/readable-stream': 4.0.21 aes-js: 3.1.2 buffer-equal: 1.0.1 - debug: 4.4.1 + debug: 4.4.3 endian-toggle: 0.0.0 lodash.merge: 4.6.2 minecraft-data: 3.93.0 minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 - prismarine-auth: 2.7.0 + prismarine-auth: 3.1.1 prismarine-chat: 1.11.0 prismarine-nbt: 2.7.0 prismarine-realms: 1.3.2 @@ -9495,7 +9513,17 @@ snapshots: '@oxfmt/binding-win32-ia32-msvc': 0.53.0 '@oxfmt/binding-win32-x64-msvc': 0.53.0 - oxlint@1.68.0: + oxlint-tsgolint@0.23.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.23.0 + '@oxlint-tsgolint/darwin-x64': 0.23.0 + '@oxlint-tsgolint/linux-arm64': 0.23.0 + '@oxlint-tsgolint/linux-x64': 0.23.0 + '@oxlint-tsgolint/win32-arm64': 0.23.0 + '@oxlint-tsgolint/win32-x64': 0.23.0 + optional: true + + oxlint@1.68.0(oxlint-tsgolint@0.23.0): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.68.0 '@oxlint/binding-android-arm64': 1.68.0 @@ -9516,6 +9544,7 @@ snapshots: '@oxlint/binding-win32-arm64-msvc': 1.68.0 '@oxlint/binding-win32-ia32-msvc': 1.68.0 '@oxlint/binding-win32-x64-msvc': 1.68.0 + oxlint-tsgolint: 0.23.0 p-cancelable@4.0.1: {} @@ -9712,11 +9741,11 @@ snapshots: dependencies: parse-ms: 4.0.0 - prismarine-auth@2.7.0: + prismarine-auth@3.1.1: dependencies: '@azure/msal-node': 2.16.2 - '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.4.1) - debug: 4.4.1 + '@xboxreplay/xboxlive-auth': 5.1.0 + debug: 4.4.3 smart-buffer: 4.2.0 uuid-1345: 1.0.2 transitivePeerDependencies: @@ -9753,7 +9782,7 @@ snapshots: prismarine-realms@1.3.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -9777,7 +9806,7 @@ snapshots: protodef-validator@1.4.0: dependencies: - ajv: 6.12.6 + ajv: 6.15.0 protodef@1.19.0: dependencies: @@ -9879,7 +9908,7 @@ snapshots: require-in-the-middle@5.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -10050,7 +10079,7 @@ snapshots: skia-canvas@3.0.8: dependencies: detect-libc: 2.1.2 - follow-redirects: 1.15.11 + follow-redirects: 1.15.11(debug@4.3.7) https-proxy-agent: 7.0.6 string-split-by: 1.0.0 transitivePeerDependencies: From 9df3916519f13c1fb22b1048205c04c3804023fc Mon Sep 17 00:00:00 2001 From: Jacob Koshy <42344274+jacobk999@users.noreply.github.com> Date: Mon, 8 Jun 2026 20:26:32 -0400 Subject: [PATCH 21/29] fix(discord): import event handlers from correct file path (#888) --- packages/discord/src/event/event.loader.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/discord/src/event/event.loader.ts b/packages/discord/src/event/event.loader.ts index d765d3b86..9f1a683a0 100644 --- a/packages/discord/src/event/event.loader.ts +++ b/packages/discord/src/event/event.loader.ts @@ -14,13 +14,16 @@ import { WebsocketShard } from "tiny-discord"; import { readdir } from "node:fs/promises"; import { statSync } from "node:fs"; import { pathToFileURL } from "node:url"; +import { join } from "node:path"; const logger = new Logger("EventLoader"); export async function loadEvents(websocket: WebsocketShard, dir: string) { const files = await getEventFileUrls(dir); const events = await Promise.all(files.map(importEvent)); - const eventsMap = new Map>(events.flat().map((event) => [event.event, event])); + const eventsMap = new Map>( + events.flat().map((event) => [event.event, event]), + ); websocket.on("event", (event) => { const listener = eventsMap.get(event.t as GatewayDispatchEvents); @@ -56,12 +59,12 @@ async function getEventFileUrls(dir: string): Promise { await Promise.all( files.map(async (file) => { - const path = `${dir}/${file}`; + const path = join(dir, file); if (statSync(path).isDirectory()) { toLoad.push(...(await getEventFileUrls(path))); } else if (file.endsWith(".event.js")) { - toLoad.push(pathToFileURL(file).href); + toLoad.push(pathToFileURL(path).href); } }), ); From bee79aca567101715ba357ab9a2f7a28edcdd203 Mon Sep 17 00:00:00 2001 From: jacobk999 Date: Mon, 8 Jun 2026 20:35:11 -0400 Subject: [PATCH 22/29] chore: pin minecraft-protocol to 1.61.0 --- apps/verify-server/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/verify-server/package.json b/apps/verify-server/package.json index 5503fdbc0..9d16b078c 100644 --- a/apps/verify-server/package.json +++ b/apps/verify-server/package.json @@ -19,7 +19,7 @@ "@statsify/util": "workspace:^", "@swc/helpers": "^0.5.23", "@typegoose/typegoose": "^12.6.0", - "minecraft-protocol": "^1.61.0", + "minecraft-protocol": "1.61.0", "mongoose": "^8.5.2" } } From 98d9f50080abb3548fcf4260c04012267e283952 Mon Sep 17 00:00:00 2001 From: jacobk999 Date: Mon, 8 Jun 2026 20:35:53 -0400 Subject: [PATCH 23/29] chore(deploy): install node modules with frozen lockfile --- .github/workflows/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c91ec0960..c47da378a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,7 @@ name: Deploy on: push: tags: - - "v*" + - "v*" workflow_dispatch: permissions: @@ -22,7 +22,7 @@ jobs: submodules: recursive - name: Install dependencies - run: pnpm install --force + run: pnpm install --frozen-lockfile - name: Build Code run: pnpm scripts purge --dist && pnpm build --force From 7947a677ee43ad60c90e8646eddcf223d8e7c9ed Mon Sep 17 00:00:00 2001 From: jacobk999 Date: Mon, 8 Jun 2026 20:37:05 -0400 Subject: [PATCH 24/29] chore: update lockfile --- pnpm-lock.yaml | 56 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9da523cdc..183491aaa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -434,8 +434,8 @@ importers: specifier: ^12.6.0 version: 12.19.0(mongoose@8.18.0(socks@2.8.7)) minecraft-protocol: - specifier: ^1.61.0 - version: 1.66.2 + specifier: 1.61.0 + version: 1.61.0 mongoose: specifier: ^8.5.2 version: 8.18.0(socks@2.8.7) @@ -3201,9 +3201,11 @@ packages: '@vitest/utils@4.1.8': resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} - '@xboxreplay/xboxlive-auth@5.1.0': - resolution: {integrity: sha512-UngHHsehZbiTjyyNmo8HvdoUDKMID1U9uVfrpFWUK/2UxPuVTKy5n+CzZQ3S488sW5vOhgh0lHqqynT8ouwgvw==} - engines: {node: '>=16.0.0'} + '@xboxreplay/errors@0.1.0': + resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} + + '@xboxreplay/xboxlive-auth@3.3.3': + resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} '@xhmikosr/archive-type@8.0.1': resolution: {integrity: sha512-toXuiWChyfOpEiCPsIw6HGHaNji5LVkvB6EREL548vGWr+hGaehwxG4LzN20vm9aGFXwnA/Jty8yW2/SmV+1zQ==} @@ -3358,6 +3360,9 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} @@ -4569,8 +4574,8 @@ packages: minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - minecraft-protocol@1.66.2: - resolution: {integrity: sha512-keY1IY1E2AeurcekCfcXrg0TDbykGVFiMe1E4wR8QkNtQRieNwfr2xaF3g3vT9ChkwzvENqp3jxgmtFCKSUKPg==} + minecraft-protocol@1.61.0: + resolution: {integrity: sha512-LZgcsdC88HZtuEYve7YENYvO6Xhe80Mf1rYLgz1frkMWAHWSSXfrplWoNKkKYcdVGM4Azc99NvbFjZdSDu4yKg==} engines: {node: '>=22'} minimatch@10.0.3: @@ -4962,8 +4967,8 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - prismarine-auth@3.1.1: - resolution: {integrity: sha512-NuNrMGZdoigFKsvi1ZZgAEvNYNuE5qe6lo/tw+bqeNbkhpjHC0u1JNxLEujnfqduXI18e19PvUtWNMDl/gH7yw==} + prismarine-auth@2.7.0: + resolution: {integrity: sha512-L8wTF6sdtnN6hViPNy+Nx39a8iQBwR5iO92AWCiym5cSXp/92pmnuwnTdcmNDWyqq6zY4hbibVGYhgLA1Ox8sQ==} prismarine-biome@1.3.0: resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} @@ -7908,7 +7913,14 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@xboxreplay/xboxlive-auth@5.1.0': {} + '@xboxreplay/errors@0.1.0': {} + + '@xboxreplay/xboxlive-auth@3.3.3(debug@4.4.3)': + dependencies: + '@xboxreplay/errors': 0.1.0 + axios: 0.21.4(debug@4.4.3) + transitivePeerDependencies: + - debug '@xhmikosr/archive-type@8.0.1': dependencies: @@ -8102,9 +8114,15 @@ snapshots: '@fastify/error': 4.2.0 fastq: 1.19.1 + axios@0.21.4(debug@4.4.3): + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + transitivePeerDependencies: + - debug + axios@1.11.0: dependencies: - follow-redirects: 1.15.11(debug@4.3.7) + follow-redirects: 1.15.11 form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -8750,10 +8768,16 @@ snapshots: flatted@3.4.2: {} + follow-redirects@1.15.11: {} + follow-redirects@1.15.11(debug@4.3.7): optionalDependencies: debug: 4.3.7 + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -9282,7 +9306,7 @@ snapshots: minecraft-folder-path@1.2.0: {} - minecraft-protocol@1.66.2: + minecraft-protocol@1.61.0: dependencies: '@types/node-rsa': 1.1.4 '@types/readable-stream': 4.0.21 @@ -9295,7 +9319,7 @@ snapshots: minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 - prismarine-auth: 3.1.1 + prismarine-auth: 2.7.0 prismarine-chat: 1.11.0 prismarine-nbt: 2.7.0 prismarine-realms: 1.3.2 @@ -9741,10 +9765,10 @@ snapshots: dependencies: parse-ms: 4.0.0 - prismarine-auth@3.1.1: + prismarine-auth@2.7.0: dependencies: '@azure/msal-node': 2.16.2 - '@xboxreplay/xboxlive-auth': 5.1.0 + '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.4.3) debug: 4.4.3 smart-buffer: 4.2.0 uuid-1345: 1.0.2 @@ -10079,7 +10103,7 @@ snapshots: skia-canvas@3.0.8: dependencies: detect-libc: 2.1.2 - follow-redirects: 1.15.11(debug@4.3.7) + follow-redirects: 1.15.11 https-proxy-agent: 7.0.6 string-split-by: 1.0.0 transitivePeerDependencies: From ac1cd80d796da87c62d73d4f25d1d7b02ef23b67 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 9 Jun 2026 16:56:21 -0600 Subject: [PATCH 25/29] fix(bedwars): use proper field for level progression Co-authored-by: jacobk999 --- .../src/commands/bedwars/bedwars.profile.tsx | 2 +- apps/site/app/(home)/previews/bedwars.tsx | 2 +- packages/schemas/src/player/gamemodes/bedwars/index.ts | 10 +++------- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx b/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx index 123e7feb6..e680c86bc 100644 --- a/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx +++ b/apps/discord-bot/src/commands/bedwars/bedwars.profile.tsx @@ -71,7 +71,7 @@ export const BedWarsProfile = ({ t, label: t("stats.progression.exp"), progression: bedwars.progression, - currentLevel: bedwars.nextLevelFormatted, + currentLevel: bedwars.naturalLevelFormatted, nextLevel: bedwars.nextLevelFormatted, })}`} time={time} diff --git a/apps/site/app/(home)/previews/bedwars.tsx b/apps/site/app/(home)/previews/bedwars.tsx index 42199ac55..8577a6998 100644 --- a/apps/site/app/(home)/previews/bedwars.tsx +++ b/apps/site/app/(home)/previews/bedwars.tsx @@ -33,7 +33,7 @@ export function BedWarsPreview({ className }: { className?: string }) { label="Level" metric="EXP" progression={bedwars.progression} - currentLevel={bedwars.levelFormatted} + currentLevel={bedwars.naturalLevelFormatted} nextLevel={bedwars.nextLevelFormatted} /> diff --git a/packages/schemas/src/player/gamemodes/bedwars/index.ts b/packages/schemas/src/player/gamemodes/bedwars/index.ts index cde467c3a..69aa8947c 100644 --- a/packages/schemas/src/player/gamemodes/bedwars/index.ts +++ b/packages/schemas/src/player/gamemodes/bedwars/index.ts @@ -213,7 +213,7 @@ export class BedWars { }); this.levelFormatted = scheme({ - level: Math.floor(this.level), + level: flooredLevel, star, brackets, bold: false, @@ -221,12 +221,8 @@ export class BedWars { strikethrough: false, }); - this.naturalLevelFormatted = getIntendedFormattedLevel( - Math.floor(this.level), - ); - this.nextLevelFormatted = getIntendedFormattedLevel( - Math.floor(this.level) + 1, - ); + this.naturalLevelFormatted = getIntendedFormattedLevel(flooredLevel); + this.nextLevelFormatted = getIntendedFormattedLevel(flooredLevel + 1); let exp = this.exp; From 86584a59365ea91d22a88fae8471c75b129e0673 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 11 Jun 2026 18:10:05 -0600 Subject: [PATCH 26/29] fix(font-renderer): Add back &r (reset) formatting behavior (#891) --- packages/rendering/src/font/font-renderer.ts | 4 ++-- packages/rendering/tests/index.spec.tsx | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/rendering/src/font/font-renderer.ts b/packages/rendering/src/font/font-renderer.ts index 1dab011b4..087e14e20 100644 --- a/packages/rendering/src/font/font-renderer.ts +++ b/packages/rendering/src/font/font-renderer.ts @@ -129,7 +129,7 @@ export class FontRenderer { if (!text) return [{ ...defaultState, text: "" }]; - let state = defaultState; + let state = Object.assign({}, defaultState); const parts = (text.startsWith("ยง") ? text : `ยงf${text}`).split("ยง"); const nodes: TextNode[] = []; @@ -160,7 +160,7 @@ export class FontRenderer { if (matches) text = text.slice(matches[0].length); - Object.assign(state, effect); + state = Object.assign({}, state, effect); if (text.length === 0) continue; diff --git a/packages/rendering/tests/index.spec.tsx b/packages/rendering/tests/index.spec.tsx index 86a550210..b4ae04c7a 100644 --- a/packages/rendering/tests/index.spec.tsx +++ b/packages/rendering/tests/index.spec.tsx @@ -6,7 +6,7 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { createInstructions } from "../src/index.js"; +import { FontRenderer, createInstructions } from "../src/index.js"; import { expect, it, suite } from "vitest"; suite("createInstructions with no relative sizes", () => { @@ -156,3 +156,15 @@ suite("JSX Fragments", () => { expect(instructions.children?.length).toBe(2); }); }); + +suite("FontRenderer", () => { + it("resets formatting without inheriting mutated parser state", () => { + const renderer = new FontRenderer(false); + const nodes = renderer.lex("ยงl[100]ยงr Player"); + + expect(nodes).toEqual([ + expect.objectContaining({ text: "[100]", bold: true }), + expect.objectContaining({ text: " Player", bold: false }), + ]); + }); +}); From e9aee2622d020836b175ade5402fb932836a959d Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 13 Jun 2026 17:00:51 -0600 Subject: [PATCH 27/29] fix(i18n-loader): only load language files/folders (#897) --- .../src/services/i18n-loader.service.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/discord/src/services/i18n-loader.service.ts b/packages/discord/src/services/i18n-loader.service.ts index f576166b3..ce10372d4 100644 --- a/packages/discord/src/services/i18n-loader.service.ts +++ b/packages/discord/src/services/i18n-loader.service.ts @@ -20,10 +20,18 @@ export class I18nLoaderService { private namespaces: string[] = []; public async init() { - this.languages = await readdir("../../locales"); - this.namespaces = (await readdir(`../../locales/${DEFAULT_LANGUAGE}/`)).map((p) => - p.replace(".json", "") - ); + const languageEntries = await readdir("../../locales", { withFileTypes: true }); + this.languages = languageEntries + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name); + + const namespaceEntries = await readdir(`../../locales/${DEFAULT_LANGUAGE}/`, { + withFileTypes: true, + }); + + this.namespaces = namespaceEntries + .filter((entry) => entry.isFile() && entry.name.endsWith(".json")) + .map((entry) => entry.name.replace(".json", "")); await i18next.use(Backend).init({ backend: { @@ -67,4 +75,4 @@ function format(value: any, format?: string | undefined, lng?: string): string { } return value; -} \ No newline at end of file +} From 2bb2648eb232b8f4be6b3e081b112a85002549e3 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 15 Jun 2026 19:16:37 -0600 Subject: [PATCH 28/29] fix(discord-bot): use statsify skin API for minecraft head URLs (#865) Co-authored-by: jacobk999 --- .../commands/minecraft/available.command.ts | 26 +++++++++++-------- .../src/commands/minecraft/uuid.command.ts | 8 +++--- .../src/commands/socials/socials.command.ts | 8 +++--- apps/discord-bot/src/lib/minecraft-head.ts | 22 +++++++++++++--- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/apps/discord-bot/src/commands/minecraft/available.command.ts b/apps/discord-bot/src/commands/minecraft/available.command.ts index 9d029aa04..73e4e736c 100644 --- a/apps/discord-bot/src/commands/minecraft/available.command.ts +++ b/apps/discord-bot/src/commands/minecraft/available.command.ts @@ -13,7 +13,7 @@ import { EmbedBuilder, MojangPlayerArgument, } from "@statsify/discord"; -import { minecraftHeadUrl } from "#lib/minecraft-head"; +import { minecraftHeadAttachment } from "#lib/minecraft-head"; @Command({ description: (t) => t("commands.available"), @@ -50,6 +50,8 @@ export class AvailableCommand { .catch(() => undefined); if (uuid) { + const head = await minecraftHeadAttachment(this.apiService, uuid); + base .field((t) => t("minecraft.uuid"), `\`${uuid}\``) .field( @@ -61,18 +63,20 @@ export class AvailableCommand { (t) => `\`${t("minecraft.unavailable")}\`` ) .color(0xf7_c4_6c) - .thumbnail(minecraftHeadUrl(uuid)); - } else { - base - .field("NameMC", `[\`Here\`](https://namemc.com/profile/${name})`) - .field( - (t) => t("stats.status"), - (t) => `\`${t("minecraft.available")}*\`` - ) - .footer((t) => `*${t("embeds.available.blocked")}`) - .color(0x00_a2_8a); + .thumbnail(`attachment://${head.name}`); + + return { embeds: [base], files: [head] }; } + base + .field("NameMC", `[\`Here\`](https://namemc.com/profile/${name})`) + .field( + (t) => t("stats.status"), + (t) => `\`${t("minecraft.available")}*\`` + ) + .footer((t) => `*${t("embeds.available.blocked")}`) + .color(0x00_a2_8a); + return { embeds: [base] }; } } diff --git a/apps/discord-bot/src/commands/minecraft/uuid.command.ts b/apps/discord-bot/src/commands/minecraft/uuid.command.ts index 46f643f92..75eab2975 100644 --- a/apps/discord-bot/src/commands/minecraft/uuid.command.ts +++ b/apps/discord-bot/src/commands/minecraft/uuid.command.ts @@ -14,7 +14,7 @@ import { MojangPlayerArgument, } from "@statsify/discord"; import { STATUS_COLORS } from "@statsify/logger"; -import { minecraftHeadUrl } from "#lib/minecraft-head"; +import { minecraftHeadAttachment } from "#lib/minecraft-head"; @Command({ description: (t) => t("commands.uuid"), args: [new MojangPlayerArgument()] }) export class UUIDCommand { @@ -30,13 +30,15 @@ export class UUIDCommand { const dashedUuid = `${uuid.slice(0, 8)}-${uuid.slice(8, 12)}-${uuid.slice(12, 16)}-${uuid.slice(16, 20)}-${uuid.slice(20)}`; + const head = await minecraftHeadAttachment(this.apiService, uuid); + const embed = new EmbedBuilder() .field((t) => t("minecraft.username"), `\`${username}\``) .field((t) => t("minecraft.uuid"), `\`${dashedUuid}\``) .field((t) => t("minecraft.trimmedUUID"), `\`${uuid}\``) .color(STATUS_COLORS.info) - .thumbnail(minecraftHeadUrl(uuid)); + .thumbnail(`attachment://${head.name}`); - return { embeds: [embed] }; + return { embeds: [embed], files: [head] }; } } diff --git a/apps/discord-bot/src/commands/socials/socials.command.ts b/apps/discord-bot/src/commands/socials/socials.command.ts index 198dc4933..63d5ac075 100644 --- a/apps/discord-bot/src/commands/socials/socials.command.ts +++ b/apps/discord-bot/src/commands/socials/socials.command.ts @@ -15,7 +15,7 @@ import { PlayerArgument, } from "@statsify/discord"; import { STATUS_COLORS } from "@statsify/logger"; -import { minecraftHeadUrl } from "#lib/minecraft-head"; +import { minecraftHeadAttachment } from "#lib/minecraft-head"; @Command({ description: (t) => t("commands.socials"), args: [PlayerArgument] }) export class SocialsCommand { @@ -29,10 +29,12 @@ export class SocialsCommand { user ); + const head = await minecraftHeadAttachment(this.apiService, uuid); + const embed = new EmbedBuilder() .title((t) => this.apiService.emojiDisplayName(t, displayName)) .author("Player Socials") - .thumbnail(minecraftHeadUrl(uuid)) + .thumbnail(`attachment://${head.name}`) .color(STATUS_COLORS.info) .field( (t) => `${t("emojis:socials.embed.discord")} Discord`, @@ -63,7 +65,7 @@ export class SocialsCommand { this.formatSocial(socials.youtube) ); - return { embeds: [embed] }; + return { embeds: [embed], files: [head] }; } private formatSocial(social?: string, link = true) { diff --git a/apps/discord-bot/src/lib/minecraft-head.ts b/apps/discord-bot/src/lib/minecraft-head.ts index d327282c3..52e65c2f5 100644 --- a/apps/discord-bot/src/lib/minecraft-head.ts +++ b/apps/discord-bot/src/lib/minecraft-head.ts @@ -6,9 +6,23 @@ * https://github.com/Statsify/statsify/blob/main/LICENSE */ -import { randomUUID } from "node:crypto"; +import type { ApiService, InteractionAttachment } from "@statsify/discord"; +import { createCanvas } from "@statsify/rendering"; -export function minecraftHeadUrl(uuid: string) { - const dashlessUuid = uuid.replaceAll("-", ""); - return `https://crafatar.com/avatars/${dashlessUuid}?size=160&default=MHF_Steve&overlay&id=${randomUUID()}`; +export async function minecraftHeadAttachment( + apiService: ApiService, + uuid: string, + size = 160, +): Promise { + const head = await apiService.getPlayerHead(uuid, size); + + const canvas = createCanvas(size, size); + const ctx = canvas.getContext("2d"); + ctx.drawImage(head, 0, 0, size, size); + + return { + name: `${uuid}.png`, + data: await canvas.toBuffer("png"), + type: "image/png", + }; } From 52fa5a21877c3028f22c52779af4f5c0135383b1 Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 16 Jun 2026 04:49:29 -0600 Subject: [PATCH 29/29] refactor(leaderboard): improve handling of additional stats * Change return type of getAdditionalStats to allow null values * Update logic to return null for unknown entries instead of default object * Enhance leaderboard data mapping for better clarity --- apps/api/src/guild/guild.service.ts | 5 ++++- .../src/guild/leaderboards/guild-leaderboard.service.ts | 4 ++-- apps/api/src/leaderboards/leaderboard.service.ts | 9 ++++++--- .../player/leaderboards/player-leaderboard.service.ts | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/api/src/guild/guild.service.ts b/apps/api/src/guild/guild.service.ts index e81e74686..4fcb96a02 100644 --- a/apps/api/src/guild/guild.service.ts +++ b/apps/api/src/guild/guild.service.ts @@ -205,7 +205,10 @@ export class GuildService { .exec(); } - return await this.guildModel.deleteOne({ id: cachedGuild.id }).lean().exec(); + await Promise.all([ + this.guildModel.deleteOne({ id: cachedGuild.id }).lean().exec(), + this.guildLeaderboardService.addLeaderboards(Guild, serialize(Guild, flatten(cachedGuild)), "id", true), + ]); } private async getMemberName(member: GuildMember, cachedMember?: GuildMember) { diff --git a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts index 61f44fb88..629df63a8 100644 --- a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts +++ b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts @@ -49,7 +49,7 @@ export class GuildLeaderboardService extends LeaderboardService { protected async getAdditionalStats( ids: string[], fields: string[] - ): Promise { + ): Promise<(LeaderboardAdditionalStats | null)[]> { const selector = fields.reduce((acc, key) => { acc[key] = true; return acc; @@ -72,7 +72,7 @@ export class GuildLeaderboardService extends LeaderboardService { const guild = guildsById.get(id); if (!guild) { - return { name: "Unknown" } as LeaderboardAdditionalStats; + return null; } const additionalStats = flatten(guild) as LeaderboardAdditionalStats; diff --git a/apps/api/src/leaderboards/leaderboard.service.ts b/apps/api/src/leaderboards/leaderboard.service.ts index 2dc14f36d..1b3ff2325 100644 --- a/apps/api/src/leaderboards/leaderboard.service.ts +++ b/apps/api/src/leaderboards/leaderboard.service.ts @@ -145,8 +145,11 @@ export abstract class LeaderboardService { ) : []; - const data = leaderboard.map((doc, index) => { - const stats = additionalStats[index]; + const pairs = leaderboard + .map((doc, index) => ({ doc, stats: additionalStats[index] })) + .filter((pair): pair is { doc: typeof pair.doc; stats: LeaderboardAdditionalStats } => pair.stats !== null); + + const data = pairs.map(({ doc, stats }) => { if (extraDisplay) { const extraDisplayValue = stats[extraDisplay] ?? extraDisplayMetadata?.default; @@ -267,7 +270,7 @@ export abstract class LeaderboardService { protected abstract getAdditionalStats( ids: string[], fields: string[] - ): Promise; + ): Promise<(LeaderboardAdditionalStats | null)[]>; private async getLeaderboardFromRedis( constructor: Constructor, diff --git a/apps/api/src/player/leaderboards/player-leaderboard.service.ts b/apps/api/src/player/leaderboards/player-leaderboard.service.ts index 330885040..dc8309b19 100644 --- a/apps/api/src/player/leaderboards/player-leaderboard.service.ts +++ b/apps/api/src/player/leaderboards/player-leaderboard.service.ts @@ -48,7 +48,7 @@ export class PlayerLeaderboardService extends LeaderboardService { protected async getAdditionalStats( ids: string[], fields: string[] - ): Promise { + ): Promise<(LeaderboardAdditionalStats | null)[]> { const selector = fields.reduce((acc, key) => { acc[key] = true; return acc; @@ -71,7 +71,7 @@ export class PlayerLeaderboardService extends LeaderboardService { const player = playersById.get(id); if (!player) { - return { name: "Unknown" } as LeaderboardAdditionalStats; + return null; } const additionalStats = flatten(player) as LeaderboardAdditionalStats;